[英]Issues with parsing 'newline' in Ragel
我使用Ragel和C ++作為主機來解析一些命令。 從文件中讀取命令,然后使用以下語法對其進行解析。
該命令的語法如下:
Signal_representation {
[<signal_encoding_type_name>: <signal_name> ([, <signal_name>]) ;]
}
現在,在上面的語法中,在:
或信號名稱后跟逗號,
之后可以有一個換行符,
example:
#1 Signal_representation{
#2 Activity:
#3 Button_Active,
#4 Buttons_Inactive;
#5 Switch:
#6 Horn,
#7 Up_Arrow,
#8 Right_Arrow,
#9 Down_Arrow,
#10 Audio,
#11 Day_Night, Sleep, SWM_Off;
#12 }
這是我解析上述命令時遵循的Ragel語法。
action string_error {
cout << " ERROR::Expected string characters at line = "<< g_ReadLineNbr << endl;
}
action incr_Count {
//increment count to trace back and retrieve the string encountered
iGenrlCount++;
}
action getString {
std::stringstream str;
while(iGenrlCount > 0)
{
str << *(p - iGenrlCount);
iGenrlCount--;
}
str >> GeneralStr; //push the values
}
action getSglEncTyp {
cout << "Enc type = " << GeneralStr<< endl;
GeneralStr.clear();
}
action getSgnlName {
cout << "Signal name = " << GeneralStr<< endl;
GeneralStr.clear();
}
action getSgnlRepr {
cout << "parse ok" << endl;
}
action parse_error {
cout << "parse failed" << endl;
}
// my definition of Ragel grammar
OPEN_BRACES = '{';
BARE_STRING = ([a-zA-Z0-9_\.\-]+) $incr_Count %getString >!(string_error);
CLOSE_BRACES = '}';
//parsing starts from the parameter <signal_encoding_type_name>
signal_repr = (space* BARE_STRING%getSglEncTyp space* ':' space* BARE_STRING%getSgnlName (space* ',' space* BARE_STRING%getSgnlName)* space* ';' space*)%/getSgnlRepr $!parse_error;
main := signal_repr | space* ;
//global variables in C++ prgram visible across all actions
string GeneralStr;
int iGenrlCount = 0;
我面臨的問題是文件中遇到的新行。 對於上面給出的示例,我得到以下錯誤ERROR::Expected string characters at line = 2
根據Ragel 6.10文件,FSM space
必須檢測以下內容
Whitespace. [\\t\\v\\f\\n\\r ]
我還嘗試過使用以下FSM替換空間:
_CR = ('\\r' | '\\n' | '\\r\\n' );
但即使是以上方法也不起作用。
有沒有人遇到過類似的情況? 我在Stackoverflow上看到了一些有關Ragel和換行符的問題,但似乎在這里並沒有特別解決。
您必須將邏輯分為兩個部分而不是一個部分。
例如。 未經測試
signal_repr_single_line = (space* BARE_STRING%getSglEncTyp space* ':' space* BARE_STRING%getSgnlName (space* ',' space* BARE_STRING%getSgnlName)* space* ';' space*)%/getSgnlRepr $!parse_error;
signal_repr_multi_line = (space* BARE_STRING%getSglEncTyp space* ':' (space* BARE_STRING%getSgnlName(space* ','{1} space*)));
signal_repr = signal_repr_single_line | signal_repr_multi_line;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.