我需要解析一个小的'迷你语言',用户可以在我的网站上输入。我想知道lex和jacc或者antlr的对应物是什么用于php的世界。
答案 0 :(得分:6)
几年前我使用LIME Parser generator for PHP,它已经成熟稳定了。
解析器生成器本身是用PHP编写的,这在任何技术意义上都不重要 - 因为我们只需要生成的解析器在PHP中 - 但我仍然喜欢这个细节。这让我对在PHP中编写软件感到不那么抱歉; - )
编辑:
我应该补充:
在我写“使用过”的地方,说“玩弄”会更准确。我还没有使用石灰编写任何生产代码。但我认为没有理由不这样做。
lime提供的“计算器示例”使用了tokenize()方法,这种方法与lex的强大功能相差甚远。但是如果你需要一个真正的标记器,就应该可以在“前端”上使用lex来将标记送到“后端”的石灰上。
答案 1 :(得分:0)
http://pear.php.net/package/PHP_ParserGenerator
http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php
答案 2 :(得分:0)
我已将jison(javascript中的Bison克隆)移植到php。结果是一个杀手解析器,能够处理非常简单和非常复杂的lexing /解析。它现在是Jison的一部分,但我的fork中有一些更新 - https://github.com/robertleeplummerjr/jison。文件在这里 - https://github.com/robertleeplummerjr/jison/tree/master/ports/php
请参阅该页面中的自述文件,您可以同时创建一个能够执行相同或不同操作的javascript和php解析器。 COOL!
答案 3 :(得分:-5)
我建议你编写自己的解析器,因为今天很容易。
最简单的方法是在我看来为每种语法类型(表达式,测试,循环等)创建一个类。
然后在每个类中编写以下方法:
a+b
的类型为'expression',if(b)
不是)a+b
将返回a->run() + b->run()
,a->run()
将返回一个值)