【问题标题】:How to write an ANTLR parser for JSP/ASP/PHP like languages?如何为类似 JSP/ASP/PHP 的语言编写 ANTLR 解析器?
【发布时间】:2009-09-17 18:16:15
【问题描述】:

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

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

例如,以下片段应标记为:AnyText、BlockBegin、Keyword、BlockEnd、AnyText。

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet

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

提前非常感谢!

【问题讨论】:

  • 这个工作顺利吗?

标签: parsing antlr


【解决方案1】:

我不能代表 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) >>

您的词法分析器生成器可能具有某种模式切换功能 你必须使用它来代替它。你可能会发现 对 HTML 内容进行词法分析比看起来更复杂(你必须担心 关于

【讨论】:

  • 非常感谢您的回复。模式切换可能确实是一个解决方案,尽管 ANTLR 仍然有点问题,因为只有词法分析器应该被切换并且解析器必须保持不变。 (否则将很难解析诸如“AnyText”之类的内容)。我探索过的最简单的解决方案是使用 boost::spirit。在那里,词法分析器由解析器调用,因此您可以根据需要编写任意数量的规则,包括 anychar_p,而无需切换模式。
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

  • 我已经设法在 goyacc 中使用自定义词法分析器完成此操作,该词法分析器在遇到此类开始/结束标记时切换其词法分析模式。但是非常感谢您的链接,我也会看看它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多