我正在从我的语言创建一个翻译器到许多(所有?)其他面向对象的语言。作为语言的一部分,我想支持能够将目标语言代码段插入到文件中。这实际上与Antlr如何支持规则中的操作非常相似。
所以我希望能够让这些部分以这样的曲线开头和结尾:
{ ...target lang code... }
问题是,{...}很可能会出现在目标语言代码中,因此我需要能够匹配成对的curlies。
我希望能够做的就是这个片段,我已经将其纳入自己的语法:
grammar target_lang_block;
options
{
output = AST;
}
entry
: target_lang_block;
target_lang_block
: '{' target_lang_code* '}'
;
target_lang_code
: target_lang_block
| NO_CURLIES
;
WS
: (' ' | '\r' | '\t' | '\n')+ {$channel = HIDDEN;}
;
NO_CURLIES
: ~('{'|'}')+
;
这个语法本身就起作用(至少在我测试过的程度上)。
但是,当我将这些规则放入更大的语言时,NO_CURLIES似乎会吃掉所有内容并导致MismatchedTokenExceptions。
我不确定如何处理这种情况,但似乎我想要的是能够根据我是否在target_lang_block中打开和关闭NO_CURILES,但似乎不可能。
有可能吗?还有另一种方式吗?
由于
答案 0 :(得分:2)
改为在词法分析器中处理target_lang_block
:
Target_lang_block
: '{' (~('{' | '}') | Target_lang_block)* '}'
;
然后删除NO_CURLIES
。