处理字符串时解析错误
parse error when handling strings
%option case-insensitive
%option noyywrap
%option yylineno
id [a-zA-Z][a-zA-Z_0-9]*
integer (0[xX][0-9A-Fa-f]+)|([0-9]+)
real [0-9]*\.[0-9](e|E)?[0-9]*
undefined [^"\r\n \t]
%x STR
%%
\" string_buf_ptr = string_buf; BEGIN(STR);
<STR>\" { /* saw closing quote - all done */
BEGIN(INITIAL);
*string_buf_ptr = '[=10=]';
/* return string constant token type and
* value to parser
*/
yylval.strVal = strdup(string_buf);
sprintf(yyout, yylval.strVal);
return STR;
}
<STR>\n *string_buf_ptr++ = '\n';
<STR>\t *string_buf_ptr++ = '\t';
<STR>\r *string_buf_ptr++ = '\r';
<STR>\b *string_buf_ptr++ = '\b';
<STR>\f *string_buf_ptr++ = '\f';
<STR>\(.|\n) *string_buf_ptr++ = yytext[1];
<STR>[^\\n\"]+ {
char *yptr = yytext;
while ( *yptr )
*string_buf_ptr++ = *yptr++;
}
这是我的字符串词法分析代码的一部分。这段代码的目标是定位字符串(类似 C 的字符串,例如 "Hello World"
)并将它们 return 到我们的解析器进行处理。
我还使用 Yacc
工具构建了一个解析器,它几乎是完美的,除非我们将字符串分配给变量(例如 x="Hello World";
)
当我这样做时,将调用 yyerror(const char*)
函数并且消息是 unexpected $undefined.
我不明白为什么会这样。减少应该识别 left value
x
、assignment
和 constant String
"Hello World"
,我错了什么?
问题是您显然已将 STR
定义为标记和 lex 起始状态。这两个实际上都是宏(扩展为整数常量文字),因此您可能会收到关于宏 STR
在编译器输出中某处被重新定义的警告。上面代码中的 return STR;
最终返回 STR
的开始状态代码而不是令牌代码,bison 生成的解析器无法将其识别为有效令牌代码。
%option case-insensitive
%option noyywrap
%option yylineno
id [a-zA-Z][a-zA-Z_0-9]*
integer (0[xX][0-9A-Fa-f]+)|([0-9]+)
real [0-9]*\.[0-9](e|E)?[0-9]*
undefined [^"\r\n \t]
%x STR
%%
\" string_buf_ptr = string_buf; BEGIN(STR);
<STR>\" { /* saw closing quote - all done */
BEGIN(INITIAL);
*string_buf_ptr = '[=10=]';
/* return string constant token type and
* value to parser
*/
yylval.strVal = strdup(string_buf);
sprintf(yyout, yylval.strVal);
return STR;
}
<STR>\n *string_buf_ptr++ = '\n';
<STR>\t *string_buf_ptr++ = '\t';
<STR>\r *string_buf_ptr++ = '\r';
<STR>\b *string_buf_ptr++ = '\b';
<STR>\f *string_buf_ptr++ = '\f';
<STR>\(.|\n) *string_buf_ptr++ = yytext[1];
<STR>[^\\n\"]+ {
char *yptr = yytext;
while ( *yptr )
*string_buf_ptr++ = *yptr++;
}
这是我的字符串词法分析代码的一部分。这段代码的目标是定位字符串(类似 C 的字符串,例如 "Hello World"
)并将它们 return 到我们的解析器进行处理。
我还使用 Yacc
工具构建了一个解析器,它几乎是完美的,除非我们将字符串分配给变量(例如 x="Hello World";
)
当我这样做时,将调用 yyerror(const char*)
函数并且消息是 unexpected $undefined.
我不明白为什么会这样。减少应该识别 left value
x
、assignment
和 constant String
"Hello World"
,我错了什么?
问题是您显然已将 STR
定义为标记和 lex 起始状态。这两个实际上都是宏(扩展为整数常量文字),因此您可能会收到关于宏 STR
在编译器输出中某处被重新定义的警告。上面代码中的 return STR;
最终返回 STR
的开始状态代码而不是令牌代码,bison 生成的解析器无法将其识别为有效令牌代码。