如何在使用Antlr解析的文件中包含非结构化部分

时间:2011-07-12 02:35:52

标签: antlr

我正在从我的语言创建一个翻译器到许多(所有?)其他面向对象的语言。作为语言的一部分,我想支持能够将目标语言代码段插入到文件中。这实际上与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,但似乎不可能。

有可能吗?还有另一种方式吗?

由于

1 个答案:

答案 0 :(得分:2)

改为在词法分析器中处理target_lang_block

Target_lang_block
  :  '{' (~('{' | '}') | Target_lang_block)* '}'
  ;

然后删除NO_CURLIES