首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ragel中解析“newline”的问题

在Ragel中解析“newline”的问题
EN

Stack Overflow用户
提问于 2017-08-28 18:30:26
回答 1查看 148关注 0票数 0

我使用Ragel和C++作为主机来解析一些命令。命令从文件中读取,然后使用以下语法进行解析。

该命令的语法如下:

代码语言:javascript
复制
Signal_representation {
[<signal_encoding_type_name>: <signal_name> ([, <signal_name>]) ;]
}

现在,在上面的语法中,可以在:之后或信号名称之后加上换行符,后面跟着逗号,

代码语言:javascript
复制
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语法。

代码语言:javascript
复制
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文档,有限状态机space必须检测到以下内容

Whitespace. [\t\v\f\n\r ]

我还尝试用以下FSM替换空格:

_CR = ('\r' | '\n' | '\r\n' );

但即使是上面的方法也不起作用。

有没有人遇到过类似的情况?我在Stackoverflow上看到了一些关于Ragel和newline的问题,但它似乎没有特别解决这里的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-12 22:38:22

您必须将逻辑分成两部分,而不是一部分。

例如:未测试

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45916942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档