我正在阅读有限自动机&来自Aho的编译器构造的语法,我长期坚持这种语法。我对如何描述它没有明确的认识:
考虑以下语法:
S - > (L)| a L - > L,S |小号
请注意,括号和逗号实际上是终结符 语言并出现在该语法接受的句子中。尝试 描述这种语法生成的语言。这是语法 暧昧?
我关注的是:这个语法生成的语言能否被描述为正则表达式?我对如何做到这一点很困惑。有什么帮助吗?
答案 0 :(得分:6)
要显示语法不明确,您需要能够在解析相同的字符串时构造两个不同的解析树。您的字符串将由“(”,“)”,“,”和“a”组成,因为这些是语法中唯一的终结符号。
尝试以几种方式排列这4个终端符号,并根据example ambiguous grammar on Wikipedia的精神,查看是否可以显示不同的成功解析。
立即左递归往往会导致某些解析器出现问题。看看“a,a,a”是否对“L→L,S | S”......
做了什么有趣的事情我关注的是这个语法生成的语言,正则表达式可以描述......我对如何做的感到困惑
正则表达式无法完全描述语法。重写部分语法会使这一点更加明显:
注意#1和#4。 L可以产生S,S可以产生(L)。这意味着S可以产生(S),其可以无限制地产生((S)),(((S)))等。关键是这些括号是匹配的;有相同数量的“(”符号为“)”符号。
正则表达式不能这样做。
正则表达式映射到有限自动机。有限自动机无法计算。语言L∈{w:0 n 1 n }不是常规语言。 L∈{w:( n ) n },只是对“1”的“(”代表“0”和“)”的替代,也不是。请参阅:Regular Languages - Wikipedia下的第一个示例部分。 (符号说明:s 1 是s,s 2 是ss,...,s n 重复n次。)
这意味着您无法使用正则表达式来描述该语言的这一部分。这使它成为CFG,图灵机和下推自动机的领域。
答案 1 :(得分:3)
正则表达式(以及解释它们的库)是识别无上下文语法句子的糟糕工具。相反,您可能希望使用yacc,bison或ANTLR等解析器生成器。
我认为Aho的书中练习的目的是用语言“描述语言”,以便理解它是否含糊不清。接近它的一种方法:你可以设计一个语法句子,可以用两种不同的方式解析,给定语法的产生吗?如果是这样,语法就不明确了。