簡體   English   中英

在Ragel中解析整數和HEX值

[英]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::stringstreamint 因此最終您將獲得:

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

這可能是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM