0

我想为算术表达式创建一个明确的语法。现在求幂应该具有更高的优先级并与右侧相关联。所有其他操作都关联到左侧。这是我到目前为止所拥有的,但我不知道求幂是否正确

E -> E+T | E-T | T
T -> T*F | T/F | L
L ->  F^ L|F
F -> i | (E)
4

2 回答 2

3

我很好奇,因为这被标记为递归下降,这让我想到了 LL。

在为 LL 解析器创建语法时,请记住这些规则。

重复用于左结合:

Foo -> Bar (op Bar)*

尾递归用于右结合:

Foo -> Bar (op Foo)?

现在,您没有对 LL 解析器友好的语法,因为您有左递归:

E -> E+T

另一方面,如果它是 LL,那么您的幂运算使用尾递归,这样就可以了。

我建议维基百科的Top Down ParsingLeft-Recursion文章(这些文章比LL parser文章更容易阅读)。请注意,LR 解析器的工作方式不同,并导致左右关联性的语法不同。

哦,您的规则排序对于 LL 解析器需要优先级是正确的。您的低优先级运算符规则首先出现在生产规则链中。

于 2012-03-22T15:45:07.007 回答
0

根据您的语法,这里是您想要的更易读的版本。它是明确的并且正确地捕获了关联性。

expr -> term | expr add term
term -> factor | term mult factor
factor -> number | - factor | ( expr )
add -> + | -
mult -> * | /

这个示例应该更具可读性,以便您可以将其应用到您的作业中。我确实省略了^操作员,但您应该能够从示例中弄清楚。如果您想购买 [另一本] 教科书,Programming Language Pragmatics 会有很大帮助。

于 2012-03-22T17:37:43.740 回答