0

我有一个包含以下代码的 lex 文件 port_regex.l。

DECIMAL_16bits [ \t]*[:digit:]{1,4}[ \t]*
SPACE [ \t]

%x S_rule S_dst_port

%%

%{
    BEGIN S_rule;
%}

<S_rule>(dst-port){SPACE}   {
           BEGIN(S_dst_port);
        }

<S_dst_port>\{{DECIMAL_16bits}\}  {
       printf("\n\nMATCH [%s]\n\n", yytext);
       BEGIN S_rule;
     }

. { ECHO; }

%%

int main(void)
{
    while (yylex() != 0)
        ;
    return(0);
}

int yywrap(void)
{
    return 1;
}

我从它创建一个可执行文件,如下所示。

flex port_regex.l
gcc lex.yy.c -o port_regex

它创建了一个名为 port_regex 的可执行文件。

我有一个包含名为 port.file 的测试数据的文件,如下所示。

dst-port {234}
dst-port {236}
dst-port {233}
dst-port {2656}

如何使用 port_regex 可执行文件测试 port.file。

我可以做类似的事情吗

./port_regex < port.file

我尝试了上面的方法,它似乎不起作用??

4

1 回答 1

1

只要您的应用程序不会变得更复杂,我认为使用启动条件是一个好方法,而不是引入 yacc 生成的解析器。

几个想法:

BEGIN(comment)我看到的示例有时在 BEGIN ( )中使用括号,有时在 ( BEGIN comment) 中不使用括号。我怀疑这有什么不同,但你应该保持一致。

这本书说,回显不匹配字符的默认规则仍然有效,即使在独占开始条件下,所以你不应该需要

. { ECHO; }

并且由于您的开始条件是排他性的,因此无论如何它都不会触发。只是为了确保,您可以将其重写为

<*>.|\n     ECHO;
于 2013-01-10T16:23:03.220 回答