flex语法问题记录

pattern要用""括起来吗

无特殊意义的普通字符组成的pattern可用可不用。
用于正则表达式的pattern一旦被""括起来,特殊字符就失去了作用,所以不能用""。
特殊字符可用"",也可用\使其失去特殊作用,变成普通字符。
有些字符只能用转义的方式表示,例如\t、\n,不能用""。
如果pattern中包含空格,用空格更方便。
例:

%%
hello           {printf("match hello\n");}
"world"         {printf("match world\n");}
"[]"            {printf("match []\n");}
\(\)            {printf("match ()\n");}
\n              {printf("match newline\n");}
"\\n"            {printf("match \\n\n");}
%%
image.png

精确pattern(纯字符串)与模糊pattern(正则表达式)有优先级吗

没有,精确pattern并不比模糊pattern优先级更高。
flex会尽量匹配更多的字符。不会在遇到一个完全匹配的精确pattern时就停止匹配,而是尝试继续往后匹配,能匹配多长就匹配多长。
例如:

%%
"hello world"    {printf("match hello\n");}
"hello "[a-z]+   {printf("match hello regex\n");}
%%
image.png

如果输入"hello world"确实会匹配到第一个规则。


image.png

这里也并不是因为精确pattern比模糊pattern优先级高,纯粹只是精确pattern规则排在模糊pattern规则前面而已。如果把两条规则的顺序调换一下,flex会报警告:


image.png

匹配规则的先后顺序有关系吗

如前所述,匹配规则的顺序定义是有关系的。总的来说,flex匹配pattern的规则就是:

  1. 尽量匹配更多的字符
  2. 如果多条规则匹配到的字符一样,那么选择第一条规则
    所以,书写规则的时候,越精确的规则放到越前面,越模糊的规则放到越后面。
%%
[0-9]+ {printf("match 1111\n");}
[0-9a-zA-Z]+ {printf("match 22222\n");}
%%
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容