2017-03-04 33 views
0

我試圖從解析的文本文件中識別出十六進制數,並且所有內容都大概99%準確,但是我一直對這個特定的實例0xa98h存在問題。每當它找到這條線時,它將輸出0xa98,而不是完全忽略它,因爲它是無效的。我已經對這段代碼嘗試了很多變體,並且尚未找到排除該問題的方法。lex解析器不能正確顯示十六進制

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

學習'flex'試試這個鏈接[Flex](http://dinosaur.compilertools.net/flex/manpage.html)或google「flex manual」。 – Scheff

回答

0

十六進制數的模式不考慮數字'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; } 

編譯和柔性和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生成默認規則以迴應所有與標準輸出不匹配的內容。

+0

是否可以完全忽略0xa98h並繞過您提到的默認規則,因爲我寧願讓0xa98不出現在我的結果中。 – sippycup

+0

要繞過默認規則,您可以自己寫一個:將其用作中間部分的最後一條規則: '。 {/ *忽略其他所有* /}'。 – Scheff

+0

關於忽略匹配的十六進制數字:您對匹配的模式做了什麼是您自己的。修改示例代碼,刪除'<< yytext'並觀察發生了什麼。 – Scheff