我认为这里的问题是一种语言有一个抽象语法就像:
E ::= E + E | E - E | E * E | E / E | Int | (E)
但这实际上是通过具体语法它用于指定关联性和优先级。因此,如果您正在编写一个递归的体面解析,那么您将在进行过程中隐式地将具体语法写入其中,这很好,尽管将其精确地指定为短语结构语法可能会更好!
如果你的语法是一个成熟的具体语法,那么它有几个问题。首先,您需要添加产生式以“转到下一个级别”,因此稍微放松您的语法:
Expr ::= Term + Term | Term - Term | Term
Term ::= Factor * Factor | Factor / Factor | Factor
Factor ::= INTEGER | (Expr)
否则,无法从起始符号(在本例中为 Expr)开始导出有效的句子。例如,如果没有这些额外的产生式,您将如何导出“1 * 2”?
Expr -> Term
-> Factor * Factor
-> 1 * Factor
-> 1 * 2
我们可以看到其他语法以稍微不同的方式处理这个问题:
Expr -> Term Expr'
-> Factor Term' Expr'
-> 1 Term' Expr'
-> 1 * Factor Term' Expr'
-> 1 * 2 Term' Expr'
-> 1 * 2 ε Expr'
-> 1 * 2 ε ε
= 1 * 2
但这达到了相同的效果。
您的解析器实际上是非关联的。要查看此内容,请询问如何E + E + E
会被解析并发现它不能。任何+
首先被消耗,我们得到E
一侧和E + E
另一方面,但随后我们尝试解析E + E
as a Term
这是不可能的。同样,考虑从起始符号导出该表达式,这也是不可能的。
Expr -> Term + Term
-> ? (can't get another + in here)
另一种语法是左关联 ebcase 任意长的字符串E + E + ... + E
可以推导出来。
所以无论如何,总而言之,你是对的,在编写 RDP 时,你可以实现任何concrete的版本abstract你喜欢的语法,并且你可能比我更了解它。但是,当尝试生成精确描述 RDP 的语法时,会出现这些问题。希望有帮助!