以 flex 表示的字符文本



我正在尝试使用 flex 在 java 中为 String 文字和字符文字编写正则表达式。

正如您在下面看到的那样,我能够正确编写字符串文字,但我无法为字符文字编写正则表达式。它只提取第一个字母。

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

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

在我的弹性文件中是:

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

结果是:

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新