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;
}
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
@ 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
Sorry es war nicht klar. Versuchen Sie dies: 'SIGNAL_VAL = (INT | HEX)%/getSignalWert;' – Bentoy13