[英]Parsing an integer and HEX value in Ragel
我正在嘗試使用Ragel和C ++作為宿主語言來設計解析器。 在特定情況下,可以用兩種格式定義參數:
a. Integer : eg. SignalValue = 24
b. Hexadecimal : eg. SignalValue = 0x18
我有下面的代碼來解析這樣的參數:
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;
但是,在上面定義的解析器命令中,只有整數值(如在a節中定義的)可以正確識別和解析。 如果提供了十六進制數字(例如0x24),則該數字將存儲為“ 0”。 如果是十六進制數,則不會調用任何錯誤。 解析器可以識別十六進制,但存儲的值為“ 0”。
我似乎錯過了Ragel的一些小細節。 有沒有人遇到過類似的情況?
代碼的剩余部分:
//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;
}
FSM並不是問題(對於您執行的任務來說看起來不錯),更多的是C ++編碼問題。 試試這個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
}
請注意,它僅將str
用作字符串緩沖區,並將std::hex
應用於>>
從std::stringstream
到int
。 因此最終您將獲得:
$ ./a.out 245
lInt = 245
$ ./a.out 0x245
lInt = 581
這可能是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.