2017-03-04 1 views
0

Ich versuche, eine Hex-Nummer aus einer geparsten Textdatei zu identifizieren und alles ist etwa 99% genau, aber ich habe ein Problem mit dieser bestimmten Instanz 0xa98h. Wann immer es diese Zeile findet, wird es 0xa98 ausgeben, anstatt es ganz zu ignorieren, da es nicht gültig ist. Ich habe so viele Variationen dieses Codes ausprobiert und muss noch einen Weg finden, dieses Problem auszuschließen.lex Parser nicht Hex korrekt angezeigt

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

Um Flex zu lernen, versuchen Sie diesen Link [Flex] (http://dinosaur.compilertools.net/flex/manpage.html) oder google "Flex Handbuch". – Scheff

Antwort

0

Das Muster für Hex-Zahlen berücksichtigt keine Ziffern 'a' ... 'f'. Versuchen Sie folgendes:

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

Weitere Beobachtungen:

  1. Der vertikale Balken in [x|X] wahrscheinlich falsch ist. Ansonsten würde das auch funktionieren: 0|a98h.
  2. Das 'h' am Ende der Probe ist nicht abgestimmt. (Dies kann oder kann nicht bestimmt.)

Ein alternativer Ansatz könnte sein, diese (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; } 

Zusammengestellt und getestet mit Flex und gcc auf 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 

Es gibt kein Muster, das zu h passt. Dies wird gedruckt, weil lex/flex eine Standardregel generiert, um alles zu echotieren, was nicht mit der Standardausgabe übereinstimmt.

+0

Ist es möglich, 0xa98h ganz zu ignorieren und die von Ihnen erwähnte Standardregel zu umgehen, weil ich lieber 0xa98 nicht in meinen Ergebnissen erscheinen lassen würde. – sippycup

+0

Um die Standardregel zu umgehen, können Sie selbst eine schreiben: Verwenden Sie dies als die allerletzte Regel im mittleren Teil: '. {/ * ignoriere alles andere * /} '. – Scheff

+0

Über das Ignorieren der übereinstimmenden Hex-Nummer: Was Sie mit dem übereinstimmenden Muster tun, ist allein. Ändern Sie den Beispielcode, entfernen Sie << yytext und beobachten Sie, was passiert. – Scheff