我正在尝试解析代码,为此我写了LEX和YACC文件,将在下面给出。第一行它是正确读取但是之后它给出了语法错误,它不是读取下一行,我应该修改输入和输出功能,我正在从文件读取并将我的输出写入文件中.....我只是开始使用LEX YACC,需要一些想法。
输入文件
b_7 = _6 + b_3;
a_8 = b_7 - c_5;
lex文件
%{
/*
parser for ssa;
*/
#include<stdio.h>
#include<stdlib.h>
#include"y.tab.h"
%}
%%
[\t]+ ;
\n ;
[if]+ printf("first input\n");
[else]+ return(op);
[=]+ return(equal);
[+]+ return(op);
[*]+ return(op);
[-]+ return(op);
[\<][b][b][ ]+[1-9][\>] {return(bblock);}
([[_][a-z]])|([a-z][_][0-9]+)|([0-9]+) {return(var);}
. ;
%%
yacc文件
%{
/* lexer for ssa gramer to use for recognizing operations*/
#include<stdio.h>
char add_graph(char,char,...);
%}
%token opif opelse equal op bblock var
%%
sentence: var equal var op var { add_graph($1,$2,$3,$4,$5);}
;
%%
extern FILE *yyin;
main(argc,argv)
int argc;
char **argv;
{
if(argc > 1) {
FILE *file;
file=fopen(argv[1],"r");
if(file==NULL) {
fprintf(stderr,"couldnot open%s\n",argv[0]);
exit(1);
}
yyin=file;
}
do
{
yyparse();
}while (!feof(yyin));
fclose(yyin);
}
char add_graph(something)
{
.....
.....
}
yyerror(s)
char *s;
{
fprintf(stderr,"%s there is error\n",s);
}
yywrap()
{
printf("the output");
}
答案 0 :(得分:1)
这里有很多问题:
op
,但你的词法分子永远不会产生它,而是产生opadd
opmul
等;
,但你的词法分析器和解析器都没有处理它们。复制到stdout的默认词法分析器操作几乎不是您想要的。\\
作为某种评论标记,但是yacc不明白这一点。某些版本的yacc将C ++ - 样式//
理解为注释,但不是全部op
(在下一行),这不是一个单独的句子规则 - 你需要|
来分隔规则。yyparse
返回时没有达到eof,你会尝试循环,但是如果有错误,输入可能会有一些错误导致立即错误,导致错误风暴 - 可能不是你想要的。答案 1 :(得分:0)
您的语法只允许一个sentence
。因此,如果在第一句之后有任何输入,则会引发错误。你想允许一个或多个句子。在你的.y文件中试试这个:
%%
sentences : sentences sentence
| sentence
;
sentence : var equal var op var { add_graph($1,$2,$3,$4,$5);}
;
%%
答案 2 :(得分:-1)
大卫正在说正确但需要做出更多修改
ADD
";" ;
如果我能帮助,请查看。如果我错了,请认识我。