1

例如

E -> E+T | T

将会

E -> T E'
E' -> +T E' | null

如果我有生产

B -> B == C | C

这些是正确的作品吗?

B -> C B'
B' -> ==C B' | null

我遇到问题的另一个运算符是'!',我知道它比我语法中的所有内容都具有更高的优先级,除了“()”我想出了这个但不确定它是否正确。

T  -> U T'
T' -> *U T' | /U T' | null
U  -> ! ident | F
F  -> (A) | idlit | ftncall
ftncall -> ident(params)
4

1 回答 1

0

我认为两者都是正确的,除了你必须定义的第二paramsid-list

就像是:

参数-> id | id,参数

为了确定语法是否具有(模糊的)左递归,最简单的方法是将语法提供给野牛,解析生成器,如果语法不明确,它将发出警告/错误消息。

正如@ibid 所提到的,bison 正确解析了非歧义的左递归语法。有几个在线教程(要开始使用,您可以使用:http ://alumni.cs.ucr.edu/~lgao/teaching/bison.html )

于 2013-04-08T05:00:37.257 回答