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

如何使用Antlr解析文件中的非结构化部分,antlr,Antlr,我正在创建一个从我的语言到许多(所有?)其他面向对象语言的翻译器。作为语言的一部分,我希望能够将目标语言代码段插入到文件中。这实际上相当类似于Antlr如何支持规则中的操作 因此,我希望能够让各部分以卷曲开头和结尾,如下所示: { ...target lang code... } 问题是{…}很可能会出现在目标语言代码中,因此我需要能够匹配成对的卷发 我希望能够做到的是,我已经将这个片段拉入它自己的语法中: grammar target_lang_block; options { o

我正在创建一个从我的语言到许多(所有?)其他面向对象语言的翻译器。作为语言的一部分,我希望能够将目标语言代码段插入到文件中。这实际上相当类似于Antlr如何支持规则中的操作

因此,我希望能够让各部分以卷曲开头和结尾,如下所示:

{ ...target lang code... }
问题是{…}很可能会出现在目标语言代码中,因此我需要能够匹配成对的卷发

我希望能够做到的是,我已经将这个片段拉入它自己的语法中:

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  
    :   ~('{'|'}')+
    ;
这种语法本身是有效的(至少我已经测试过了)

然而,当我把这些规则用更大的语言表达时,没有卷发会吞噬一切,并导致错误的饮食观念

我不知道如何处理这种情况,但我想的是,如果我在target_lang_街区,我就能够打开和关闭NO_CURILES,但这似乎是不可能的

可能吗?还有别的办法吗


谢谢

处理lexer内部的
目标语言块

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

当然要去掉卷发。

再次感谢巴特!关于创建语法分析器/词法分析器的精妙之处,有什么建议吗?@mtru1010,有关语法分析器理论的书籍可以在Stackoverflow上找到。关于如何充分利用ANTLR的书无疑是帕尔的。不客气!