【问题标题】:BISON : no shift/reduce conflictsBISON:没有移位/减少冲突
【发布时间】:2016-03-28 09:29:41
【问题描述】:

我编写这段代码是为了创建一个 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;
}

我尝试了其他模棱两可和左递归语法的例子,bison 显示了这些冲突,但没有显示这段代码。 还有谢谢!!!

【问题讨论】:

    标签: bison flex-lexer


    【解决方案1】:

    左递归只是LL解析的问题,而bison是LR(实际上是LALR),所以左递归不是问题——它不会引起任何冲突或其他问题。

    您的语法没有任何移位/归约冲突这一事实意味着它不是模棱两可的。是什么让你这么认为?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多