2016-03-28 4 views
0

Ich schrieb diesen Code, um einen Pascal-Parser zu erstellen. Wenn der Bison es analysiert, zeigt es keinen Konflikt, obwohl es eine linksrekursive und mehrdeutige Grammatik ist. Dies ist der CodeBISON: keine Verschiebung/Konflikte reduzieren

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

ich andere Beispiele für mehrdeutig und linke rekursiven Grammatiken, Bison zeigt diese Konflikte aber nicht mit diesem Stück Code versucht. Und danke !!!

Antwort

0

Linksrecession ist nur ein Problem für LL-Parsing, und Bison ist LR (eigentlich LALR), so dass Linksrekursion kein Problem ist - es verursacht keine Konflikte oder andere Probleme.

Die Tatsache, dass Ihre Grammatik keine Verschiebungs-/Reduzierungskonflikte hat, bedeutet, dass sie nicht mehrdeutig ist. Was lässt dich denken, dass es so ist?