Cas*_*ton 6 lexical-analysis tokenize flex-lexer
如果这个帖子的标题有点令人困惑,我很抱歉.我要问的是Flex(词法分析器)如何处理优先级问题?
例如,假设我有两个具有相似正则表达式的令牌,按以下顺序编写:
"//"[!\/]{1} return FIRST;
"//"[!\/]{1}\< return SECOND;
Run Code Online (Sandbox Code Playgroud)
如果输入"//!<",将返回FIRST或SECOND吗?或两者?
第一个字符串将在SECOND字符串之前到达,但似乎返回SECOND将是正确的行为.
Bar*_*ers 11
返回最长的匹配.
Flex如何处理模糊模式
大多数flex程序都很模糊,有多个模式可以匹配 相同的输入.Flex通过两个简单的规则解决了歧义:
- 每次扫描仪匹配输入时匹配最长的字符串.
- 如果是平局,请使用程序中首先出现的模式.
你可以自己测试一下,当然:
%%
"//"[!/] {printf("FIRST");}
"//"[!/]< {printf("SECOND");}
%%
int main(int argc, char **argv)
{
while(yylex() != 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,/并且<不需要转义,并且{1}是多余的.
bart@hades:~/Programming/GNU-Flex-Bison/demo$ flex demo.l
bart@hades:~/Programming/GNU-Flex-Bison/demo$ cc lex.yy.c -lfl
bart@hades:~/Programming/GNU-Flex-Bison/demo$ ./a.out < in.txt
SECOND
Run Code Online (Sandbox Code Playgroud)
哪里in.txt包含//!<.
| 归档时间: |
|
| 查看次数: |
4539 次 |
| 最近记录: |