lex解析器没有正确显示十六进制

时间:2017-03-04 04:42:33

标签: parsing flex-lexer lex

我正在尝试从解析的文本文件中识别十六进制数字,并且所有内容都准确率达到99%但是我仍然遇到此特定实例0xa98h的问题。每当它找到这一行时,它将输出0xa98而不是完全忽略它,因为它无效。我已经尝试了很多此代码的变体,并且尚未找到排除该问题的方法。

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

1 个答案:

答案 0 :(得分:0)

十六进制数字的模式不考虑数字'a'...'f'。试试这个:

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

进一步观察:

  1. [x|X]中的竖线可能错误。否则,这也可以:0|a98h
  2. 样本末尾的'h'不匹配。 (这可能是也可能不是。)
  3. 另一种方法可能是这个(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生成一个默认规则来回显与标准输出不匹配的所有内容。