2017-08-18 3 views
0

Ich versuche, einen Parser mit Ragel und C++ als Host-Sprache zu entwerfen. Es ist ein besonderer Fall, in dem ein Parameter kann in zwei Formaten definiert werden:Parsing einer ganzen Zahl und HEX-Wert in Ragel

a. Integer : eg. SignalValue = 24 
b. Hexadecimal : eg. SignalValue = 0x18 

ich den Code unten haben eine solche Parameter zu analysieren:

INT = ((digit+)$incr_Count) %get_int >!(int_error); #[0-9] 
HEX = (([0].'x'.[0-9A-F]+)$incr_Count) %get_hex >!(hex_error); #[hexadecimal] 

SIGNAL_VAL = (INT | HEX) %/getSignalValue; 

jedoch in dem oben definierten Parser-Befehl, nur Die Integer-Werte (wie in Abschnitt a definiert) werden korrekt erkannt und analysiert. Wenn eine Hexadezimalzahl (zB 0x24) angegeben wird, wird die Nummer als '0' gespeichert. Im Falle einer Hexadezimalzahl wird kein Fehler aufgerufen. Der Parser erkennt das Hexadezimalzeichen, aber der gespeicherte Wert ist '0'.

Ich scheine mit Ragel einige kleine Details zu verpassen. Hat jemand eine ähnliche Situation erlebt?

Der remaning Teil des Codes:

//Global 
int lInt = -1; 


action incr_Count { 
    iGenrlCount++; 
} 

action get_int { 
    int channel = 0xFF; 
    std::stringstream str; 
    while(iGenrlCount > 0) 
    { 
    str << *(p - iGenrlCount); 
    iGenrlCount--; 
    } 
    str >> lInt; //push the values 
    str.clear(); 
} 


action get_hex { 
std::stringstream str; 
while(iGenrlCount > 0) 
{ 
    str << std::hex << *(p - iGenrlCount); 
    iGenrlCount--; 
} 
str >> lInt; //push the values 
} 

action getSignalValue { 
    cout << "lInt = " << lInt << endl; 
} 
+0

Haben Sie versucht, INT und HEX in Ihrer Definition zu invertieren? Ich vermute, dass Ragel nicht das längste, aber das erste Spiel macht. – Bentoy13

+0

@ Bentoy13: was genau meinst du, indem du meine eigene INT und HEX erfindest? Ich habe versucht, INT = (([0-9] +) $ incr_Count)% get_int' und es hat nicht funktioniert – user2559758

+0

Sorry es war nicht klar. Versuchen Sie dies: 'SIGNAL_VAL = (INT | HEX)%/getSignalWert;' – Bentoy13

Antwort

0

Es ist nicht ein Problem mit der FSM (die für die Aufgabe, die Sie haben gut aussieht), ist es eher ein C++ Ausgabe Codierung. Versuchen Sie, diese Implementierung von get_hex():

action get_hex { 
std::stringstream str; 
cout << "get_hex()" << endl; 
while(iGenrlCount > 0) 
{ 
    str << *(p - iGenrlCount); 
    iGenrlCount--; 
} 
str >> std::hex >> lInt; //push the values 
} 

Beachten Sie, dass es str nur als String-Puffer verwendet und gilt std::hex zu >> von std::stringstream zu int. Also am Ende erhalten Sie:

$ ./a.out 245 
lInt = 245 
$ ./a.out 0x245 
lInt = 581 

Was wahrscheinlich ist, was Sie wollen.

+0

arghh. Perfekt !! Es hat funktioniert. – user2559758

Verwandte Themen