2017-03-04 8 views
0

解析されたテキストファイルから16進数を特定しようとしていますが、すべてが約99%正確ですが、この特定のインスタンス0xa98hに問題があります。この行が見つかるたびに、それは無効であるため、無視するのではなく0xa98を出力します。私はこのコードに非常に多くのバリエーションを試してきましたが、その問題を除外する方法をまだ見つけていません。lexパーサーが正しく16進数を表示しない

[-]?[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

16進数のパターンでは、数字 'a' ... 'f'は考慮されません。 [x|X]での垂直バーは、おそらく間違っている

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

    さらに観測:これを試してみてください。それ以外の場合は、これも動作します: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の上でコンパイルし、フレックスと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が標準出力を生成し、標準出力と一致しないものすべてをエコーするために出力されます。

+0

0xa98hをすべて無視して、私の結果に0xa98が表示されないようにするため、上記のデフォルトルールをバイパスすることは可能ですか? – sippycup

+0

デフォルトのルールをバイパスするには、あなた自身で書き込むことができます:これを中間部分の最後のルールとして使用してください: '。 {/ *すべてを無視する* /} '。 – Scheff

+0

一致する16進数を無視することについて:一致したパターンで行うことは、自分で行ってください。サンプルコードを変更し、 '<< yytext'を削除し、何が起こるかを見ます。 – Scheff

関連する問題