2010-12-16 2 views
2

이 작은 yacc 프로그램은 어떻게 작동합니까?yacc은 어떻게 작동합니까? 섹션별로 섹션을 설명 할 수 있습니까?

는 내가 지금까지 알고

%{...%}는 정의 %% ... %% 규칙입니다,하지만 어떻게 규칙을 해석하는? %% 다음에 및 stuff가 함수 정의입니다. %}%% 사이에 %token INTEGER 섹션의 내용은 무엇입니까?

%{ 
#include <stdlib.h> 
int yylex(void); 
void yyerror(char *); 
%} 
%token INTEGER 
%left '+' '-' 
%left '*' '/' 
%% 
program: 
program expr '\n' { printf("%d\n", $2); } 
| 
; 
expr: 
INTEGER { $$ = $1; } 
| expr '*' expr { $$ = $1 * $3; } 
| expr '/' expr { $$ = $1/$3; } 
| expr '+' expr { $$ = $1 + $3; } 
| expr '-' expr { $$ = $1 - $3; } 
; 
%% 
void yyerror(char *s) { 
printf("%s\n", s); 
} 
int main(void) { 
yyparse(); 
return 0; 
} 

UPDATE

이해가 안 무엇 :

program: 
program expr '\n' { printf("%d\n", $2); } 
| 
; 

답변

1

expr의 : 수단, expr이로 구분되는 다음 옵션 중 하나입니다 | 이하. INTEGER 토큰으로 볼 수 있으면 첫 번째 인수를 취합니다. expr 다음에 '*'문자 다음에 expr이 오면 두 번째 옵션을 취합니다. $$는 기본 반환 값이고 $ 1은 첫 번째 토큰이고 $ 2는 두 번째 토큰입니다.

따라서 5 + 6을 구문 분석하는 경우 expr '+'expr로 간주되므로 4 번째 정의가 적용됩니다. expr로 11을 반환하므로 INTEGER 토큰으로 11을 매치하고 11을 반환 값으로 할당합니다.

우리가 프로그램 토큰을 5 + 6으로 파싱했다면 프로그램 11을 얻고 프로그램 expr 규칙을 사용하여 화면에 인쇄 할 c 코드를 호출합니다.

왼쪽은 연산자가 왼쪽 연관임을 의미합니다. a + b + c = (a + b) + c 에서처럼. 같은 줄에있는 사업자는 대통령이 같고 그 아래에있는 사업자는 회장이 낮습니다.

나는 잠시 동안 yacc을 사용하지 않았기 때문에 완전히 틀렸다고 말해도됩니다.

UPDATE :

은 yacc는 C 코드를 생성, 그래서 당신이 직접 자신의 코드를 넣을 수 있습니다. 따라서 파싱 할 때 "프로그램 expr"을 보면 생성 된 코드에 {} 안의 코드를 직접 입력 할 수 있습니다.

1

즉 컴파일러의 총 5 단계가 있습니다 :

  1. 어휘 분석
  2. 구문 분석
  3. 의미 분석 (중간 코드 생성 - 옵션)
  4. 코드 최적화
  5. 코드 생성

렉스와 YACC (아직 또 다른 컴파일러 컴파일러)는 프로그램을 생성하는 유닉스 유틸리티이다. 주어진 프로그램의 단어를 매치시키는 역할을하며 매치가 발견되면 값을 yylex에 저장하고 토큰 형태로 렉서에게 리턴한다. yacc은 기본적으로 토큰을 가져 와서 프로그램 구문을 검사하기 위해 트리를 만듭니다. 토큰은 lexer에 의해 빌드되며 yacc 사양 파일에서 선언됩니다. y.tab.h 파일은 lex 프로그램에 포함되어 있습니다.

위의 프로그램에는 lexer가 반환하는 토큰 INTEGER가 포함되어 있습니다. yacc 프로그램은 시작 상태를 포함해야합니다 ... "프로그램"은 모든 프로그램이 최소한 하나의 시작 상태를 포함해야하는 시작 상태입니다 ... yacc 규칙은 {program} 형식 규칙에 있습니다. 위의 프로그램 "program expr"\ n ' "은 프로그램이 표현식을 포함하고 개행 문자를 포함 할 수 있음을 나타냅니다. ie 5 + 4 'enter key'는 expr '+'expr을 작성한 표현식을 나타냅니다. 여기 expr은이 경우 5와 4의 정수가 될 수 있으므로 expr을 작성하여이 규칙을 포함시킵니다. INTEGER .... 추가 또는 다른 역할을 위해 표현의 LHS는 $$ 및 RHS에 의해 $ 1, $ 2, $ 3 ... 등으로 표현됩니다. on.exce expr : expr '+'expr {$$ = $ 1 + $ 3;} .... ..

+0

형식이 더 좋은 경우 명확 해 보이지만 상당히 좋은 답변 인 것 같습니다. 나는 당신이 썼던 것을 변경하지 않고 지금 할 수있는 것들을 정리했지만, http://stackoverflow.com/editing-help도 살펴보고 싶을 것이다. – Flexo

관련 문제