0

有以下 Ragel 正则表达式:

pri_repeat      = ("<" [0-9]{1,5} ">");
sp              = " ";
host_info       = (((ascii - sp)+ - pri_repeat) >begin %on_host_info)
                         ((pri_repeat){0,1} >on_host_info_pri_repeat_begin $!on_host_info_pri_repeat_error);

这里假设如果字符串包含表单的子字符串S = '<123',那么我们需要切换到消息将被捕获到该子字符串的状态S

以及以下 Ragel 动作:

action begin
{
    val_begin = p;
    cs_val_begin = cs;
}

action on_host_info
{
    // ... 
    LOG_INFO(L, "`on_host_info` action [host_info = %s]", value.c_str());
}

action on_host_info_pri_repeat_begin
{
    LOG_INFO(L, "`on_host_info_pri_repeat_begin` action [data = %s]",
            std::string(p, pe - p).c_str());
}

action on_host_info_pri_repeat_error
{
    LOG_INFO(L, "`on_host_info_pri_repeat_error` state [data = %s]",
             std::string(p, pe - p).c_str());
    fgoto host_info;
}

输入字符串: "IKWMC71:03138808,msu=816688275211201112\n<13"

日志显示以下内容:

13:20:48.598170 [ntdec.syslog_v1_cli_parser]      INFO: `on_host_info` action [host_info = IKWMC71:03138808,msu=816688275211201112
]
13:20:48.598180 [ntdec.syslog_v1_cli_parser]      INFO: `on_host_info_pri_repeat_begin` action [data = <13]
13:20:48.598477 [ntdec.syslog_v1_cli_parser]      INFO: `on_host_info` action [host_info = IKWMC71:03138808,msu=816688275211201112
<13]
13:20:48.598484 [ntdec.syslog_v1_cli_parser]      INFO: `on_host_info_pri_repeat_begin` action [data = ] 
13:20:48.598487 [ntdec.syslog_v1_cli_parser]      INFO: `on_end` action: [is_hostname = 1, !host_info.hostname.empty = 1, message.value.size = 0]
13:20:48.598490 [ntdec.syslog_v1_cli_parser]      INFO: `on_end` action: msg := move(host_info)
13:20:48.598492 [ntdec.syslog_v1_cli_parser]      INFO: `on_eof` action
13:20:48.598495 [ntdec.syslog_v1_cli_parser]      INFO: syslog_v1_cli_parser return status = 0 

如您所见,在到达 substring 之后S,FSM 再次返回到 action on_host_info。为什么?如何确保机器不返回on_host_info

4

0 回答 0