我正在尝试为一种简单的、有文字的语言编写一个解析器——其结构类似于 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/