正则表达式,以确定在行的开头没有空格(flex)

时间:2011-03-06 00:30:52

标签: regex lex flex-lexer lexical-analysis

我正在为编译器构造类编写Python语法(用Flex编写)的词法分析器,但是当一行开头没有空格时,我无法获得正常工作的正则表达式(考虑缩进块的结尾)。

检查注释,空行和缩进后,将显示检查没有缩进的规则。它也是在规则检查之前的任何其他事情。这就是现在的样子:

<INITIAL>^[^ \t] {
  printf("DEBUG: Expression ^[^ \\t] matches string: %s\n", yytext);

  /* Dedent to 0 if not mid-expression */
  if(!lineJoin && bracketDepth() == 0)
    changeIndent(0);

  /* Treat line as normal */
  REJECT;
}

据我所知,上面的规则应输出lexed文件中具有实际python代码但不以缩进开头的任何行的调试行。但是,就目前而言,我的许多文本案例中只有很少的行显示它。

例如,调试输出在这个测试用例中无处可见(它也完全错过了第4行的dedent):

myList = [1,2,3,4]
for index in range(len(myList)):
    myList[index] += 1
print( myList )

但是出现在这一行中的每一行:

a = 1 + 1
b = 2 % 3
c = 1 ^ 1
d = 1 - 1
f = 1 * 1
g = 1 / 1

鉴于大多数其他规则都正常工作,我会认为正则表达式是上述规则中的问题,但我不明白为什么这个规则在大多数情况下失败了。有没有人有任何见解?

1 个答案:

答案 0 :(得分:3)

我不知道flex,但我观察到每个工作的样本都是单个字符,而每个不起作用的样本都不是。也许flex匹配整个令牌而不是单个字符?您可以尝试在字符类之后添加+