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



我正在尝试从解析的文本文件中识别十六进制号,并且一切都准确99%,但是我一直在此某个实例0xa98h遇到问题。每当找到此行时,它将输出0xA98,而不是完全忽略它,因为它是无效的。我尝试了此代码的许多变体,但尚未找到一种排除该问题的方法。

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

十六进制数字的模式不考虑数字'a'...'f'。尝试以下操作:

[-]?[0][xX][0-9a-fA-F]+ {cout << yytext << " Number" << endl; }

进一步的观察:

  1. [x|X]中的垂直条可能是错误的。否则,这也将起作用:0|a98h
  2. 样品结束时的" H"不匹配。(这可能是可能的。)

另一种方法可能是( test-hex.l):

%{
#include <iostream>
using namespace std;
%}
%option caseless
%%
[-]?[0][x][0-9a-f]+ {cout << yytext << " Number" << endl; }
%%
int main(int argc, char **argv) { return yylex(); }
int yywrap() { return 1; }

在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生成默认规则以呼应所有与标准输出不匹配的所有内容。

最新更新