【问题标题】:Why is yyerror() being called even when string is valid?为什么即使字符串有效也会调用 yyerror() ?
【发布时间】:2020-04-18 05:14:28
【问题描述】:

这是一个 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 

即使对于 n 值为 2 的 aab 等有效字符串,它也会显示无效字符串。 对于我输入的每个字符串,都会调用 yyerror()。 请帮我解决这个问题! TIA

【问题讨论】:

    标签: c++ bison flex-lexer yacc lex


    【解决方案1】:
    scanf("%d",&n);
    

    从标准输入中读取一个数字。

    它不读取数字和以下换行符。它只是读取一个数字。后面的任何数字都将从从stdin 读取的下一个操作中返回。

    因此,当您尝试解析时,词法分析器读取的字符是您在数字后键入的换行符。该换行符导致词法分析器将 0 返回给解析器,解析器将其解释为输入的结尾。但是语法不允许空输入,所以解析器会报语法错误。

    在我的系统上,解析器在让我有机会输入任何输入之前报告了一个语法错误。它允许您键入输入行这一事实让我有点困惑,但它可能与您用于运行程序的任何 IDE 有关。

    【讨论】:

    • 我也无法输入,但输入数字并留出空间后,我可以输入。您建议我做什么?
    • @tanisha:通常的建议适用。 Don't use scanf.。相反,使用fgets() 读取整行,然后使用strtol 从字符串中提取整数。 (或者sscanf,但strtol更简单更好。)
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2022-06-30
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多