2010-08-05 6 views
1

기본 컴파일러에 대한 파서를 작성한 다음 서브 루틴 및 동적 메모리 할당을 포함하도록 확장합니다. 문법은 용서 부록 A에 정의되어있다. My Flex 스캐너 작동 - 테스트 파일을 실행하여 찾은 올바른 토큰을 모두 인쇄했습니다. 아래의 이상한 형식에 대해 죄송합니다. 필자의 들소와 이맥스에서의 flex 모드는 조금 엉성한 것이므로 수정하기 전까지는 C 모드를 사용하고있다.구문 오류, 예상치 못한 TRUE, 예상 '{'

%{ 
#include <stdio.h> 

#define YYERROR_VERBOSE 1066 

    extern FILE* yyin ; 
    extern int yylineno ; 
    extern char* yytext ; 
    extern int yylex() ; 
    extern void yyerror() ; 
    int YYDEBUG = 1 ; 

%} 

/* Tokens */ 
%token AND BASIC BREAK DO ELSE EQ FALSE 
%token GREQ ID IF INDEX LEEQ MINUS NOEQ NUM OR REAL TEMP TRUE WHILE 

/* Grammar rules from Appendix A */ 
%% 
program: block { printf("Matched program\n") ; } 
; 

block: '{' decls stmts '}' { printf(" Matched block\n") ; } 
; 

decls: decls decl | 
; 

decl: type ID ';' 
; 

type: type '[' NUM ']' | BASIC 
; 

stmts: stmts stmt | 
; 

stmt: loc '=' bool ';' 
| IF '(' bool ')' stmt 
| IF '(' bool ')' stmt ELSE stmt 
| WHILE '(' bool ')' stmt 
| DO stmt WHILE '(' bool ')' ';' 
| BREAK ';' 
| block 
; 

loc: loc '[' bool ']' | ID 
; 

bool: bool OR join | join 
; 

join: join AND equality | equality 
; 

equality: equality EQ rel | equality NOEQ rel | rel 
; 

rel: expr '<' expr | expr LEEQ expr | expr GREQ expr | expr '>' expr | expr 
; 

expr: expr '+' term | expr '-' term | term 
; 

term: term '*' unary | term '/' unary | unary 
; 

unary: '!' unary | '-' unary | factor 
; 

factor: '(' bool ')' | loc | NUM | REAL | TRUE | FALSE 
; 

%% 

/* 
* Additional C Code 
* Main Routine 
* yyerror() 
*/ 
int main(int argc, char *argv[]) { 

    int i ; 

    if (argc < 2) { 
    fprintf(stderr, "No input files.\n\n") ; 
    return 1 ; 
    } 

    for (i = 0 ; i < argc ; i++) { 

    yyin = fopen(argv[i], "r") ; 

    if (!yyin) { 
     fprintf(stderr, "Error opening file: %s.\n\n", argv[i]) ; 
     return 1 ; 
    } 

    yyparse() ; 
    } 
    return 0 ; 
} 

void yyerror(char *s) { 

    /* fprintf(stderr, "Error parsing - %d: %s at %s\n", yylineno, s, yytext) ; */ 
    fprintf(stderr, "Error parsing - %d: %s at %s\n", yylineno, s, yytext) ; 

} 

내가 중요한 것을 놓친 것처럼 느껴집니다. 나는 그것이 규칙이라고 생각하지 않는다. argv []에 제공된 입력 파일로 yyin을 설정했습니다. 구문 오류, 예기치 못한 TRUE, 기대 '{'

오류 구문 분석에서 - 1 : 구문 오류, 예기치 못한 FALSE, 기대 '{'ELF

에서

어떤 도움 1 - 오류는

오류 분석입니다 대단히 감사하겠습니다!

편집이 : 나는 주요 기능을 변경하는 경우, 나는이를 얻을 수 (그렇게하여 yyparse 단지 표준 입력에서 읽고) yyin 설정하지 :

{INT X; }

오류 분석 - 1 : 구문 오류, 예기치 못한 TRUE, 기대 '{'즉 잘못된 방법 {

에서 나는에 당신의 토크 나이의 출력을 보지 않고 ...

+1

입력 파일의 관련 부분을 보여주십시오

이 바닥 섹션에서 모든 것을 대체합니다. –

+0

오류는 입력의 맨 처음에 발생합니다. 모든 입력 파일에서 동일한 오류가 발생합니다. 그 중 일부는 간단합니다. {int x; } 또는 {do (x) while (true); } 구문 적으로는 정확하지만 의미 상으로는 의미가 없습니다. – Kizaru

+1

어떻게 'retrun 0'으로 컴파일 되었습니까? 이게 정확한 코드인가요? – jamesdlin

답변

2

위의 샘플 입력을 스텁 yylex를 사용하여 실행하면 입력 프로그램이 일치합니다. 나는 "int"가 BASIC으로 토큰 화된다고 가정하고있다. ("retrun"도 수정해야합니다.)

렉서를 디버깅해야합니다. 디버거를 연결하여 되돌아 오는 것을 볼 수 있거나 yylex의 끝에 print 문을 넣을 수 있습니다.

%% 
FILE* yyin = NULL; 
int yylineno = 0; 
char* yytext = NULL; 
int main() 
{ 
    yyparse() ; 
    return 0 ; 
} 

void yyerror(char *s) 
{ 
    fprintf(stderr, "Error parsing - %d: %s at %s\n", yylineno, s, yytext) ; 
} 

int yylex() 
{ 
    static int i = 0; 
    static int tokens[] = { '{', BASIC, ID, ';', '}' }; 

    int tok = tokens[i]; 
    yylineno++; 
    i++; 
    return tok; 
} 
+0

나는 빨리이 시도하고 프로그램 그래서 파서가 작동하는 것처럼 보인다 ...이 경우, 내 스캐너에 오류해야 일치하는 프로그램 일치하는 블록 을 인쇄. 나는 집에 도착했을 때 그것을 두 번 점검하고 (필요할 경우) 게시 할 것입니다. 도움에 감사드립니다. – Kizaru

+0

기꺼이 도와 드리겠습니다. 문제를 해결 한 답변을 upvote 및/또는 수락하는 것을 잊지 마십시오. – bstpierre

0

을 이해하지 못하는 동일한 입력을 사용하면 구문 분석기가 실패하는 위치를 말하기 어렵습니다.

나 자신, 나는 '{'와 '}'를 LC와 RC 등으로 바꾸어서 토큰 화기에서 나오는 유일한 것이 엄격하게 처리 된 토큰이되도록 모든 것을 토큰 화합니다. 따라서 소스 파일의 모든 문자가 처리되는 위치를 쉽게 결정할 수 있습니다. 보고 어떤 오류

{ 
int 
x 
; 
} 

별도의 라인에 당신은 SourceFile의 각 토큰을 이동하면, 같은?

+0

별도의 줄을 사용하면 동일한 오류가 발생합니다. 나는 또한 스캐너에서 모든 것을 토큰 화하려고 시도했는데 같은 오류가있었습니다. 어쩌면 내 오류는 스캐너에 있습니다 ... 나는 두 시간 후에 코드에 액세스 할 때 게시 할 것입니다. – Kizaru

+0

나는 지금 어떤 라인에 대해 불평했는지 궁금해했다. – Crwth

+0

예. 내 스캐너에 문제가있는 것 같아서 오늘 밤 두 번 확인해 보겠습니다. 도와 주셔서 감사합니다. – Kizaru

관련 문제