我正在尝试使用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;
}
答案 0 :(得分:0)
这对你的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
这可能是你想要的。