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

tux*_*21b 6 parsing antlr

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

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

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

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢了!

Ira*_*ter 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) >>
Run Code Online (Sandbox Code Playgroud)

您的词法分析器生成器可能具有某种模式切换功能,您必须使用它来代替它。您可能会发现对 HTML 内容进行词法分析比看起来更复杂(您必须担心 <SCRIPT 标签和许多其他疯狂的 HTML 内容,但我认为您可以处理这些细节。