我試圖從解析的文本文件中識別出十六進制數,並且所有內容都大概99%準確,但是我一直對這個特定的實例0xa98h存在問題。每當它找到這條線時,它將輸出0xa98,而不是完全忽略它,因爲它是無效的。我已經對這段代碼嘗試了很多變體,並且尚未找到排除該問題的方法。lex解析器不能正確顯示十六進制
[-]?[0][x|X][0-9A-F]+ {cout << yytext << " Number" << endl; }
我試圖從解析的文本文件中識別出十六進制數,並且所有內容都大概99%準確,但是我一直對這個特定的實例0xa98h存在問題。每當它找到這條線時,它將輸出0xa98,而不是完全忽略它,因爲它是無效的。我已經對這段代碼嘗試了很多變體,並且尚未找到排除該問題的方法。lex解析器不能正確顯示十六進制
[-]?[0][x|X][0-9A-F]+ {cout << yytext << " Number" << endl; }
十六進制數的模式不考慮數字'a'...'f'。試試這個:
[-]?[0][xX][0-9a-fA-F]+ {cout << yytext << " Number" << endl; }
進一步觀察:
[x|X]
豎線可能是錯誤的。否則,這也將工作:0|a98h
。另一種方法可以是這樣(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; }
編譯和柔性和gcc測試上的cygwin:
$ 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生成默認規則以迴應所有與標準輸出不匹配的內容。
學習'flex'試試這個鏈接[Flex](http://dinosaur.compilertools.net/flex/manpage.html)或google「flex manual」。 – Scheff