这个目的是连接字符串(如果可能的话,用(f)lex),如果它们是连续写的,只用空格分隔。 字符串以“s”开头和结尾。 问题是我使用了状态,虽然它可以连接字符串,但它也会消耗字符串后面的下一个字符/符号。
例如 - “this”“只是”“1 string”id - 这将连接字符串(“这只是1个字符串”),但它也会“消耗”id中的i,从而破坏一个令牌。 有没有办法检查下一个字符/符号而不实际“消耗/处置”(实际上不能想到一个术语)它。
\" yy_push_state(X_STRING); yylval.s = new std::string("");
<X_STRING>\" yy_push_state(X_CONC);
<X_STRING>. yylval.s += yytext;
<X_STRING>\n yyerror("newline in string");
<X_CONC>[ ^\n] ;
<X_CONC>\" yy_pop_state();
<X_CONC>. yy_pop_state(); yy_pop_state(); return STRING
有什么办法吗?
答案 0 :(得分:1)
您可以使用yyless(0)
来重新扫描当前令牌。确保你改变了开始状态,否则你将无限循环。
顺便说一下,如果用BEGIN切换启动条件而不是使用状态堆栈,我认为你的代码会更具可读性。实际上,您可以轻松地避免启动条件,但这会使解释转义序列变得更加复杂。可能更好的方法是通过使用\"[[:space:]]*\"