野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
Bison/yacc parser skipping grammer when not separated by space - "unexpected $end"
嗨,我有一个场景,如果有一个空格分隔语法,野牛将成功解析我的输入......
情况如下:我正在尝试声明一个变量:
int a = 31 ;
此 yyin 解析成功
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; }
;
这是我的弹性文件的一部分
[ tn] ;
[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
会以静默方式隐藏令牌不是有效数字的事实。考虑使用更安全的字符串→数字转换器;您可以在C++标准库中找到一个;在 C 中,strtod
后会检查endptr
是否在末尾。(您可以在词法分析器中进行此转换,避免不必要的字符串分配和取消分配。
相关文章:
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- 在 armhf 上使用 cmake 在 qt 上的编译问题 "Syntax error: wird unexpected (expecting " ) " "
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- 尝试在类中编译内核,出现错误"__init__() got an unexpected keyword argument 'kernel'"
- 使用变换翻转地图,接收错误"type int unexpected"
- Netbeans 中的C++:许多毫无意义的"unexpected token"提示
- 构造函数和析构函数之间的"unexpected"配对。为什么要这样工作?
- 错误luaL_doString " unexpected symbol near '/' "
- 为什么当我在使用空 throw() 说明符指定的函数中抛出异常时没有调用 std::unexpected()
- "unexpected in macro definition"
- 为什么浮点数是"unexpected type"
- 为什么不调用函数unexpected
- 为什么即使unexpected handler()抛出指定的异常,仍然调用terminate() ?
- c++ cout给出带解引用指针的unexpected
- 谁能告诉我什么时候调用terminate(),什么时候调用unexpected() ?
- 在消息反序列化期间,python中的Protobuf抱怨'Unexpected end-group tag.'
- C++ 无意义的错误:c2629 "Unexpected class"、c2065:'ceil'未声明的标识
- Unexpected #else