【问题标题】:Patterns in LexLex 中的模式
【发布时间】:2014-04-14 23:02:32
【问题描述】:

我是 lex 编程的新手,我正在尝试修复这段相对较旧的代码。如果我尝试编译这个 Lex 编译器,就会卡在处理模式 ip6addr 上。看起来它陷入了无限循环。当我尝试编译地址的各个部分时,它将成功完成。我不知道出了什么问题。这些模式来自Flex Manual

下一个小问题是围绕以#.*$ { } 开头的行。 Lex 警告我危险的尾随上下文。我在手册中读到这些是规则第一部分的结尾与第二部分的开头相匹配的模式。但我没有看到任何其他冲突规则。

%{

int params_linecnt = 1;

%}

number  ([[:digit:]]{-}[0])[[:digit:]]*
dec-octet   [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
ip4addr     {dec-octet}\.{dec-octet}\.{dec-octet}\.{dec-octet}

hexdigit    ([a-f]|[A-F]|[0-9])
addr1       {hexdigit}{1,4}":"({hexdigit}{1,4}":")*(":"{hexdigit}{1,4})+
addr2       {hexdigit}{1,4}(":"{hexdigit}{1,4})*"::"
addr3       ({hexdigit}{1,4}":"){7}{hexdigit}{1,4}

h16     [0-9A-Fa-f]{1,4}
ls32        {h16}:{h16}|{ip4addr}

ip6addr1 ({h16}:){6}{ls32}
ip6addr2 ::({h16}:){5}{ls32}
ip6addr3 ({h16})?::({h16}:){4}{ls32}
ip6addr4 (({h16}:){0,1}{h16})?::({h16}:){3}{ls32}
ip6addr5 (({h16}:){0,2}{h16})?::({h16}:){2}{ls32}
ip6addr6 (({h16}:){0,3}{h16})?::{h16}:{ls32}
ip6addr7 (({h16}:){0,4}{h16})?::{ls32}
ip6addr8 (({h16}:){0,5}{h16})?::{h16}
ip6addr9 (({h16}:){0,6}{h16})?::

ip6addr {ip6addr1}|{ip6addr2}|{ip6addr3}|{ip6addr4}|{ip6addr5}|{ip6addr6}|{ip6addr7}|{ip6addr8}|{ip6addr9}

%s STRING

%%

<STRING>[^ \t\n;]+ {
    params_lval.string = strdup(yytext);
    BEGIN 0;
    return T_STRING;
}

[Nn]amed    { BEGIN STRING; return T_NAMED; }
[Aa]ddress  { return T_ADDR; }
[Uu]se      { BEGIN STRING; return T_USE; }
snd_cga_params  { BEGIN STRING; return T_DERFILE; }
snd_cga_priv    { BEGIN STRING; return T_KEYFILE; }
snd_cga_sec { return T_SEC; }
[Ii]nterface    { BEGIN STRING; return T_INTERFACE; }
snd_sig_meth    { BEGIN STRING; return T_SIGMETH; }

[\t ]+          { }
"{"|"}"|";"     { return *yytext; }
#.*$            { }
\n          { params_linecnt++;}

{number} {
    params_lval.num = atoi(yytext); return T_NUMBER;
}

{ip6addr} {
    struct in6_addr addr;
    int i;

    i = inet_pton(AF_INET6, yytext, &addr);
    if (i < 0) {
        applog(LOG_ERR, "Error parsing address %s (line %d): %s",
            yytext, params_linecnt, strerror(errno));
        return T_BAD_TOKEN;
    }

    params_lval.addr6 = addr;
    return T_IPV6_ADDR;
}

【问题讨论】:

  • 您使用的是哪个版本的flex/lex?使用flex 2.5.35,我看不到这些问题中的任何一个。
  • @rici 我在 Arch Linux 发行版上使用 flex 2.5.37
  • 我用2.5.37(从SF下载)试过了,还是没问题。请验证您的源文件是否与问题中的相同,并指定您使用的确切命令行。
  • @rici:我赞成。我对 2.5.37 y'day 也没有任何问题——至少,flex 没有。 (我赞成您的评论,而不是添加“我也是”。)我没有将代码编译为目标代码;样本中没有的东西太多了,我太懒了。
  • @rici 和@jonathan-leffler:我刚刚将我的 Arch Linux 和 flex 更新到了 2.5.39 版,突然间所有问题都消失了。可能是 Arch 存储库中 flex 中的错误。非常感谢,您给了我尝试另一个版本的flex 的提示。

标签: c lex


【解决方案1】:

我刚刚将我的 Arch Linux 和 flex 更新到 2.5.39 版本,突然所有问题都消失了。可能是 Arch 存储库中 flex 中的错误。现在它对我来说是固定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2016-05-04
    相关资源
    最近更新 更多