Parsing 明确语法

Parsing 明确语法,parsing,recursive-descent,Parsing,Recursive Descent,我想为算术表达式创建一个明确的语法。现在,求幂应该具有更高的优先级,并与右侧关联。所有其他操作都与左侧关联。这是我到目前为止得到的结果,但我不知道指数运算是否正确 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 ->

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

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)?
尾部递归用于右关联性:

Foo -> Bar (op Bar)*
Foo -> Bar (op Foo)?
现在,您没有LL解析器友好的语法,因为您留下了递归:

E -> E+T
另一方面,如果它是LL,则求幂使用尾部递归,这样就行了

我推荐维基百科和文章(这些比文章更容易阅读)。请注意,工作方式不同,左右关联性的语法也不同

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

哦,您的规则顺序对于LL解析器的优先级是正确的。在产生式规则链中,优先级较低的运算符规则排在第一位。

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

为LL解析器创建语法时,请记住以下规则

重复用于左关联性:

Foo -> Bar (op Bar)*
Foo -> Bar (op Foo)?
尾部递归用于右关联性:

Foo -> Bar (op Bar)*
Foo -> Bar (op Foo)?
现在,您没有LL解析器友好的语法,因为您留下了递归:

E -> E+T
另一方面,如果它是LL,则求幂使用尾部递归,这样就行了

我推荐维基百科和文章(这些比文章更容易阅读)。请注意,工作方式不同,左右关联性的语法也不同

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

哦,您的规则顺序对于LL解析器的优先级是正确的。在生产规则链中,优先级较低的运算符规则排在第一位。

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

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

这个例子应该更具可读性,这样你就可以把它应用到你的家庭作业中。我确实省略了
^
操作符,但您应该能够从示例中找到它。如果你想买(另一本)教科书,这是非常有帮助的。

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

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

这个例子应该更具可读性,这样你就可以把它应用到你的家庭作业中。我确实省略了
^
操作符,但您应该能够从示例中找到它。如果你想买(另一本)教科书,它会很有帮助。

是的。我不认为这有什么区别,但我更新了标题。@user1072706:这有区别,因为我们尽量不破坏家庭作业问题(请参阅)。此外,我们要求您向我们展示您的尝试(您已经完成了)。我建议您在
1-2-3/4/5^6^7-8-9上手动模拟解析器。这很好地运用了你的优先规则,并暴露了关联性问题。我不认为这有什么区别,但我更新了标题。@user1072706:这有区别,因为我们尽量不破坏家庭作业问题(请参阅)。此外,我们要求您向我们展示您的尝试(您已经完成了)。我建议您在
1-2-3/4/5^6^7-8-9上手动模拟解析器。这很好地执行了优先级规则,并暴露了关联性问题。