如何获取antlr4 C ++规则匹配的原始文本?

时间:2019-04-25 08:41:23

标签: c++11 antlr4

正在尝试将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;}

2 个答案:

答案 0 :(得分:0)

RuleContext::getText的行为在所有目标中都是相同的:它通过将每个子上下文的文本添加到单个字符串中(递归)来检索给定上下文的文本。如果您的语法跳过空格或将其放在其他通道上,则这些字符将不包括在结果中,因为它们没有(可见)匹配项,因此它们不会出现在解析树中。

但是输入流上的getText()函数(带间隔)可以使您获得完整的原始文本(包括所有换行符,注释等)。但是,您给定的代码令人困惑:

  1. 您两次输入了相同的代码。一次您编写此作品,而另一次却无效。
  2. 您正在访问集合中不存在的间隔(索引0处只有一个间隔)。为什么要首先创建一个间隔集?只需传递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