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;
}
У синтаксического анализатора ANTLR действительно нет понятия правила запуска - вы можете выбрать любое правило в качестве правила запуска при его вызове (вызывая соответствующий метод, например, start()
, если вы хотите начать с правила [ 111]).
Это может быть полезно, если вам нужно начать с разных правил для разных вариантов использования.
Возможно, было бы хорошей идеей называть ваше правило запуска что-то вроде startRule
в вашей грамматике для удобства чтения, но это не обязательно.
Функция 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()
для сгенерированного парсера.