Как определить стартовое правило в ANTLR?

scanf("%d", &a); не может прочитать возврат, потому что %d принимает только десятичное целое число. Таким образом, вы добавляете \n в начале следующего scanf, чтобы игнорировать последний \n внутри буфера.

Затем scanf("\n%s", b); теперь может читать строку без проблем, но scanf ] перестает читать при поиске пробела. Итак, измените значение %s на %[^\n]. Это означает: «читать все, но \n»

scanf("\n%[^\n]", b);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    int a;
    char b[20];

    printf("Input your ID: ");
    scanf("%d", &a);

    printf("Input your name: ");
    scanf("\n%[^\n]", b);
    //first \n says to ignore last 'return'
    //%[^\n] read until find a 'return'  
    printf("---------\n");
    printf("Name: %s\n\n", b);   

    system("pause");
    return 0;
}
2
задан Tom 1 March 2019 в 12:28
поделиться

2 ответа

У синтаксического анализатора ANTLR действительно нет понятия правила запуска - вы можете выбрать любое правило в качестве правила запуска при его вызове (вызывая соответствующий метод, например, start(), если вы хотите начать с правила [ 111]).

Это может быть полезно, если вам нужно начать с разных правил для разных вариантов использования.

Возможно, было бы хорошей идеей называть ваше правило запуска что-то вроде startRule в вашей грамматике для удобства чтения, но это не обязательно.

0
ответ дан Jiri Tousek 1 March 2019 в 12:28
поделиться

Функция startRule () - это просто правило синтаксического анализа в вашей грамматике. Допустим, ваша грамматика, хранящаяся в файле с именем MyGrammar.g4, выглядит следующим образом:

grammar MyGrammar;

// A parser rule that matches zero or more ANY_CHAR tokens 
// followed by the EOF (end-of-file)
startRule
 : ANY_CHAR* EOF
 ;

// A lexer rule that matches a single character
ANY_CHAR
 : .
 ;

, тогда вы можете вызвать startRule() для сгенерированного парсера.

0
ответ дан Bart Kiers 1 March 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: