我的语法非常简单:
E->E+T|T
T->T*F|F
F->(E)|id
我想扩展它以支持unar操作(恕我直言这是正确的语法,但它可能是错的,因为我在语法,解析器,词法分析器等中真的是n00b):
E->E+T|T
T->T*F|F
F->+F|(E)|id
当我尝试更新解析表时,真正的问题出现了:
所以问题是如何编辑此表以提供一元操作支持(基于所描述的语法)?
PS 无论如何,我将非常感谢您使用LR(k)(或LALR)解析器解析Java(或任何其他OO语言)中的ariphmetic表达式的任何帮助^ _ ^
P.S.2。在这种情况下,解析器生成器不适用。
答案 0 :(得分:1)
要了解如何调整解析表,您需要知道每个状态的LR项集是什么,并了解您对语法的添加如何更改项集 - 状态项集中的每个新部分解析项为解析表提供了额外的操作。
例如,在状态7中,您的原始项目集(在添加F -> + F
规则之前)是:
T -> T * . F
F -> . ( E )
F -> . id
(在这种情况下,我忽略了前瞻,因为它没关系,但对于一般LR(k),你需要跟踪它。)
因此,您的新规则会添加项F -> . + F
,这会为您提供状态7的新操作(转换为+
的输入。)这反过来为您的表提供了一个全新的状态