C++ ANTLR-保持块不变

C++ ANTLR-保持块不变,c++,antlr,C++,Antlr,我是ANTLR的初学者,需要修改现有的复杂语法 我想创建一个规则来保留块,而不使用其他规则进行解析。 更清楚的是,我需要在C++代码中插入一个代码。 编辑日期:2013年2月11日 经过多次测试后,以下是我的语法、测试、结果以及我想要的结果: 文法 试验 结果 预期结果 (很抱歉,我无法发布AST的图像,因为我没有10个声誉) 三个令牌“cppbeagin”、“cppInnerTerm”和“cppEnd”可以在一个令牌中,如下所示: cppLiteral : '//$CPP_IN$'(

我是ANTLR的初学者,需要修改现有的复杂语法

我想创建一个规则来保留块,而不使用其他规则进行解析。 更清楚的是,我需要在C++代码中插入一个代码。
编辑日期:2013年2月11日

经过多次测试后,以下是我的语法、测试、结果以及我想要的结果:

文法 试验 结果 预期结果 (很抱歉,我无法发布AST的图像,因为我没有10个声誉)

三个令牌“cppbeagin”、“cppInnerTerm”和“cppEnd”可以在一个令牌中,如下所示:

cppLiteral
    : '//$CPP_IN$'( ~('//$CPP_OUT$') )*'//$CPP_OUT$'
    ;
要获得此结果:

cppLiteral = '//$CPP_IN$\n txt1 txt2\n //$CPP_OUT$'
我想创建一个规则来保留块,而不使用其他规则进行解析

像多行注释一样解析它,例如
/*foobar*/
。下面是一个使用问题中指定的关键字的小示例

请注意,大部分工作都是使用lexer规则(以大写字母开头的规则)完成的。每当您想处理文本块时,特别是如果您想避免使用本例中的其他规则,您可能会考虑使用lexer规则,而不是解析器规则

CppBlock.g 下面是一个简单的测试用例:

输入

//$CPP_IN$
static const int x = 0; //magic number
int *y; //$CPP_IN$ <-- junk comment
static void foo(); //forward decl...
//$CPP_OUT$

//$CPP_IN$
//Here is another block of CPP code...
const char* msg = ":D";
//The end.
//$CPP_OUT$
/$CPP\u英寸$
静态常数int x=0//幻数

int*y//$你的问题我不清楚。是否要删除由
$
字符包围的序列?是否要忽略以
$CPP\u INSERT\u BEGIN$
标记开头并以
$CPP\u INSERT\u END$
标记结尾的代码块?您想对
$
包围的令牌执行特殊行为还是忽略它们?我想将块保持在
$CPP\u INSERT\u BEGIN$
$CPP\u INSERT\u END$
之间。它与字符串块完全相同:两个
之间的部分不会被修改(例如,在
printf(“非代码的东西”)
中)。除了在我的规则中,开始标记和结束标记没有被保留。在您发布的几个语法规则中,我已经看到了几个错误((1)语法分析器规则不能是
片段
,(2)在语法分析器规则中
~
不否定字符,而是否定标记,(3)您似乎混淆了词法分析器规则和语法分析器规则).IMO,你对ANTLR太不熟悉了,不能做这样的事情。我建议你在继续之前先开始。你是对的,我对ANTLR太不熟悉了!谢谢你的链接,我已经看过了所有javadude的教程。它非常有趣,向我学习了很多有用的东西。我相信它会让我纠正一些奇怪的t但我仍然不能做我想做的事:((我编辑了我的问题以更新它)非常感谢!这正是我想要的!就像Bart Kiers说的,我在Lexer和Parser方面仍然有问题。我还有很多东西要学习,但这将非常有用。再次感谢你!@Nagawica当然,我很高兴我能帮上忙。
cppLiteral ->
cppBegin = '//$CPP_IN$'
cppInnerTerm = 'txt1 txt2'
cppEnd = '//$CPP_OUT$'
cppLiteral
    : '//$CPP_IN$'( ~('//$CPP_OUT$') )*'//$CPP_OUT$'
    ;
cppLiteral = '//$CPP_IN$\n txt1 txt2\n //$CPP_OUT$'
grammar CppBlock;

document: CPP_LITERAL* EOF;


fragment CPP_IN:'//$CPP_IN$';
fragment CPP_OUT:'//$CPP_OUT$';
 
CPP_LITERAL:  CPP_IN .* CPP_OUT
            {
                String t = getText(); 
                t = t.substring(10, t.length() - 11); //10 = length of CPP_IN, 11 = length of CPP_OUT
                setText(t);
            }
            ;
WS: (' '|'\t'|'\f'|'\r'|'\n')+ {skip();};
//$CPP_IN$
static const int x = 0; //magic number
int *y; //$CPP_IN$ <-- junk comment
static void foo(); //forward decl...
//$CPP_OUT$

//$CPP_IN$
//Here is another block of CPP code...
const char* msg = ":D";
//The end.
//$CPP_OUT$
[CPP_LITERAL : 
static const int x = 0; //magic number
int *y; //$CPP_IN$ <-- junk comment
static void foo(); //forward decl...
]
[CPP_LITERAL : 
//Here is another block of CPP code...
const char* msg = ":D";
//The end.
]