Regex Flex正则表达式不匹配?

Regex Flex正则表达式不匹配?,regex,bison,flex-lexer,Regex,Bison,Flex Lexer,我已经与Flex/Bison合作了大约6个小时,这里是我无法解决的第一个问题: 我有以下文件 state state1: { 1-3: 255 4: 255 } …我使用cat和|将其传递给我的flex/bison程序。 flex文件包含以下行: \bstate\b { return STATE; } 再往下看这个: .* { fprintf(stderr, "Lexer error on line %d: \"%s\"\n", linenum, y

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

我有以下文件

 state state1: {
     1-3: 255
     4: 255
 }
…我使用cat和|将其传递给我的flex/bison程序。 flex文件包含以下行:

\bstate\b  { return STATE; }
再往下看这个:

.*         { fprintf(stderr, "Lexer error on line %d: \"%s\"\n", linenum, yytext); exit(-1); }
应该认为\b状态\b应该在文件中匹配,但事实并非如此。相反,我得到以下输出:

"exer error on line 1: "state state1: {
这在几个方面都很奇怪。首先,Lexer接缝中的L被“A”取代,但更重要的是,state没有匹配。为什么

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

谢谢你的帮助, Jan

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

*
匹配行的其余部分。
\bstate\b
只匹配七个字符。因此
*
将获胜。但是
\bstate\b
实际上不匹配,因为这是lex,而
\b
表示退格,就像在C程序中一样

字母L被引号覆盖的原因可能是您的输入文件是在Windows上创建的,并且在\r\n行的末尾有。
*
将匹配一个包含
\r
的回车符。因此,当您打印f
%s“\n
,替换%s的字符串中的最后一个字符是回车符,这会导致光标移动到当前行中的第一个点,在该点之前,该点中有一个L。”。然后在L的上方打印“字符”,最后打印换行符,换行符开始一个新行

没有等效于单词边界断言的Lex,但这很少是一个问题。几乎所有编程语言的词汇扫描程序都必须处理保留字也会与标识符模式匹配的问题;然而,最长匹配和第一匹配规则的组合使其易于识别o这一点。简单地说,始终将保留字模式放在第一位。例如:

do              { return DO; }
double          { return DOUBLE; }
if              { return IF; }
/* ... */
[a-z][a-z0-9]*  { return ID; }
在上面的示例中,您放置
do
double
的顺序并不重要,因为
double
较长,但我始终觉得您应该按字母顺序放置保留字,以保持整洁。但重要的是,ID模式应该放在最后,因为它还匹配所有保留字

现在考虑在用保留词开始的标识符时发生了什么,例如“代码>狗< /代码>。在这种情况下,DO模式和ID模式都匹配,但ID匹配更长,因此它会获胜,尽管稍后。

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

*
匹配行的其余部分。
\bstate\b
只匹配七个字符。因此
*
将获胜。但是
\bstate\b
实际上不匹配,因为这是lex,而
\b
表示退格,就像在C程序中一样

字母L被引号覆盖的原因可能是您的输入文件是在Windows上创建的,并且在\r\n行的末尾有。
*
将匹配一个包含
\r
的回车符。因此,当您打印f
%s“\n
,替换%s的字符串中的最后一个字符是回车符,这会导致光标移动到当前行中的第一个点,在该点之前,该点中有一个L。”。然后在L的上方打印“字符”,最后打印换行符,换行符开始一个新行

没有等效于单词边界断言的Lex,但这很少是一个问题。几乎所有编程语言的词汇扫描程序都必须处理保留字也会与标识符模式匹配的问题;然而,最长匹配和第一匹配规则的组合使其易于识别o这一点。简单地说,始终将保留字模式放在第一位。例如:

do              { return DO; }
double          { return DOUBLE; }
if              { return IF; }
/* ... */
[a-z][a-z0-9]*  { return ID; }
在上面的示例中,您放置
do
double
的顺序并不重要,因为
double
较长,但我始终觉得您应该按字母顺序放置保留字,以保持整洁。但重要的是,ID模式应该放在最后,因为它还匹配所有保留字


现在考虑在用保留词开始的标识符时发生了什么,例如“代码>狗< /代码>。在这种情况下,DO模式和ID模式都匹配,但是ID匹配更长,所以它会赢,尽管稍后。

OK,这是有意义的。我只会考虑第一个匹配。这里有两个问题:1:有吗?关于Flex正则表达式的一些文档(我应该使用什么来代替\b?)2:是否有办法只匹配。*当没有其他正则表达式匹配时,不管它是否匹配更多正则表达式?1)
info Flex
是我的指南(也可从以下网址获得).Patterns是第6节。1a)我从来没有感觉到需要\b,因为有顺序标记化算法。我很幸运,因为我认为没有。2)没有,但通常的方法是匹配列表末尾的“.\n”。如果您想这样做,可以在操作中跳到行的末尾,或者使用开始条件(见第10节)。@Jan,见上文,以防SO没有通知您。显然,对我来说太晚了。非常感谢!我只是想到我用来匹配名称的正则表达式(我使用\b的原因,可能有state1等)会匹配更多字符,因此,它