簡體   English   中英

在Ragel中解析“換行”的問題

[英]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.

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