Это программа yacc для распознавания всех строк, оканчивающихся на b, которым предшествует n a, с использованием грамматики a n b (примечание: введите значение n).
%{
#include "y.tab.h"
%}
%%
a {return A;}
b {return B;}
\n {return 0;}
. {return yytext[0];}
%%
Часть yacc
YACC PART
%{
#include <stdio.h>
int aCount=0,n;
%}
%token A
%token B
%%
s : X B { if (aCount<n || aCount>n)
{
YYFAIL();
}
}
X : X T | T
T : A { aCount++;}
;
%%
int main()
{ printf("Enter the value of n \n");
scanf("%d",&n);
printf("Enter the string\n");
yyparse();
printf("Valid string\n");
}
int YYFAIL()
{
printf("Invalid count of 'a'\n");
exit(0);
}
int yyerror()
{
printf("Invalid string\n");
exit(0);
}
Выход
invalid string
Он отображает недопустимую строку даже для допустимой строки, такой как aab для значения n 2. Для каждой введенной строки вызывается yyerror (). Пожалуйста, помогите мне решить эту проблему! TIA
1 ответ
scanf("%d",&n);
Читает число из стандартного ввода.
Он не читает число и следующую новую строку. Он просто читает число. Все, что следует за числом, будет возвращено следующей операцией, считывающей из stdin
.
Поэтому, когда вы пытаетесь выполнить синтаксический анализ, символ, прочитанный лексером, является символом новой строки, который вы ввели после числа. Этот символ новой строки заставляет лексический анализатор возвращать 0 анализатору, который интерпретируется как конец ввода. Но грамматика не допускает пустых входных данных, поэтому синтаксический анализатор сообщает о синтаксической ошибке.
В моей системе синтаксический анализатор сообщает о синтаксической ошибке, прежде чем он дает мне возможность ввести любой ввод. Тот факт, что он позволяет вам вводить строку ввода, немного озадачивает меня, но это может иметь какое-то отношение к любой IDE, которую вы используете для запуска своей программы.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .