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