(F)Lex检查符号而不“消耗”它

时间:2015-05-19 21:01:46

标签: string concatenation flex-lexer lex

这个目的是连接字符串(如果可能的话,用(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

有什么办法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用yyless(0)来重新扫描当前令牌。确保你改变了开始状态,否则你将无限循环。

顺便说一下,如果用BEGIN切换启动条件而不是使用状态堆栈,我认为你的代码会更具可读性。实际上,您可以轻松地避免启动条件,但这会使解释转义序列变得更加复杂。可能更好的方法是通过使用\"[[:space:]]*\"

的规则来避免X_CONC