c++ - 未通过空格分隔的Bison/Yacc解析器将跳过语法- “unexpected $end”

标签 c++ parsing grammar bison flex-lexer

嗨,我有一个场景,如果有分隔语法的空格,野牛将成功解析我的输入...

情况如下:我正在尝试声明一个变量:

int a = 31 ;

这个阴成功解析
int a = 31;

无法成功解析

我收到的错误是:
syntax error, unexpected $end, expecting TSEMI

这是野牛代码的部分
%token <string> TIDENTIFIER TINTEGER TDOUBLE
%token <token> TCEQUAL TCNE TCLT TCLE TCGT TCGE TASSIGN
%token <token> TLPAREN TRPAREN TLBRACE TRBRACE TCOMMA TDOT TSEMI
%token <token> TPLUS TMINUS TMUL TDIV

...

var_decl : ident ident TSEMI { $$ = new VarDel($1, $2); }
         | ident ident TASSIGN expr TSEMI {$$ = new VarDel($1, $2, $4);}
         ;

ident : TIDENTIFIER { $$ = new Var($1->c_str()); delete $1; }
      ;

expr : ident { $<ident>$ = $1; }
     | numeric
     ;

numeric : TINTEGER { $$ = new Num(atol($1->c_str())); delete $1; }
        | TDOUBLE { $$ = new Num(atof($1->c_str())); delete $1; }
        ;


这是我的 flex 文件的一部分

[ \t\n]                 ;
[a-zA-Z_][a-zA-Z0-9_]*  SAVE_TOKEN; return TIDENTIFIER;
[0-9]+.[0-9]*           SAVE_TOKEN; return TDOUBLE;
[0-9]+                  SAVE_TOKEN; return TINTEGER;
"="                     return TOKEN(TASSIGN);
"=="                    return TOKEN(TCEQUAL);
"!="                    return TOKEN(TCNE);
"<"                     return TOKEN(TCLT);
"<="                    return TOKEN(TCLE);
">"                     return TOKEN(TCGT);
">="                    return TOKEN(TCGE);
"("                     return TOKEN(TLPAREN);
")"                     return TOKEN(TRPAREN);
"{"                     return TOKEN(TLBRACE);
"}"                     return TOKEN(TRBRACE);
"."                     return TOKEN(TDOT);
","                     return TOKEN(TCOMMA);
"+"                     return TOKEN(TPLUS);
"-"                     return TOKEN(TMINUS);
";"                     return TOKEN(TSEMI);
"*"                     return TOKEN(TMUL);
"/"                     return TOKEN(TDIV);
.                       printf("Unknown token!n"); yyterminate();



为什么在有空间但没有空间的情况下成功解析?

谢谢

最佳答案

[0-9]+.[0-9]*应该是[0-9]+\.[0-9]*。如所写,它匹配31;

您最好启用Flex调试(-d命令行标志)以查看其标记方式。另外,使用atof会静默地隐藏 token 不是有效数字的事实。考虑使用更安全的字符串→数字转换器;您会在C++标准库中找到一个;在C语言中,将是strtod,然后检查endptr是否在末尾。 (而且您可以在词法分析器中进行此转换,避免不必要的字符串分配和释放。)

关于c++ - 未通过空格分隔的Bison/Yacc解析器将跳过语法- “unexpected $end”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59911363/

相关文章:

android - QtCreator 在生成 APK 时出现 ProcessException

php - DOMDocument::loadHTML(): 由于输入错误导致输入转换失败

java - 检测 CSV 文件中出现的行数

Cocoa:按字符长度解析NSString

python - NLP:检查检测到的句子是否是完整的句子

c++ - 带有 CMake 的 CLion 中的 GLFW3 库导致 MacOS 上出现 undefined symbol

c++ - 如何用 C++ 编写这段代码

c++ - union 作为基类

grammar - 命名语法规则的元对象规则是什么

python - 解析 Latex : grammar, 递归下降的简单扩展,pyParsing?