2016-03-28 4 views
0

Я написал этот код, чтобы создать парсер. Когда бизон анализирует это, он не показывает никакого конфликта, несмотря на то, что это левая рекурсивная и двусмысленная грамматика. это кодBISON: конфликтов со сдвигом/уменьшением

%{ 
#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; 
} 

Я попробовал другие примеры неоднозначных и леворекурсивных грамматики, бизоны отображает эти конфликты, но не с этой частью коды. И спасибо !!!

ответ

0

Левая рекурсия является лишь проблемой для синтаксического анализа LL, а bison - LR (фактически LALR), поэтому остаточная рекурсия не является проблемой - это не вызывает конфликтов или других проблем.

Тот факт, что ваша грамматика не имеет конфликтов смены/сокращения, означает, что она не является двусмысленной. Что заставляет вас думать, что это так?

 Смежные вопросы

  • Нет связанных вопросов^_^