ANTLR和文学编程

时间:2014-01-05 13:09:13

标签: antlr

我正在尝试为一种简单的,有文化的语言编写一个解析器 - 结构类似于PHP。源可能看起来像:

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以将非代码文字视为评论。

要表明它是否是您可以介绍的代码或注释块 一些特殊的符号。例如/ * 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

- &GT;预处理

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

- &GT;使用ANTLR Parser和Lexer

进行配对

您可以查看TreeParser,您可以通过留下不必要的内容来减少输入语法到您想要评估的部分 令牌。

答案 1 :(得分:1)

看起来ANTLR人员很久以前就确定了这个任务。我想我想要构建的是岛语法,其中语法孤岛出现在没有应用规则的文本海洋中。

Parr的最终ANTLR 4参考的第12章让我找到了一个解决方案,当我点击分隔符时,它涉及在转换器之间进行切换。

答案 2 :(得分:0)

在研究GHC管理文字Haskell文件的方式时,我认为最佳方法可能是一个预处理步骤,通过将非代码部分转换为更正式指定的内容来“消除”源代码。

也许我有一个emit函数,它将非代码文本作为参数。我可以用以下内容预处理源代码:

src.gsub /(\A|\]\])(.*?)(\Z|\[\[)/ 'emit(\2)'