我正在 Flex 中定义一个非常长的模式,有很多 or 情况。我想知道是否有一种方法可以将定义写在几行上以提高代码的可读性。类似的东西
%option noyywrap
1 %{
...
14 %}
15
16 DIGIT [0-9]
17 ID [a-z][a-z0-9]*
18 LOOP_KWD for|while|
19 his|her //THIS IS WHAT I WOULD LIKE
20 SELECT_KWD if|else
21 STRING \".*\"
22 COMP_OP <|>|==]
29
30 %%
31
32 {DIGIT}+ {
33 printf("INT_NUM<%s>", yytext);
34 }
35
36 {INCLUDE} {
37 printf("PREPROCESSOR_INCLUDE");
38 }
39 {LOOP_KWD} {
40 printf("LOOP_KWD<%s>", yytext);
41 }
42 {SELECT_KWD} {
43 printf("SELECT_KWD<%s>", yytext);
44 }
当我尝试运行它时,它给出:
flex -o tokenize.c my_first_token.l
my_first_token.l:40:无法识别的规则
make: *** [全部] 错误1
最佳答案
lex
和 flex
不接受模式定义中的连续行,但允许规则部分中的换行符。您可以将该规则更改为类似的内容
for|
while|
his|
her {
printf("LOOP_KWD<%s>", yytext);
}
虽然我发现最好使用查找表,但词法分析器只关心语法。您有一个可以使用的 {ID}
模式,例如,
{ID} {
int n;
for (n = 0; table[n] != 0; ++n) {
if (!strcmp(yytext, table[n])) {
printf("keyword<%s>", yytext);
break;
}
}
}
和表格(当然在代码部分):
const char *table[] = { "for", "while", "his", "her", 0 };
使用模式{ID}
而不是显式关键字可以解决虚假匹配的问题,例如“this”匹配“his”,“forth”匹配“for”等。
关于regex - 多行 Flex 模式定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184414/