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

Parsing 如何为JSP/ASP/PHP类语言编写ANTLR解析器?,parsing,antlr,Parsing,Antlr,我不熟悉解析器生成器,我想知道像JSP/ASP/PHP这样的嵌入式语言的ANTLR语法可能是什么样子,但不幸的是ANTLR站点没有提供任何这样的语法文件 更确切地说,我不知道如何定义一个AnyText标记,它匹配所有内容(包括在代码块之外没有任何意义的关键字),并且仍然能够在代码块内部正确识别它们 例如,以下截取的内容应标记为:AnyText、BlockBegin、Keyword、BlockEnd、AnyText lorem ipsum KEYWORD dolor sit <% KEYWO

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

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

例如,以下截取的内容应标记为:AnyText、BlockBegin、Keyword、BlockEnd、AnyText

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet
lorem ipsum关键字dolor sit amet
也许还有另一个解析器生成器更适合我的需要。到目前为止,我只尝试过ANTLR,因为它在stackoverflow非常受欢迎:)


非常感谢

我不能为ANTLR说话,因为我使用了不同的lexer/parser(我为之开发了JSP和PHP lexer/parser)(ASP与您在问题中观察到的没有什么不同)

但其基本思想是,当您拾取“anytext”和处理“real”编程语言文本时,lexer需要词汇模式来识别。 所以你需要一个开始的词法模式,比如说HTML,它的工作就是吸收HTML 文本,当它遇到转换为PHP时,会切换模式。 您还需要一个PHP模式来获取所有PHP令牌, 并在遇到转出字符时切换回HTML模式。 这是一张草图:

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

%%PHP -- mode
#token KEYWORD "KEYWORD"
...
#token '%>'  "\%\>"
   << (GotoHTMLMode) >>
%%HTML--模式
#令牌HTMLText“~[]*\<\%”
>
%%PHP——模式
#令牌关键字“关键字”
...
#标记“%”“\%\>”
>
您的lexer生成器可能具有某种模式切换功能 你必须用它来代替这个,你很可能会发现 对HTML内容进行词法分析比看起来更复杂(你必须担心
关于我遇到了这个项目 它还包含用于解析PHP的ANTLR语法文件:


希望这能有所帮助。

非常感谢您的回复。模式切换可能确实是一个解决方案,尽管ANTLR仍然存在一些问题,因为只有lexer应该被切换,解析器必须保持不变。(否则很难解析“AnyText”之类的内容)。我探索过的最简单的解决方案是使用boost::spirit。在那里,语法分析器会调用lexer,因此您可以简单地编写任意多个规则,包括任意字符,而无需切换模式。成功了吗?我已经在goyacc中使用了一个自定义的lexer,它可以在遇到任何情况时切换其语法模式rs是这样一个开始/结束标记。但是非常感谢您的链接,我也会查看它:)