ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
* 默认的分析方法是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分析过程是基于分析表的,分析器的性能很大程度上取决于语法的规模。最大的瓶颈可能是词法分析器和语法规则的复杂度。