2012-02-16 2 views
1

필자는 여기 앉아서 YACC가 lex 파일과 함께 작동하는 방법에 대한 자습서를 읽으려고했지만 필자는 내 머리를 감쌀 수 있는지 확신하지 못했습니다. 실제 입력 파일을 읽고 추가 또는 뺄셈과 같은 함수가 올바른 형식인지 여부를 확인하는 것이지만 이것이 어떻게 작동하는지 이해합니다. 필자는 Lex 파일의 작동 방식을 이해하고 파일에 들어있는 내용을 기반으로 정의 된 변수를 반환하는 파일을 생성했습니다.Yacc/Lexer : 어떻게 작동하나요?

매우 간단한 프로그램이 있다면이 테스트 프로그래밍 언어의 첫 번째 줄을 어떻게 분석해야합니까? "프로그램"은 "is", "var", "begin", "+", "print", ";", ","end "뿐만 아니라 lex에 정의 된 값이라고 가정합시다.

처음 몇 줄을 읽으려면 yacc 파일을 어떻게 작성해야합니까?

테스트 파일 :

program xyz is 
var a, b, c 
begin 
    a = 2; 
    b = 3; 
    c = a + b; 
    print c 
end 

Yaccer.y 내가 그러나 내가 유형을 사용하는 방법에 대해 이동하는 방법을 잘 모르겠습니다, 방정식에 대해 정의 된 몇 % 유형이있을 필요가 알고

%token EOFNUM  0 
%token SEMINUM  1 
%token LPARENNUM 2 
%token RPARENNUM 3 
%token ICONSTNUM 4 
%token BEGINNUM  5 
%token PROGRAMNUM 6 
%token MINUSNUM  7 
%token TIMESNUM  8 
%token VARNUM  9 
%token COMMANUM  10 
%token IDNUM  11 
%token ENDNUM  12 
%token ISNUM  13 
%token PLUSNUM  14 
%token DIVNUM  15 
%token PRINTNUM  16 
%token EQUALNUM  17 

%left '+' '-' 
%left '*' '/' 

%% 


%% 

#include "lex.yy.c" 
#include <stdio.h> 

yyerror(str) 
char *str; 
{ printf("yyerror: %s at line %d\n", str, yyline); } 

main() { 
    if (!yyparse()) { printf("accept\n");} 
    else { printf("reject\n"); } 
} 

% left 선언과 함께, 또는 이것이 올바른 경우에도 마찬가지입니다. 나는 또한 첫 번째 라인을 분석하는 방법에 대해 혼란 스럽다.

답변

1

lex 파일과 yacc 파일을 모두 만들어야합니다. lex 파일에는 문법에 포함 된 모든 토큰 유형에 대한 개별 토큰을 정의합니다. 그런 다음 yacc에 적합한 BNF 형식으로 문법을 구성합니다. 귀하의 간단한 입력을 위해 이것은 약간 보입니다. 나는 그것이 print 문장 뒤에 ;이 없으며 세미콜론이 필요한 문법이라고 가정합니다.

%token IDENTIFIER 
%token PROGRAM 
%token BEGIN 
%token END 
%token IS 
%token VAR 
%token PRINT 
%token NUMBER 

program 
statementlist 
statement 
printstatement 
assignstatement 
expression 

%% 

program : PROGRAM IDENTIFIER IS VAR variables BEGIN statementlist END; 

variables : IDENTIFIER | variables ',' IDENTIFIER; 

statementlist : statement | statementlist statement; 

statement : assignstatement | printstatement; 

printstatement : PRINT IDENTIFIER ';'; 

assignstatement : IDENTIFIER '=' expression ';'; 

expression : value | expression '+' value; 

value : NUMBER | IDENTIFIER; 

%% 

%left%right는 연관성 수정하고, 정말 귀하의 경우 필요하지 않습니다. +과 동일한 우선 순위를 사용하여 -을 지원하려면이 필터가 필요합니다. 글쎄, 기술적으로는별로 필요하지 않지만 문법을 이해하기 쉽게 만든다.

Yacc은 이해하기 쉽지 않으며 주제에 대한 자습서를 권장합니다. 규칙은 매우 재귀 적으로 자연 재귀가되며 작업 할 때 특정 사고 방식을 가져야합니다. 최상위 명령문부터 점진적으로 문법을 작성하는 것이 더 쉽습니다. 프로그램 시작을 인식하는 파서를 만들고 시작하면서 기능을 수행하십시오.

문법 테스트 및 확인에 유용한 도구는 자바 스크립트 파서 생성기입니다. here

관련 문제