企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
PLY包含两个独立的模块:`lex.py`和`yacc.py`,都定义在ply包下。lex.py模块用来将输入字符通过一系列的正则表达式分解成标记序列,yacc.py通过一些上下文无关的文法来识别编程语言语法。yacc.py使用LR解析法,并使用LALR(1)算法(默认)或者SLR算法生成分析表。 这两个工具是为了一起工作的。lex.py通过向外部提供`token()`方法作为接口,方法每次会从输入中返回下一个有效的标记。yacc.py将会不断的调用这个方法来获取标记并匹配语法规则。yacc.py的的功能通常是生成抽象语法树(`AST`),不过,这完全取决于用户,如果需要,yacc.py可以直接用来完成简单的翻译。 就像相应的unix工具,yacc.py提供了大多数你期望的特性,其中包括:丰富的错误检查、语法验证、支持空产生式、错误的标记、通过优先级规则解决二义性。事实上,传统yacc能够做到的PLY都应该支持。 yacc.py与Unix下的yacc的主要不同之处在于,yacc.py没有包含一个独立的代码生成器,而是在PLY中依赖反射来构建词法分析器和语法解析器。不像传统的lex/yacc工具需要一个独立的输入文件,并将之转化成一个源文件,Python程序必须是一个可直接可用的程序,这意味着不能有额外的源文件和特殊的创建步骤(像是那种执行yacc命令来生成Python代码)。又由于生成分析表开销较大,PLY会缓存生成的分析表,并将它们保存在独立的文件中,除非源文件有变化,会重新生成分析表,否则将从缓存中直接读取。