flex中表示的字符文字

时间:2018-01-09 23:57:54

标签: java flex-lexer yacc lex

我正在尝试使用flex ..在java中为String literal和character literal编写正则表达式。

我能够正确地编写字符串文字,如下所示,但我无法为字符文字编写正则表达式。它只提取第一个字母。

例如:在我的java程序中,我有以下两个变量:

String test_string = "Java is an artificial language.";
char c2  = '\u0041';

在我的flex文件中是:

SP  (u8|u|U|L)
ES  (\\(['"\?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))
WS  [ \t\v\n\f]
%%
({SP}?\"([^"\\\n]|{ES})*\"{WS}*)+   {printf("that's string %s\n",yytext);}
'[^'\\\n]|{ES}' {printf("that's char %s\n",yytext);}

结果是:

id:test_string
that's string "Java is an artificial language."
id:char
id:c2
id:u0041
that's char ';

1 个答案:

答案 0 :(得分:0)

'[^'\\\n]|{ES}'表示'[^'\\\n]{ES}'。我想你想要:

'([^'\\\n]|{ES})'

此外,您的模式宏ES无法识别\uXXXX形式的unicode转义。因此,如果您想要识别'\u0041',则需要添加这些内容。

就个人而言,我认为你试图用你的逃脱模式做太多。我通常只使用\\.\\(.|\n)(第二种模式允许行继续,如果它们尚未被先前的操作删除)。如果您只想识别正确的转义,那么您还需要考虑对错误转义的响应。请记住,词汇扫描程序需要对每个可能的输入执行某事,而不仅仅是每个合法输入。

没有看到你的整个弹性输入我无法确定,但我的猜测是你有一个像. { return *yytext; }这样的后备规则。这一切都非常好,但如果你拒绝使用无效转义模式的字符和字符串文字,这意味着这样的文字将最终调用回退规则,只识别初始引用(或撇号)。这几乎肯定会在解析器中产生错误,但是很难从该错误中恢复,因为您将扫描其余的字符串/字符文字,就像它没有引用一样(并因此最终扫描后面的内容)关闭引用/撇号,好像引用。