![]() |
1
34
首先,有点迂腐。您无法确定 语言 是从检查语法中得到的,你只能对 语法 本身。对于存在ll(1)语法的语言,编写非ll(1)语法是完全可能的。 别挡道了:
|
![]() |
2
15
回答你的主要问题:对于一个非常简单的语法,可能不需要先构造集合,然后再跟随集合,就可以确定它是否是ll(1)。
是。 但是当你变得更复杂的时候,你需要做一些分析。
这不是ll(1),但可能不是很明显 算术的语法规则很快变得非常复杂:
这种语法只处理乘法和加法,而且还不清楚语法是否为ll(1)。仍然可以通过查看语法来评估它,但是随着语法的增长,它变得不那么具有可行性。如果我们要为整个编程语言定义语法,那么几乎可以肯定,它将进行一些复杂的分析。 也就是说,有一些明显的迹象表明语法不是ll(1),就像上面的a→a+a-如果你在语法中能找到其中的任何一个,你就会知道如果你在编写递归下降解析器,它需要重写。但是没有捷径来验证语法 是 LL(1)。 |
![]() |
3
9
一个方面,“语言/语法是否含糊不清”,是 a known undecidable question 像 Post correspondence 和 halting 问题。 |
![]() |
4
9
直接摘自AHO等人的《编译器:原理、技术和工具》。 第223页: 语法G是ll(1) 当且仅当 每当a-> 阿尔法 γ 贝塔 是G的两个不同产物,满足以下条件:
本质上,这是一个验证语法通过成对不连接测试的问题,并且也不涉及左递归。或者更简洁地说,留下递归或不明确的语法g不能是ll(1)。 |
![]() |
5
2
检查语法是否含糊不清。如果是,那么语法就不是ll(1),因为没有不明确的语法是ll(1)。 |
![]() |
6
0
是的,这是所有语法的捷径。 1)如果a->b1 b2……bn 然后是第一个(b1)交集,第一个(b2)交集。第一个(bn)=空集,然后是ll(1)语法 2)如果a->b1 epsilon 则b1交叉口跟随(a)为空集 3)如果g是任何语法,使得每个非终端只派生一个产品,那么语法是ll(1) |
![]() |
7
-2
|
![]() |
Håkon Hægland · 如何为语法的动作类添加默认方法? 7 年前 |
![]() |
Eddtothefullest · 解决这种转变/减少快乐/野牛的冲突 7 年前 |
![]() |
Zac Uwyo H · 生成语言L的BNF语法 7 年前 |
![]() |
user9193072 · 用泵引理证明语言的非正则性 7 年前 |
![]() |
JesseBuesking · 柠檬解析器减少错误 8 年前 |
![]() |
DainDwarf · 在antlr4中精确分析n个参数 9 年前 |
![]() |
Angel Todorov · 具有非贪婪规则的ANTLR 10 年前 |
![]() |
Zhao · 困惑于将模棱两可的语法转换为明确的语法 10 年前 |