Flex RegEx not getting matched?



我已经使用 Flex/Bison 大约 6 个小时了,这是我无法解决的第一个问题:

我有以下文件...

state state1: {
1-3: 255
4: 255
}

。我使用 cat 和 | 传递给我的 flex/bison 程序。 弹性文件包含以下行:

bstateb  { return STATE; }

再往下看:

.*         { fprintf(stderr, "Lexer error on line %d: "%s"n", linenum, yytext); exit(-1); }

人们应该认为 \bstate\b 应该在文件中匹配,但事实并非如此。相反,我得到以下输出:

"exer error on line 1: "state state1: {

这在几个方面都很奇怪。首先,Lexer 接缝中的 L 被替换为",但更重要的是,状态不匹配。为什么???

当然,\bstate\b 在 .* 之前,它们在右侧部分。

感谢您的帮助, 一月

(F)Lex 不会在输入中搜索匹配项。它会尝试当前输入位置的所有模式,并选择与最多文本匹配的模式,或者如果多个模式匹配相同数量的文本,则选择最早的模式。下一个 lex 匹配将从前一个结束的地方开始。

.*与行的其余部分匹配。bstateb只能匹配七个字符。所以.*会赢。但是bstateb实际上并不匹配,因为这是lex,而不是<在这里插入您最喜欢的正则表达式语法>并且b表示退格,就像在C程序中一样。

字母 L 被引号覆盖的原因可能是您的输入文件是在 Windows 上创建的,并且在行尾有 \r。.*将匹配包括r,这是一个回车。因此,当您 printf"%s"n时,字符串中替换 %s 的最后一个字符是回车符,这会导致光标移动到当前行中的第一个位置,直到该时间点为止,该行中有一个 L。然后," 打印在 L 的顶部,最后打印换行符,这将开始一个新行。

没有等同于单词边界断言b的 Lex 但这很少是一个问题。几乎所有编程语言的词法扫描器都必须处理保留字也将与标识符模式匹配的问题;但是,最长比赛和第一场比赛规则的组合使此操作变得容易。简而言之,始终将保留字模式放在首位。例如:

do              { return DO; }
double          { return DOUBLE; }
if              { return IF; }
/* ... */
[a-z][a-z0-9]*  { return ID; }

在上面的例子中,你把dodouble的顺序并不重要,因为double更长,但我总觉得你应该把保留字按字母顺序排列,以便整洁。但重要的是 ID 模式排在最后,因为它也匹配所有保留字。

现在考虑对以保留字开头的标识符进行词法分析时会发生什么,例如dog。在这种情况下,DO 模式和 ID 模式都将匹配,但 ID 匹配时间更长,因此它获胜,尽管时间较晚。

最新更新