【发布时间】:2016-09-30 21:59:36
【问题描述】:
我正在使用 Bison 编写解析器,但似乎无法正确语法。
有两个冲突:
以下是围绕冲突一使用的一些规则:
program : function END_OF_FILE {return 0;}
formal_parameters : OPEN_PAREN formal_parameter list_E_fparameter CLOSE_PAREN | OPEN_PAREN CLOSE_PAREN
formal_parameter : expression_parameter | function_parameter
function : return_options IDENTIFIER formal_parameters block
function_parameter : return_options IDENTIFIER formal_parameters
expression_parameter : VAR identifier_list IDENTIFIER | identifier_list IDENTIFIER
variable_creation : identifier_list COLON type SEMI_COLON
labels : LABELS identifier_list SEMI_COLON
list_E_identifiers : list_E_identifiers COMMA IDENTIFIER |
identifier_list : IDENTIFIER list_E_identifiers
return_options : VOID | IDENTIFIER
状态 12 冲突:1 个减少/减少
state 12
56 identifier_list: IDENTIFIER . list_E_identifiers
60 return_options: IDENTIFIER .
102 list_E_identifiers: . list_E_identifiers COMMA IDENTIFIER
103 | .
COMMA reduce using rule 103 (list_E_identifiers)
IDENTIFIER reduce using rule 60 (return_options)
IDENTIFIER [reduce using rule 103 (list_E_identifiers)]
$default reduce using rule 60 (return_options)
list_E_identifiers go to state 23
状态 64 冲突:1 次移位/减少
state 64
8 body: OPEN_BRACE list_E_statement . CLOSE_BRACE
17 statement: . opt_declaration unlabeled_statement
18 | . compound
31 compound: . OPEN_BRACE list_NE_unlstatement CLOSE_BRACE
73 opt_declaration: . IDENTIFIER COLON
74 | .
94 list_E_statement: list_E_statement . statement
CLOSE_BRACE shift, and go to state 68
IDENTIFIER shift, and go to state 69
OPEN_BRACE shift, and go to state 70
IDENTIFIER [reduce using rule 74 (opt_declaration)]
$default reduce using rule 74 (opt_declaration)
statement go to state 71
compound go to state 72
opt_declaration go to state 73
谁能帮帮我?我看过http://www.gnu.org/software/bison/manual/html_node/Understanding.html,但不明白这是什么意思。
如果有帮助,我可以发布完整的语法。
谢谢!
【问题讨论】:
-
问题是“什么是 shift/reduce 或 reduce/reduce 冲突?”还是“为什么我的语法中有这些?”是的,您可能应该在此处发布语法,以便我们提供帮助。
-
冲突并不意味着您的语法不“正确”。 awk 实用程序是在 Yacc 的发源地开发的,但它的 Yacc 语法有九十多个冲突。冲突自动解决;例如,通过偏爱转移而不是减少,可以为您解决转移/减少问题。 Yacc 甚至有一个
%expect N指令,告诉它预期一定数量的冲突而不是抱怨。 -
@templatetypedef 如果问题不正确,我很抱歉,我希望有人帮助我找到冲突,或者至少帮助我理解这个调试输出的含义,以便我可以找到冲突。
-
@luisforque:没有必要拆分列表的“其余部分”。只需写
identifier_list: identifier | identifier_list ',' identifier或parameter_list: formal_parameter | parameter_list ',' formal_parameter等。你不需要到处使用空的产品,有时它们会给你带来麻烦。 (偶尔,您确实需要指定前缀而不减少。但这种情况非常罕见。) -
@rici 你写的 parameter_list 和 identifier_list 的情况,这些情况不能为0,对吧?例如,在我的规则中,我需要一个包含 0 个或多个元素的标识符列表。这就是我这样做的原因。在您的解决方案中,元素必须为 1 或更多,对吗?