2014-02-24 2 views
2

저는 통역사를 쓰려고하는데이 과정의 이론적 토대를 이해하는 데 어려움이 있습니다.문법 규칙 (구문 분석)이란 무엇입니까?

첫 번째 부분은 문자열을 유효한 토큰 목록으로 나눠서 구문 분석기를 사용하여이 토큰 문자열에 해당하는 추상 구문 트리를 생성하는 것입니다. 그러나 구문 분석 규칙은 구문 분석 규칙을 사용하여 작성되므로 이해하기 어려울 수 있습니다.

문법 규칙은 분명히 결과 추상 문법 트리의 규칙을 만드는 데 사용되지만이 중간 단계가 정확히 작동하는지는 분명합니다. 문자열과 문자 또는 토큰의 특정 목록에 패턴이 일치합니까? . .?

모든 종류의 직감이나 설명을 환영합니다. 감사!

답변

1

인터넷에서 lex/yacc 예제 및 자습서를 검색하십시오. 하고 학습. C로 프로그래밍 할 수 있어야합니다.

http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

렉스는 정규식 기반 사양에서 C 코드를 생성하는 대 유닉스 렉서이다. yacc는 구문 트리를 만들기위한 고대 유닉스 파서입니다. 그것은 C 코드도 생성합니다.

현대적인 GNU 버전의 도구는 flex 및 bison이라고합니다.

다음은 계산기의 yacc 코드의 핵심입니다. 그것은 토큰으로부터 얼마나 높은 수준의 구조가 만들어 지는지를 보여주고 그러한 구조가 발생할 때 무엇을해야 하는지를 보여줍니다.

%% 
list : // empty 
    | list stm '\n'   { print(); } 
    | list cmd '\n'   { print(); } 
    | list cmd stm '\n'  { print(); } 
    | list stm cmd '\n'  { print(); } 
    | list cmd stm cmd '\n' { print(); } 
    | list error '\n'  { yyerrok; print(); } 
    ; 
cmd : COMMAND    { commands[$1](); } 
    ; 
stm : expr     { output = $1; outputPush(); } 
    | VAR '=' expr   { vars_set($1, &$3); } 
    ; 
expr :      { outputGet(); $$ = output; } 
    | '_'     { outputGet(); $$ = output; } 
    | '(' expr ')'   { $$ = $2; } 
    | expr OPADD expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | expr OPMUL expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | expr OPPOW expr  { $$ = tNumOpIn ($1, $2, $3); } 
    | OPPRE expr   { $$ = tNumOpPre($1, $2); } 
    | VAR     { if (vars_get($1,&$$)) $$=output; } 
    | NUMBER    { $$ = $1; } 
    ; 
%%