lex和yacc之后的第二个输入中出现语法错误

lex和yacc之后的第二个输入中出现语法错误,c,bison,flex-lexer,yacc,lex,C,Bison,Flex Lexer,Yacc,Lex,我有一个lex和yacc文件来生成给定输入的抽象语法树。它对第一个lex输入工作正常,然后对第二个输入显示yyerror()语法错误。(输入正确) %{ #包括 #包括 #包括 int yylex(无效); #包括“y.tab.h” 结构树 { char*val; 结构树*左; 结构树*右; }; 结构树*生成(结构树*左,字符*,结构树*右); 无效显示(结构树*); %} %联合 { 结构树*节点; 性感; } %令牌整数 %类型表达式 %类型术语 %类型因子 %% 行: expr'\n'{

我有一个lex和yacc文件来生成给定输入的抽象语法树。它对第一个lex输入工作正常,然后对第二个输入显示yyerror()语法错误。(输入正确)

%{
#包括
#包括
#包括
int yylex(无效);
#包括“y.tab.h”
结构树
{
char*val;
结构树*左;
结构树*右;
};
结构树*生成(结构树*左,字符*,结构树*右);
无效显示(结构树*);
%}
%联合
{
结构树*节点;
性感;
}
%令牌整数
%类型表达式
%类型术语
%类型因子
%%
行:
expr'\n'{display($1);}
|“\n”
表达式:
expr'+'术语{$$=make($1,“+”,$3);}
|expr'-'术语{$$=make($1,“-”,$3);}
|术语{$$=$1;}
术语:
术语“*”因子{$$=make($1,“*”,$3);}
|术语“/”因子{$$=make($1,“/”,$3);}
|因子{$$=$1;}
因素:
“('expr')”{$$=$2;}
|整数{$$=make(NULL,$1,NULL);}
%%
结构树*make(结构树*lft,字符*value,结构树*rght)
{
结构树*temp=(结构树*)malloc(sizeof(结构树));
char*str=malloc(strlen(值)+1);
strcpy(str,value);
temp->val=str;
温度->右=rght;
温度->左=lft;
返回(临时);
}
无效显示(结构树*dis)
{
int i;
printf(“当前节点为:%s\n”,dis->val);
如果(dis->left)
printf(“左边的子项是:%s\n”,dis->Left->val);
如果(dis->right)
printf(“右子项为:%s\n\n”,dis->Right->val);
如果(dis->left)
显示(显示->左);
其他的
printf(“左子项为空\n”);
如果(dis->right)
显示(显示->右侧);
其他的
printf(“右子项为空\n\n”);
}
Lex代码如下所示

%{
        #include<stdio.h>
        #include "y.tab.h"
        int number=0,i=0;
    %}
    digit [0-9]
    letter [a-zA-z]
    id {letter}({letter}|{digit})*

    %%
    {digit}+ {yylval.sexy = yytext; return INTEGER;}
    [+-/*] {return *yytext;}
    "(" {return *yytext;}
    ")" {return *yytext;}
    \n {return *yytext;}
    %%

    void yyerror(char *str)
    {
     fprintf(stderr, "%s\n", str);
    }

    int main()
    {
        yyparse();
        return(0);
    }
%{
#包括
#包括“y.tab.h”
整数=0,i=0;
%}
数字[0-9]
字母[a-zA-z]
id{letter}({letter}{digit})*
%%
{digit}+{yylval.sexy=yytext;返回整数;}
[+-/*]{return*yytext;}
“({return*yytext;}
“{return*yytext;}”
\n{return*yytext;}
%%
无效错误(字符*str)
{
fprintf(stderr,“%s\n”,str);
}
int main()
{
yyparse();
返回(0);
}

在YACC中添加另一个语法规则以适应多个输入行

program : 
    line program
    | line

用yyerror打印树以查看它走了多远。请同时提供两个输入。它有效。我必须在YACC中添加另一个语法规则以容纳多个输入行。使用左递归以避免破坏解析器堆栈。正如所写的,每一行都被推到堆栈上,直到输入的最后,这可能是交互式会话中的许多条目。
program : 
    line program
    | line