怎样的使用选择|
是错误的
由Flex规则定义如下:
选择符号应该匹配仅跟在前面的表达式,或者紧跟在后面的表达式 (其实后面还有一个可选的书写方式,后文会提到)
这里面比较重要的是紧跟在
,如果你不按照它的规则来,那么你就会遇到如下情况:
(error-case 01)
...
%%
"+" | "-" { return yytext[0]; }
%%
...
由于没有紧跟在选择符号的两端,导致规则可以匹配前面的"+“符号,却没有办法匹配后面的”-",因为它被Flex丢弃了。
(error-case 02)
我想要换行表示,因为有很多的符号可能共享一个token语义值处理,你可能会写:
...
%%
"+"|
"-" { return yytext[0];}
%%
...
很遗憾它是错的,由于你使用了换行符,想让规则变得更清晰,可是对于Flex来说,"+"号后面的选择符号再后面是换行符
,
而这个换行符并不是显示表示的\n
换行符,却是有flex来处理文件时碰到的的换行符,由于Flex要求规则和语义值处理部分需要在一行中,所以错了。
(error-case 03)
和case01类似,下面这个依旧是错的,编译都无法通过:
...
%%
"+"| "-" {return yytext[0];}
%%
...
选择符号后面并没有紧跟匹配内容,所以会报出Flex语法错误。
如何写选择规则才是对的?
其实也很简单,只要掌握两个原则:
- 如果书写在一行中的正则规则,那么请紧跟着选择符号的两边书写
- 如果书写不在一个中的正则规则,那么请在选择符号前面添加空格并在后面紧跟换行符
修改后的正确例子如下:
(ok-case 01)
...
%%
"+"|"-" { return yytext[0]; }
%%
...
(ok-case 02)
...
%%
"+" |
"-" { return yytext[0]; }
%%
...
多做练习和尝试,这些小问题是很好解决的。
祝你编程愉快。