Parsing 野牛:冲突:1班次/减少错误

Parsing 野牛:冲突:1班次/减少错误,parsing,compiler-construction,bison,yacc,Parsing,Compiler Construction,Bison,Yacc,我正试图用bison构建一个解析器,并已将所有错误缩小到一个困难的错误 以下是bison的调试输出,其中包含错误所在的状态: state 120 12 statement_list: statement_list . SEMICOLON statement 24 if_statement: IF conditional THEN statement_lists ELSE statement_list . SEMICOLON shift, and go to state

我正试图用bison构建一个解析器,并已将所有错误缩小到一个困难的错误

以下是bison的调试输出,其中包含错误所在的状态:

state 120

   12 statement_list: statement_list . SEMICOLON statement
   24 if_statement: IF conditional THEN statement_lists ELSE statement_list .

    SEMICOLON  shift, and go to state 50

    SEMICOLON  [reduce using rule 24 (if_statement)]
    $default   reduce using rule 24 (if_statement)
以下是parser.y源代码中的翻译规则

%%

program              : ID COLON block ENDP ID POINT
                     ;
block                : CODE statement_list
                     | DECLARATIONS declaration_block CODE statement_list
                     ;
declaration_block    : id_list OF TYPE type SEMICOLON
                     | declaration_block id_list OF TYPE type SEMICOLON
                     ;
id_list              : ID
                     | ID COMMA id_list
                     ;
type                 : CHARACTER
                     | INTEGER
                     | REAL
                     ;
statement_list       : statement
                     | statement_list SEMICOLON statement
                     ;
statement_lists      : statement
                     | statement_list SEMICOLON statement
                     ;
statement            : assignment_statement
                     | if_statement
                     | do_statement
                     | while_statement
                     | for_statement
                     | write_statement
                     | read_statement
                     ;
assignment_statement : expression OUTPUTTO ID
                     ;
if_statement         : IF conditional THEN statement_lists ENDIF
                     | IF conditional THEN statement_lists ELSE statement_list
                     ;
do_statement         : DO statement_list WHILE conditional ENDDO
                     ;
while_statement      : WHILE conditional DO statement_list ENDWHILE
                     ;
for_statement        : FOR ID IS expression BY expressions TO expression DO statement_list ENDFOR
                     ;
write_statement      : WRITE BRA output_list KET
                     | NEWLINE
                     ;
read_statement       : READ BRA ID KET
                     ;
output_list          : value
                     | value COMMA output_list
                     ;
condition            : expression comparator expression
                     ;
conditional          : condition
                     | NOT conditional
                     | condition AND conditional
                     | condition OR conditional
                     ;
comparator           : ASSIGNMENT
                     | BETWEEN
                     | LT
                     | GT
                     | LESSEQUAL
                     | GREATEREQUAL
                     ;
expression           : term
                     | term PLUS expression
                     | term MINUS expression
                     ;
expressions          : term
                     | term PLUS expressions
                     | term MINUS expressions
                     ;
term                 : value
                     | value MULTIPLY term
                     | value DIVIDE term
                     ;
value                : ID
                     | constant
                     | BRA expression KET
                     ;
constant             : number_constant
                     | CHARCONST
                     ;
number_constant      : NUMBER
                     | MINUS NUMBER
                     | NUMBER POINT NUMBER
                     | MINUS NUMBER POINT NUMBER
                     ;              
%%
当我删除if_语句规则时,没有错误,所以我将其缩小了很多,但仍然无法解决错误


谢谢您的帮助。

我认为您在
IF-THEN-ELSE-ENDIF
规则中缺少
ENDIF

我认为您在
IF-THEN-ELSE-ENDIF
规则中缺少
ENDIF

考虑以下语句:IF条件,则s2 ELSE s3;s4

有两种解释:

if condition then
   s1;
else 
   s2;
s3;
另一个是:

if condition then
   s1;
else
   s2;
   s3;
在第一个语句中,语句列表由
if
语句和
s3
组成。而另一条语句仅由一条
if
语句组成。这就是歧义的来源。Bison在存在shift-reduce冲突时更喜欢shift-reduce,因此在上述情况下,解析器将选择shift
s3


由于您的<代码> <代码> >代码> > />代码>,请考虑在<代码>中引用< <代码> Engf>代码> >如果是“否则”/>代码>语句,则该问题得到解决。

< P>考虑此语句:如果条件则为S2 SR S3;s4

有两种解释:

if condition then
   s1;
else 
   s2;
s3;
另一个是:

if condition then
   s1;
else
   s2;
   s3;
在第一个语句中,语句列表由
if
语句和
s3
组成。而另一条语句仅由一条
if
语句组成。这就是歧义的来源。Bison在存在shift-reduce冲突时更喜欢shift-reduce,因此在上述情况下,解析器将选择shift
s3


由于您的<代码> <代码> > <代码> >语句,请考虑在<代码>中引用< <代码> Engf>代码> >如果是“否则”/>代码>语句,那么问题就解决了。

您的语法怎么没有结束,如果还有其他的此类结构,则使用了Endif?我不完全确定,但我想我已经解决了类似的问题,指定了一个特殊的“else_语句”,它可以是
else语句
或空,并指定if as
if statment else_语句
,非常感谢。真不敢相信我错过了:)你的语法为什么不像其他类似的构造那样用endif结束和if-else?我也不完全确定,但我想我已经通过指定一个特殊的“else\u语句”解决了类似的问题这可以是
else语句
也可以是空的,并指定if as
if statment else_语句
非常感谢。真不敢相信我错过了:)