在Ragel中解析整数和十六进制值

时间:2017-08-18 12:40:10

标签: parsing 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;
}

1 个答案:

答案 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::stringstreamint。所以最后得到:

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

这可能是你想要的。