Bison:左递归语法没有冲突

Bison:左递归语法没有冲突,bison,Bison,我写这段代码是为了创建一个pascal解析器。当野牛分析它时,它没有显示任何冲突,尽管它是一个左递归和歧义语法。这是密码 %{ #include<stdio.h> int yyparse(); int yylex(); int yyerror(char *s); %} %token ID; %token VAR; %token INT; %token FUNC; %token PROC; %token BEGIN; %token END; %token OPAF

我写这段代码是为了创建一个pascal解析器。当野牛分析它时,它没有显示任何冲突,尽管它是一个左递归和歧义语法。这是密码

    %{
#include<stdio.h>
int yyparse();
int yylex();
int yyerror(char *s);

%}

%token  ID;
%token  VAR;
%token INT;
%token FUNC;
%token  PROC;
%token  BEGIN;
%token  END;
%token OPAFFECT;
%token OPREL;
%token  OPADD;
%token  OPMUL;
%token PROGRAM;
%token NB;
%token  IF;
%token  THEN;
%token ELSE;
%token  WHILE;
%token  DO;
%token NOT;
%token PO;
%token PF;
%token P;
%token PV;
%token DP;
%token V;
%token PLUS;
%token MINUS;
%%

program : PROGRAM ID PV declaration compoundinstruction P
declaration : vardeclaration subprogramsdec
vardeclaration : vardeclaration VAR idlist DP INT PV | /*epsilon*/
idlist : ID | idlist V ID
subprogramsdec : subprogramsdec subprograsdec PV | /*epsilon*/
subprograsdec : subprograsheader declaration compoundinstruction
subprograsheader : FUNC ID arguments DP INT PV | PROC ID arguments PV
arguments : PO parameterslist PF
parameterslist : parametre | parameterslist PV parametre
parametre : ID DP INT | VAR ID DP INT
compoundinstruction : BEGIN optinstruction END 
optinstruction : instructionslist | /*epsilon*/
instructionslist : instruction | instructionslist PV instruction
instruction : variable OPAFFECT expression | procedurecall | compoundinstruction | IF instruction THEN instruction ELSE instruction | WHILE expression DO instruction 
variable : ID
procedurecall : ID | ID PO expressionslist PF
expressionslist : expression | expressionslist V expression
expression : simpleexpression | simpleexpression OPREL simpleexpression
simpleexpression : term | sign term | simpleexpression OPADD term
term : factor | term OPMUL factor 
factor : ID | ID PO expressionslist PF | NB | PO expression PF |  NOT factor 
sign : PLUS | MINUS

%%
int yyerror(char *s) {
    printf("yyerror : %s\n",s);
    return 0;
}

int main(void) {
    yyparse();
    return 0;
}
%{
#包括
int-yyparse();
int-yylex();
int yyerror(字符*s);
%}
%令牌ID;
%代币VAR;
%令牌INT;
%代币功能;
%代币程序;
%代币开始;
%令牌端;
%象征效应;
%代币OPREL;
%令牌OPADD;
%令牌OPMUL;
%代币程序;
%标记NB;
%令牌IF;
%那么代币;
%其他代币;
%代币时;
%代币DO;
%代币不是;
%令牌PO;
%令牌PF;
%令牌P;
%代币PV;
%令牌DP;
%令牌V;
%代币加号;
%代币负号;
%%
程序:程序ID PV声明组件说明P
声明:vardeclaration subgramsdec
vardeclaration:vardeclaration VAR idlist DP INT PV |/*epsilon*/
idlist:ID | idlist V ID
subgramsdec:subgramsdec subgrasdec PV |/*ε*/
subgrasdec:subgrasheader声明复合指令
subgrasheader:FUNC ID arguments DP INT PV | PROC ID arguments PV
参数:PO参数列表PF
参数列表:参数|参数列表PV参数
参数:ID DP INT | VAR ID DP INT
组合说明:开始选项说明结束
选项说明:说明列表|/*ε*/
指令列表:指令|指令列表PV指令
指令:变量OPAFFECT表达式|过程调用|组合指令|如果指令然后指令ELSE指令|而表达式执行指令
变量:ID
程序调用:ID | ID PO表达式列表PF
expressionslist:expression | expressionslist V expression
表达式:simpleexpression | simpleexpression OPREL simpleexpression
simpleexpression:term |符号项| simpleexpression-OPADD项
术语:因子|术语OPMUL因子
因子:ID | ID PO表达式列表PF | NB | PO表达式PF |非因子
符号:正|负
%%
int yyerror(字符*s){
printf(“YY错误:%s\n”,s);
返回0;
}
内部主(空){
yyparse();
返回0;
}
我尝试了其他模棱两可和左递归语法的示例,bison显示了这些冲突,但没有使用这段代码。
谢谢你

这一问题可能与您先前正确回答的问题完全相同。