ANTLR 和文学编程

标签 antlr

我正在尝试为一种简单的、有文字的语言编写一个解析器——其结构类似于 PHP。来源可能类似于:

blurb blurb blurb
[[ if mode == 5 ]]
then blurb blurb blurb
[[ else ]]
else blurb blurb blurb
[[ end ]]

非代码部分——那些没有嵌套在[[ ]]中的部分——不遵循任何语法规则。这只是自然语言。

但是,我不确定如何编写语法规则来匹配非代码文本。我欢迎任何有关我如何做到这一点的帮助!

最佳答案

您可以将非代码文本视为注释。

为了表明它是代码块还是注释 block ,您可以引入 一些特殊符号。例如/* blub blub */或类似的东西。

所以你的解析器语法可能如下所示:

program : program | 
          if_statement | 
          non-code

if_statement : '[[' 'if' expression ']]' 
               ...

expressen : var OPERATOR var;

var : LITERAL; 

non-code : '/*' any_text*'*/

any_text : LITERAL | DIGIT | SPECIAL_CHAR

其中 ANY_TEXT 是

的词法分析器规则
 SPECIAL_CHAR  : '-'|'+' ....

 OPERATOR : '<' | '>' ....     


 LITERAL : (CHAR | DIGIT)+ 

 fragment CHAR : ('A'..'Z' | 'a'..'z')+

 fragement DIGIT : ('0'..'9')+;

根据评论进行编辑:

好吧,也许你可以尝试进行某种预处理或链接解析器。我前段时间刚刚做了类似的东西。在您的情况下,我只需使用简单的 REGEX 规则解析输入字符串并查找编码部分,然后在内部将某种标记添加到非编码部分。

 Input:

 blub blub blah
 [[ if express ]] 
 blah blah blub

--> 预处理

 <non-code>blub blub blah</non-code>
 [[ if express ]] 
 <non-code>blah blah blub</non-code>

--> 使用 ANTLR 解析器和词法分析器进行配对

您还可以看看 TreeParser,您可以在其中通过留下不必要的内容来将输入语法减少到您希望评估的部分 代币。

关于ANTLR 和文学编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20933917/

相关文章:

java - 使用ANTLR和Java创建数据绑定(bind)代码生成器

java - 使用 TestRig 时 ANTLR 解析有效,但使用 Java 解析时失败

java - 是否可以将树(数据结构)传递给 clojure 并对其进行处理?

java - 如何忽略 ANTLR4 中的某些文本?

java - ANTLR,表达式语法问题

java - 如何获取规则中的所有逻辑运算符标记

java - 如何使用antlr解析值中带有空格的标签?

java - 用 ANTLR 匹配任意文本(符号和空格)?

java - 使用 ANTLR 4.7 : need to parse fragments in string literals 解析 Swift

c++ - Antlr C 运行时示例中的 undefined reference