在LEX YACC中读取新行给出语法错误

时间:2014-03-12 09:04:07

标签: parsing yacc lex

我正在尝试解析代码,为此我写了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");
}

3 个答案:

答案 0 :(得分:1)

这里有很多问题:

  • 你的语法期待令牌op,但你的词法分子永远不会产生它,而是产生opadd opmul
  • 你的例子在行的末尾有;,但你的词法分析器和解析器都没有处理它们。复制到stdout的默认词法分析器操作几乎不是您想要的。
  • 您的yacc文件尝试使用\\作为某种评论标记,但是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

";"     ;

如果我能帮助,请查看。如果我错了,请认识我。

相关问题