gpt4 book ai didi

c - Lex 中的模式

转载 作者:行者123 更新时间:2023-11-30 17:35:09 24 4
gpt4 key购买 nike

我是 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;
}

最佳答案

我刚刚将 Arch Linux 和 flex 更新到版本 2.5.39,突然间所有问题都消失了。也许这是 Arch 存储库中的 flex 中的错误。现在它对我来说已经修复了。

关于c - Lex 中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23071884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com