Notes
4 LLstar Parsers
- ANTLR使用语义predicate来实现语法predicate
- 在确定具体走哪个分支之前,ANTLR不会执行action和语法predicate这种可能有后效性的代码块。对于必须要在推测,也即执行DFA推断的时候就加载的代码块,antlr3提供了语法
{{}}
5 LLstart Grammar Analysis
5.1 Augmented transition networks
语法分析有点类似inter-procedural flow analysis。这里,一个configuration可以视为一个当前所在的图节点和为了到达该节点所积累的call stack。具体来说,ATN configuration = (p, i, (gamma), (pi)),这里p指ATN state, i指当前预测的production编号,(gamma)指ATN call stack,(pi)可能存在的predicate
5.2 Modified subset construction algo
5.3 Avoid analysis intractability
递归规则使得解析有陷入Loop,不停机的风险。有两种明显的策略:1. 只记录top m个states,以此停止计算 2. 只理会前m次递归。本文采用第2种,直接忽略>m次递归的推导,因为这样一般就够用了
5.4 Aborting DFA construction
如果某个Nonterminal对应的子规则有两条或以上都包含递归,那么我们认为DFA很有可能无法建模这个符号,此时,我们使用LL(1)+backtrack策略