首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符文字在flex中表示

字符文字在flex中表示
EN

Stack Overflow用户
提问于 2018-01-10 07:57:54
回答 1查看 626关注 0票数 0

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

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

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

代码语言:javascript
复制
String test_string = "Java is an artificial language.";
char c2  = '\u0041';

在我的flex文件中是:

代码语言:javascript
复制
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);}

结果是:

代码语言:javascript
复制
id:test_string
that's string "Java is an artificial language."
id:char
id:c2
id:u0041
that's char ';
EN

回答 1

Stack Overflow用户

发布于 2018-01-10 15:19:35

'[^'\\\n]|{ES}'的意思是'[^'\\\n]{ES}'。我猜你想要:

代码语言:javascript
复制
'([^'\\\n]|{ES})'

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

就我个人而言,我认为你在转义模式上做得太多了。例如,我通常只使用\\.\\(.|\n) (第二种模式允许行延续,如果它们还没有被先前的操作删除)。如果您只想识别正确的转义,那么您还需要仔细考虑对不正确转义的响应。请记住,词法扫描器需要处理所有可能的输入,而不仅仅是所有合法的输入。

在没有看到整个flex输入的情况下,我不能确定,但我猜您有一个像. { return *yytext; }这样的后备规则。这一切都很好,但是如果您拒绝使用无效转义模式的字符和字符串文字,这意味着这些文字最终将调用回退规则,只识别首引号(或撇号)。这几乎肯定会在解析器中产生错误,但很难从该错误中恢复过来,因为您将扫描字符串/字符文本的其余部分,就像它没有被引号一样(因此将最终扫描右引号/撇号后面的内容,就像它被引用一样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48178425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档