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