正在尝试将antlr Java项目移植到C ++。 在Java中,我可以通过从How do I get the original text that an antlr4 rule matched?获得帮助来获取原始文本 太棒了!
我在C ++中的尝试
CharStream *input = ctx->start->getInputStream();
int a = ctx->start->getStartIndex();
int b = ctx->start->getStopIndex();
IntervalSet interval = IntervalSet(a,b);
string text = input->getText(interval.getIntervals()[2]);
这个“ getIntervals()”就像在Java中一样在帮助我。
在C ++中无法正常工作:
CharStream *input = ctx->start->getInputStream();
int a = ctx->start->getStartIndex();
int b = ctx->start->getStopIndex();
IntervalSet interval = IntervalSet(a,b);
string text = input->getText(interval.getIntervals()[2]);
这样尝试时,我没有空格,
string text = ctx->getText();
获取无空格的文本。
intmain(){cout<<"Hello, World!";strncpy(pStr,pStart,len);for(i=0;i<10;i++){j=i*i;i=j/5;}return0;}
答案 0 :(得分:0)
RuleContext::getText
的行为在所有目标中都是相同的:它通过将每个子上下文的文本添加到单个字符串中(递归)来检索给定上下文的文本。如果您的语法跳过空格或将其放在其他通道上,则这些字符将不包括在结果中,因为它们没有(可见)匹配项,因此它们不会出现在解析树中。
但是输入流上的getText()
函数(带间隔)可以使您获得完整的原始文本(包括所有换行符,注释等)。但是,您给定的代码令人困惑:
Interval(a, b)
。答案 1 :(得分:0)
一切正常:) 感谢Mike:benchmark result
更改:
Used misc/Interval.h, ctx->getStart()->getStartIndex(); ctx->getStop()->getStopIndex();
enterExpressionstatement:
Interval intvl = Interval();
intvl.a = ctx->getStart()->getStartIndex();
intvl.b = ctx->getStop()->getStopIndex();
string text2 = input->getText(intvl);
cout <<"enterExpressionstatement "<<text2<<endl;
.....
.....
cout <<"enterIterationstatement "<<text2<<endl;
输出:
$ ./parser cpp_forloop
enterExpressionstatement cout << "Hello, World!";
enterExpressionstatement strncpy(pStr, pStart, len);
enterIterationstatement for(i = 0; i < 10; i++ ) {
j = i*i; i = j/5;
}
enterExpressionstatement i = 0;
enterExpressionstatement j = i*i;
enterExpressionstatement i = j/5;
End of program cpp_forloop