팩CC
PackCC| 개발자 | 요시다 아리히로 |
|---|---|
| 기록 위치 | C |
| 운영 체제 | 크로스 플랫폼 |
| 유형 | 파서 발생기 |
| 면허증 | MIT 면허증. |
| 웹사이트 | github |
PackCC는 C를 위한 파서 생성기다.주요 특징은 다음과 같다.
- PEG에 설명된 문법에서 C 문자로 파서를 생성한다.
- 팩래트 파싱으로 파서 효율성이 뛰어나며,
- 직접 및 간접 왼쪽-재귀 문법 규칙 지원,
- 스레드 세이프 및 리엔트런트 파서를 생성한다.
- 단일 컴팩트 소스 파일로 구성된다.
출력 파서의 문법은 PEG(파싱 표현 문법)에서 설명할 수 있다.PEG는 하향식 파싱 언어로 정규 표현 문법과 유사하다.Yacc의 언어처럼 상향식 구문 분석 언어와 비교하면 PEG는 훨씬 직관적이어서 모호할 수 없다.PEG는 토큰화가 별도의 단계가 될 필요가 없으며 토큰화 규칙은 다른 문법 규칙과 동일한 방식으로 작성될 수 있다.
생성된 파서는 팩래트 파싱으로 입력을 매우 효율적으로 파싱할 수 있다.팩래트 파싱은 메모화를 사용하여 가속되는 재귀 강하 파싱 알고리즘이다.팩래트 파싱을 사용하면 모든 입력을 선형 시간으로 구문 분석할 수 있다.그러나 그것이 없다면, 결과 파서는 무제한으로 보이는 능력 때문에 최악의 경우 기하급수적인 시간 성능을 보일 수 있다.
일반 팩래트 파서들과 달리 팩CC는 직간접적인 좌회귀 문법 규칙을 지원할 수 있다.[1]이것은 문법 규칙을 훨씬 더 직관적으로 만든다.
생성된 코드는 최대한 미화하고 이해하기 쉽다.사실, 그것은 많은 goto 문구를 사용하지만, 제어 흐름은 몇몇 다른 파서 발전기에 의해 생성된 goto 스파게티 폭풍보다 훨씬 추적 가능하다.
PackCC 자체는 MIT 라이센스 하에 있지만 생성된 코드는 어떤 라이센스에서도 배포될 수 있거나 독점 소프트웨어에서 사용될 수 있다.
입력 파일 예
데스크톱 계산기.왼쪽-재귀 문법 규칙이 포함되어 있다는 점에 유의하십시오.
%접두사를 붙이다 "계산" 성명서 <- _ e:표현 _ EOL { 활자화하다("답변=%d\n", e); } / ( !EOL . )* EOL { 활자화하다("error\n"); } 표현 <- e:용어 { $ = e; } 용어 <- l:용어 _ '+' _ r:요소 { $ = l + r; } / l:용어 _ '-' _ r:요소 { $ = l - r; } / e:요소 { $ = e; } 요소 <- l:요소 _ '*' _ r:단위의 { $ = l * r; } / l:요소 _ '/' _ r:단위의 { $ = l / r; } / e:단위의 { $ = e; } 단위의 <- '+' _ e:단위의 { $ = +e; } / '-' _ e:단위의 { $ = -e; } / e:일차적 { $ = e; } 일차적 <- < [0-9]+ > { $ = 아토이($1); } / '(' _ e:표현 _ ')' { $ = e; } _ <- [ \t]* EOL <- '\n' / '\r\n' / '\r' / ';' %% 인트로 본래의() { calc_calc_t *ctx = calc_create(NULL); 하는 동안에 (calc_parse(ctx, NULL)); calc_properties(ctx); 돌아오다 0; } 메모들
- ^ A씨가 저술한 「Packrat Parsers Can Support Left Reutursion」.워스, J. R. 더글라스, T.밀슈타인