regex - 多行 Flex 模式定义

标签 regex flex-lexer lexer

我正在 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

最佳答案

lexflex 不接受模式定义中的连续行,但允许规则部分中的换行符。您可以将该规则更改为类似的内容

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/

相关文章:

javascript - 如何匹配正则表达式中的非 ASCII(德语、西类牙语等)字母?

matlab - 在哪里可以找到 MATLAB 的正式语法?

parsing - 用于(非)结构化文本文档的词法分析器/解析器

java - 匹配竖线分隔文件的正则表达式

javascript - 正则表达式 : combine patterns using alternation operator or execute regular expression several times

C++比较并替换stringstream的最后一个字符

使用相同的输入文件多次调用 yyparse()

c - 动态打开和关闭 flex token

c++ - 如何将 std::variant 类型与 %type 指令一起使用

gcc - 无法编译 lex 的输出