Как получить исходный текст, который соответствует правилу antlr4 C ++? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь перенести проект antlr java на C ++.В Java я смог получить исходный текст, получив справку от Как получить исходный текст, которому соответствует правило antlr4? Это было потрясающе !!

Моя попытка в 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 голосов
/ 25 апреля 2019

Все заработало как положено :) Спасибо Майку: https://stackoverflow.com/users/1137174/mike-lischke

Изменения:

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
0 голосов
/ 25 апреля 2019

Поведение RuleContext::getText одинаково во всех целях: оно извлекает текст данного контекста, добавляя текст каждого подконтекста в одну строку (рекурсивно). Если ваша грамматика пропускает пробелы или помещает их в другой канал, то эти символы не включаются в результат, поскольку для них нет (видимого) соответствия и, следовательно, они не отображаются в дереве разбора.

Но функция getText() во входном потоке (с интервалом) возвращает полный исходный текст (включая все разрывы строк, комментарии и т. Д.). Однако данный код вводит в заблуждение:

  1. Вы включили один и тот же код дважды. Один раз ты пишешь это работает, а другой нет.
  2. Вы получаете доступ к интервалу в вашем наборе, который не существует (есть только один интервал с индексом 0). Зачем создавать интервал, установленный в первую очередь? Просто введите Interval(a, b).
...