我想为算术表达式创建一个明确的语法。现在求幂应该具有更高的优先级并与右侧相关联。所有其他操作都关联到左侧。这是我到目前为止所拥有的,但我不知道求幂是否正确
E -> E+T | E-T | T
T -> T*F | T/F | L
L -> F^ L|F
F -> i | (E)
我想为算术表达式创建一个明确的语法。现在求幂应该具有更高的优先级并与右侧相关联。所有其他操作都关联到左侧。这是我到目前为止所拥有的,但我不知道求幂是否正确
E -> E+T | E-T | T
T -> T*F | T/F | L
L -> F^ L|F
F -> i | (E)
我很好奇,因为这被标记为递归下降,这让我想到了 LL。
在为 LL 解析器创建语法时,请记住这些规则。
重复用于左结合:
Foo -> Bar (op Bar)*
尾递归用于右结合:
Foo -> Bar (op Foo)?
现在,您没有对 LL 解析器友好的语法,因为您有左递归:
E -> E+T
另一方面,如果它是 LL,那么您的幂运算使用尾递归,这样就可以了。
我建议维基百科的Top Down Parsing和Left-Recursion文章(这些文章比LL parser文章更容易阅读)。请注意,LR 解析器的工作方式不同,并导致左右关联性的语法不同。
哦,您的规则排序对于 LL 解析器需要优先级是正确的。您的低优先级运算符规则首先出现在生产规则链中。
根据您的语法,这里是您想要的更易读的版本。它是明确的并且正确地捕获了关联性。
expr -> term | expr add term
term -> factor | term mult factor
factor -> number | - factor | ( expr )
add -> + | -
mult -> * | /
这个示例应该更具可读性,以便您可以将其应用到您的作业中。我确实省略了^
操作员,但您应该能够从示例中弄清楚。如果您想购买 [另一本] 教科书,Programming Language Pragmatics 会有很大帮助。