Parsing lex解析器未正确显示十六进制

Parsing lex解析器未正确显示十六进制,parsing,flex-lexer,lex,Parsing,Flex Lexer,Lex,我试图从一个解析的文本文件中识别一个十六进制数,所有内容的准确率都在99%左右,但是我一直对这个实例0xa98h有一个问题。每当它找到这一行时,它将输出0xa98,而不是完全忽略它,因为它是无效的。我尝试了这么多的代码变体,但还没有找到一种方法来排除这个问题 [-]?[0][x|X][0-9A-F]+ {cout << yytext << " Number" << endl; } [-]?[0 ] [x[x] [09aF] +{cOUT< P>十六进制数的

我试图从一个解析的文本文件中识别一个十六进制数,所有内容的准确率都在99%左右,但是我一直对这个实例0xa98h有一个问题。每当它找到这一行时,它将输出0xa98,而不是完全忽略它,因为它是无效的。我尝试了这么多的代码变体,但还没有找到一种方法来排除这个问题

[-]?[0][x|X][0-9A-F]+ {cout << yytext << " Number" << endl; }

<代码> [-]?[0 ] [x[x] [09aF] +{cOUT< P>十六进制数的模式不考虑数字“a”…f′。试试这个:

[-]?[0][xX][0-9a-fA-F]+ {cout << yytext << " Number" << endl; }
在cygwin上使用flex和gcc编译和测试:

$ flex -V
flex 2.6.3

$ flex -otest-hex.cc test-hex.l ; g++ -o test-hex test-hex.cc

$ echo '0xa98h' | ./test-hex
0xa98 Number
h

没有模式匹配
h
。这是打印出来的,因为lex/flex生成一个默认规则来回显所有与标准输出不匹配的内容。

是否可以完全忽略0xa98h并绕过您提到的默认规则,因为我希望0xa98不出现在结果中。要绕过默认规则,您可以将自己作为中间部分的最后一个规则:<代码> {{/*忽略所有其他*/} /代码>。关于忽略匹配的十六进制数:您对匹配模式做的是自己的。修改示例代码,删除<代码>学习<代码> Flex >尝试这个链接或谷歌“Flex手册”。
$ flex -V
flex 2.6.3

$ flex -otest-hex.cc test-hex.l ; g++ -o test-hex test-hex.cc

$ echo '0xa98h' | ./test-hex
0xa98 Number
h