我正在为编译器构造类的 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/