我有以下含糊不清的语法,其中大写字母规则适用于简单的词汇标记:
program : function | function program
function : FN ID ARROW TYPE invariants DASH block
fn_call : ID L_PAREN CONSTANT R_PAREN
invariants : invariant | invariant invariants
invariant : TYPE ID COLON invariant_tests
invariant_tests : test | test COMMA invariant_tests
test : OPERATOR CONSTANT | STAR
block : expression | expression block
expression : loop | fn_call | assignment | def | constant
loop : FOR def IN CONSTANT COLON block
assignment : ID ASSIGN CONSTANT | ID ASSIGN ID
def : TYPE assignment
我收到8个shift / reduce错误(使用Python 2.7和PLY时)。
歧义是我如何定义“一个或多个”的结果,例如。 block : expression | expression block
?
答案 0 :(得分:0)
问题在于我如何定义loop
:
loop : FOR def IN CONSTANT COLON block
因为解析器不理解该块是属于循环还是属于函数。
基本上是悬挂其他问题的另一种变体。
答案 1 :(得分:0)
正如前一位发言者所说,你必须区分"阻止使用"。 例如,尝试:
loop : FOR def IN CONSTANT COLON block END FOR