기본 컴파일러에 대한 파서를 작성한 다음 서브 루틴 및 동적 메모리 할당을 포함하도록 확장합니다. 문법은 용서 부록 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, 기대 '{'즉 잘못된 방법 {
에서 나는에 당신의 토크 나이의 출력을 보지 않고 ...
입력 파일의 관련 부분을 보여주십시오
이 바닥 섹션에서 모든 것을 대체합니다. –
오류는 입력의 맨 처음에 발생합니다. 모든 입력 파일에서 동일한 오류가 발생합니다. 그 중 일부는 간단합니다. {int x; } 또는 {do (x) while (true); } 구문 적으로는 정확하지만 의미 상으로는 의미가 없습니다. – Kizaru
어떻게 'retrun 0'으로 컴파일 되었습니까? 이게 정확한 코드인가요? – jamesdlin