我正在尝试创建一个能够识别有效语句的语法分析器,并在此过程中打印成功。但是,在制作了lex和yacc文件后,我的yacc文件中出现了错误:
在函数'yyparse'fofo.y中:在函数'yyparse'中:
fofo.y:13:5:错误:程序中流浪'\'223' fofo.y:13:5:错误:在程序中流浪'\' fofo.y:13:16:错误:'n'未声明(首次使用此功能)
fofo.y:13:16:注意:每个未声明的标识符仅针对它出现的每个函数报告一次 fofo.y:13:18:错误:预期')'在'无效'之前 fofo.y:13:18:错误:在程序中流浪'\' fofo.y:13:18:错误:程序中错误的'\ 224'
这是我的yacc文件内容:
%{
#include <stdio.h>
%}
%start Stmt_list
%token Id Num Relop Addop Mulop Assignop Not
%%
Stmt_list : Stmt ';' '\n' {printf ("\n Success. \n"); exit(0);}
| Stmt_list Stmt ';' '\n' {printf ("\n Success. \n"); exit(0);}
| error '\n' {printf (“\n Invalid. \n”); exit(1);}
;
Stmt : Variable Assignop Expression
;
Variable : Id
| Id '['Expression']'
;
Expression : Simple_expression
| Simple_expression Relop Simple_expression
;
Simple_expression : Term
| Simple_expression Addop Term
;
Term : Factor
| Term Mulop Factor
;
Factor : Id
| Num
| '('Expression')'
| Id '['Expression']'
| Not Factor
;
%%
#include"lex.yy.c"
int main()
{
yyparse();
yylex();
}
yyerror(char *s)
{
printf("\nError\n");
}
答案 0 :(得分:0)
错误来自文本中的一些非ASCII字符(可能来自Word文件中的粘贴文本),在第13行,如错误消息所示:
| error '\n' {printf (“\n Invalid. \n”); exit(1);}
^ ^
| |
`--------------`------------ The error is here!
请注意,引号字符与上面的行不同,应编辑为:
| error '\n' {printf ("\n Invalid. \n"); exit(1);}
我还在你的代币周围添加了一些空白区域。例如,在这些行上:
| Id '['Expression']'
| '('Expression')'
| Id '['Expression']'
我改为:
| Id '[' Expression ']'
| '(' Expression ')'
| Id '[' Expression ']'
我还注意到你正在呼叫C function 'exit' but have not declared it properly。标题中需要以下行:
#include <stdlib.h>
然后它似乎对我来说很好。