Parsing 野牛:冲突:1班次/减少错误
我正试图用bison构建一个解析器,并已将所有错误缩小到一个困难的错误 以下是bison的调试输出,其中包含错误所在的状态: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
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,因此在上述情况下,解析器将选择shifts3
由于您的<代码> <代码> >代码> > />代码>,请考虑在<代码>中引用< <代码> 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,因此在上述情况下,解析器将选择shifts3
由于您的<代码> <代码> > <代码> >语句,请考虑在<代码>中引用< <代码> Engf>代码> >如果是“否则”/>代码>语句,那么问题就解决了。
您的语法怎么没有结束,如果还有其他的此类结构,则使用了Endif?我不完全确定,但我想我已经解决了类似的问题,指定了一个特殊的“else_语句”,它可以是else语句
或空,并指定if asif statment else_语句
,非常感谢。真不敢相信我错过了:)你的语法为什么不像其他类似的构造那样用endif结束和if-else?我也不完全确定,但我想我已经通过指定一个特殊的“else\u语句”解决了类似的问题这可以是else语句
也可以是空的,并指定if asif statment else_语句
非常感谢。真不敢相信我错过了:)