在 Ragel 中解析整数和十六进制值
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
这可能就是您想要的。
我正在尝试使用 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
这可能就是您想要的。