正则表达式捕获行首没有空格(flex)

标签 regex lex flex-lexer lexical-analysis

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

检查无缩进的规则出现在检查注释、空行和缩进之后。它也在规则检查其他任何内容之前。这是现在的样子:

<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 行的缩进):

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

鉴于大多数其他规则都能正常工作,我相信正则表达式是上述规则中的问题,但我不明白为什么这个规则大多数时候都失败。有没有人有任何见解?

最佳答案

我不了解 Flex,但我观察到每个有效的示例都是单个字符,而每个无效的示例则不是。也许 flex 匹配的是整个标记而不是单个字符?您可以尝试在字符类后面添加 +

关于正则表达式捕获行首没有空格(flex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207813/

相关文章:

javascript - 在 JavaScript 中获取 URL 的一部分

c - 在 YACC 规则中使用预定义 token (%token) 和使用单个字符之间的区别

flex 和 bison 的 Emacs 模式,或删除这些模式的自动缩进?

javascript - 在进行正则表达式搜索时操作输入字符串

python - 在匹配组中用下划线替换空格字符?

c# - 具有快速访问时间的稀疏矩阵压缩

yacc - 忽略 yacc/lex 中的错误

c++ - 对 `yylex' 的 undefined reference && 对 `yyin' 的 undefined reference

c - Bison 说开始符号不派生任何句子

regex - 使用正则表达式重写规则以添加正斜杠