yacc 파서에서 오류를 추적하는 방법에 대해서는 알지 못합니다. 우리는 lex 파일에 yylineno
을 사용하려하고 %option yylineno
을 추가하려고 시도했지만 여전히 작동하지 않습니다. 우리는 yacc에서 이러한 변수에 액세스 할 수 없습니다.yacc 파서를 사용하여 오류 행 번호를 감지하는 방법
줄 번호와 함께 yacc에 error
을 사용하여 구문 오류를 인쇄하면됩니다.
여기 여기 지금 우리 .l
파일
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
int yylineno=1;
%}
%option yylineno
identifier [a-zA-Z_][a-zA-Z0-9_]*
int_constant [0-9]+
delimiter ;
%%
"int" {return INT;}
{int_constant} return INT_CONST;
{identifier} return IDENT;
\= {return ASOP;}
\+ {return PLUS;}
\- {return MINUS;}
\* {return MULT;}
\/ {return DIV;}
\, {return COMMA;}
\( {return OP;} /*OP CP = Opening Closing Parenthesis*/
\) {return CP;}
\[ {return OB;} /*OB CB = Opening Closing Brace*/
\] {return CB;}
\{ {return OCB;} /*OCB CCB = Opening Closing Curly Brace*/
\} {return CCB;}
{delimiter} return DEL;
[ \t]
[\n] {yylineno++;}
%%
의 해당 파일에 문제의 숫자가 우리의 .y
파일
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern FILE *yyin;
%}
%token INT INT_CONST IDENT ASOP PLUS MINUS MULT DIV DEL COMMA CP CB CCB
%left OP OB OCB
%%
program: program_unit;
program_unit: program_unit component | component
component: var_decl DEL | func_decl DEL | func_defn ;
var_decl: dt list;
dt: INT;
list: list COMMA var | var
| error {printf("before ';' token\n"); yyerrok;}
| error INT_CONST {printf("before numeric constant\n"); yyerrok;};
var: IDENT
|IDENT init;
init: ASOP IDENT init | ASOP expr | ASOP IDENT ;
expr: IDENT op expr | const op expr | const | OP expr CP;
const: INT_CONST;
op: PLUS | MINUS | MULT | DIV;
func_decl: dt mult_func;
mult_func: mult_func COMMA mfunc | sfunc;
mfunc: IDENT OP CP;
sfunc: IDENT OP CP OCB func_body CCB;
func_body: program_unit;
func_defn: dt IDENT OP CP OCB func_body CCB
| IDENT OP CP OCB func_body CCB;
%%
int yyerror(char *s){
extern int yylineno;
fprintf(stderr,"At line %d %s ",s,yylineno);
}
int yywrap(){
return 1;
}
int main(int argc, char *argv[]){
yyin=fopen("test.c","r");
yyparse();
fclose(yyin);
return 0;
}
시도한 것을 보여주십시오. 그렇지 않으면 우리는 당신이 잘못한 것을 말할 수 없습니다. –
@Stephen C. Mister, 우리의'.l'과'.y' 파일은 최근 포스트와 함께 있습니다. 당신은 또한 우리에게 예제를 줄 수 있습니다, evan은 가장 단순한 것입니다. 고맙습니다. – Jin