* 默认的分析方法是LALR,使用SLR请像这样运行 yacc():yacc.yacc(method=”SLR”)注意:LRLR生成的分析表大约要比SLR的大两倍。解析的性能没有本质的区别,因为代码是一样的。由于LALR能力稍强,所以更多的用于复杂的语法。
* 默认情况下,yacc.py依赖lex.py产生的标记。不过,可以用一个等价的词法标记生成器代替: yacc.parse(lexer=x) 这个例子中,x必须是一个Lexer对象,至少拥有x.token()方法用来获取标记。如果将输入字串提供给yacc.parse(),lexer还必须具有x.input()方法。
* 默认情况下,yacc在调试模式下生成分析表(会生成parser.out文件和其他东西),使用yacc.yacc(debug=0)禁用调试模式。
* 改变parsetab.py的文件名:yacc.yacc(tabmodule=”foo”)
* 改变parsetab.py的生成目录:yacc.yacc(tabmodule=”foo”,outputdir=”somedirectory”)
* 不生成分析表:yacc.yacc(write_tables=0)。注意:如果禁用分析表生成,yacc()将在每次运行的时候重新构建分析表(这里耗费的时候取决于语法文件的规模)
* 想在分析过程中输出丰富的调试信息,使用:yacc.parse(debug=1)
* yacc.yacc()方法会返回分析器对象,如果你想在一个程序中支持多个分析器:
~~~
p = yacc.yacc()
...
p.parse()
~~~
注意:yacc.parse()方法只绑定到最新创建的分析器对象上。
* 由于生成生成LALR分析表相对开销较大,先前生成的分析表会被缓存和重用。判断是否重新生成的依据是对所有的语法规则和优先级规则进行MD5校验,只有不匹配时才会重新生成。生成分析表是合理有效的办法,即使是面对上百个规则和状态的语法。对于复杂的编程语言,像C语言,在一些慢的机器上生成分析表可能要花费30-60秒,请耐心。
* 由于LR分析过程是基于分析表的,分析器的性能很大程度上取决于语法的规模。最大的瓶颈可能是词法分析器和语法规则的复杂度。
- 0 一些翻译约定
- 1 前言和预备
- 2 介绍
- 3 PLY概要
- 4 Lex
- 4.1 Lex的例子
- 4.2 标记列表
- 4.3 标记的规则
- 4.4 标记的值
- 4.5 丢弃标记
- 4.6 行号和位置信息
- 4.7 忽略字符
- 4.8 字面字符
- 4.9 错误处理
- 4.10 构建和使用lexer
- 4.11 @TOKEN装饰器
- 4.12 优化模式
- 4.13 调试
- 4.14 其他方式定义词法规则
- 4.15 额外状态维护
- 4.16 Lexer克隆
- 4.17 Lexer的内部状态
- 4.18 基于条件的扫描和启动条件
- 4.19 其他问题
- 5 语法分析基础
- 6 Yacc
- 6.1 一个例子
- 6.2 将语法规则合并
- 6.3 字面字符
- 6.4 空产生式
- 6.5 改变起始符号
- 6.6 处理二义文法
- 6.7 parser.out调试文件
- 6.8 处理语法错误
- 6.9 行号和位置的跟踪
- 6.10 构造抽象语法树
- 6.11 嵌入式动作
- 6.12 Yacc的其他
- 7 多个语法和词法分析器
- 8 使用Python的优化模式
- 9 高级调试
- 9.1 调试lex()和yacc()命令
- 9.2 运行时调试
- 10 如何继续