多行的Flex模式定义

时间:2016-02-03 18:04:56

标签: regex flex-lexer lexer

我在flex中定义了一个很长的模式,有很多或者很多。我想知道是否有一种方法可以将定义写在几行上以提高代码的可读性。像

这样的东西
    %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: unrecognised rule make: *** [all] Error 1

2 个答案:

答案 0 :(得分:1)

flexfor| 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}

使用模式UITextFields而不是显式关键字可以解决虚假匹配的问题,例如&#34;这个&#34;匹配&#34;他的&#34;,&#34;第四&#34;匹配&#34;用于&#34;等等。

答案 1 :(得分:0)

实际问题是第18-19行的LOOP_KWD的多行定义,简单的答案是你不能这样做。

更复杂的答案是每个关键字都应该有自己的规则。否则解析器无法工作。所以你甚至不应该尝试。或者根本不打算用规则识别关键字,只需在IDENTIFIER规则中使用查找表。