我有一个语法,我必须使用 JJTree 和 JavaCC 创建符号表和 AST。虽然我完全理解创建表和树的作业部分,但给我的语法是模棱两可的,包含左递归和间接左递归。它也需要被考虑在内。我在整个互联网上搜寻,试图找到对我有用的方法。
例如:
A ::= Aα | β
可以改为:
A ::= βA'
A' ::= αA' | ε
但我不知道如何将其应用于我的语法。
这是我从包含上述问题的语法中编写的生产规则的一部分。
void statement() #STM : {}
{
identifier() <ASSIGNMENT> expression()
| identifier() <ASSIGNMENT> <STRING>
| <EXCLAMATION> expression()
| <QUESTION> identifier()
| identifier() <LBR> arg_list() <RBR>
| <BEGIN> (statement() <SEMIC>)+ <END>
| matched()
| unmatched()
| <WHILE> <LBR> condition() <RBR> <DO> statement()
| {}
}
void matched() #void : {}
{
<IF> condition() <THEN> matched() <ELSE> matched()
}
void unmatched() #void : {}
{
<IF> condition() <THEN> statement()
| <IF> condition() <THEN> matched() <ELSE> unmatched()
}
void expression() #EXPR : {}
{
fragment() ((<PLUS>|<MINUS>|<MULT>|<DIV>) fragment())*
}
void fragment() #FRAG : {}
{
(identifier() | <NUM> | (<PLUS>|<MINUS>) fragment() | expression())
}