我正在尝试为一种简单的,有文化的语言编写一个解析器 - 结构类似于PHP。源可能看起来像:
blurb blurb blurb
[[ if mode == 5 ]]
then blurb blurb blurb
[[ else ]]
else blurb blurb blurb
[[ end ]]
非代码部分 - 未嵌套在[[ ]]
中的部分 - 不遵循任何语法规则。这只是自然语言。
但是,我不确定如何编写语法规则来匹配非代码文本。我欢迎任何有关如何做到这一点的帮助!
答案 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)'