Почему yyerror () вызывается, даже если строка верна? - PullRequest
1 голос
/ 18 апреля 2020

Это программа ya cc, которая распознает все строки, заканчивающиеся буквой b, перед которыми стоит буква na, используя грамматику anb (примечание: введите значение n).



%{
#include "y.tab.h"
%}
%%
a {return A;}
b {return B;}
\n {return 0;}
. {return yytext[0];}
%%

Часть ya cc

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);
}

output

invalid string 

Отображает недопустимую строку даже для правильной строки, такой как aab для значения n 2. Для каждой вводимой строки, вызывается yyerror (). Пожалуйста, помогите мне решить эту проблему! ТИА

1 Ответ

0 голосов
/ 18 апреля 2020
scanf("%d",&n);

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

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

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

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

...