如何编写JSP / ASP / PHP类语言的ANTLR解析器?

时间:2009-09-17 18:16:15

标签: parsing antlr

我是解析器生成器的新手,我想知道JSP / ASP / PHP等嵌入式语言的ANTLR语法是怎样的,但不幸的是,ANTLR站点没有提供任何这样的语法文件。

更确切地说,我不确切知道如何定义匹配所有内容的AnyText令牌(包括在代码块之外没有任何意义的关键字),并且仍然能够在块内正确识别它们。

例如,下面的snipped应该被标记为:AnyText,BlockBegin,Keyword,BlockEnd,AnyText。

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet

也许还有另一个解析器生成器更适合我的需求。我到目前为止只尝试过ANTLR,因为它在stackoverflow上很受欢迎:)

非常感谢提前!

2 个答案:

答案 0 :(得分:3)

我不能代表ANTLR,因为我使用了不同的词法分析器/解析器(DMS Software Reengineering Toolkit,我已经开发了这样的JSP和PHP词法分析器/解析器。(ASP没有区别,因为你有在你的问题中观察到)。

但基本思想是词法分析器需要词汇模式来识别你何时选择“任何文本”以及何时处理“真正的”编程语言文本。 所以你需要一个起始词汇模式,比如说HTML,它的工作就是吸收HTML 文本,当它遇到转换到PHP时,切换模式。 您还需要一个PHP模式来获取所有PHP令牌, 遇到转换字符时切换回HTML模式。 这是一个草图:

%%HTML -- mode
#token HTMLText "~[]* \< \% "
   << (GotoPHPMode) >>

%%PHP -- mode
#token KEYWORD "KEYWORD"
...
#token '%>'  "\%\>"
   << (GotoHTMLMode) >>

您的词法分析器可能具有某种模式切换功能 你将不得不使用而不是这个。你很可能会发现这一点 lexing HTML的东西比它看起来更复杂(你必须担心 关于&lt; SCRIPT标签和许多其他疯狂的HTML东西,但那些是 细节我认为你可以处理。

答案 1 :(得分:1)

我遇到过这个项目http://code.google.com/p/phpparser/ 其中还包含用于解析PHP的ANTLR语法文件:http://code.google.com/p/phpparser/source/browse/grammar/Php.g

希望这有帮助。