Это программа 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
Tanisha 18 Апр 2020 в 08:14

1 ответ

Лучший ответ
scanf("%d",&n);

Читает число из стандартного ввода.

Он не читает число и следующую новую строку. Он просто читает число. Все, что следует за числом, будет возвращено следующей операцией, считывающей из stdin.

Поэтому, когда вы пытаетесь выполнить синтаксический анализ, символ, прочитанный лексером, является символом новой строки, который вы ввели после числа. Этот символ новой строки заставляет лексический анализатор возвращать 0 анализатору, который интерпретируется как конец ввода. Но грамматика не допускает пустых входных данных, поэтому синтаксический анализатор сообщает о синтаксической ошибке.

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

0
rici 18 Апр 2020 в 05:51