шаблон lex для соответствия десятичной записи в формате ipv4

У меня есть шаблон, который приведен ниже, чтобы соответствовать IPv4-адрес в десятичной записи с точками.

IPV4ADDRESS (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))

и я использую

%x S_rule S_dst_ip

<S_rule>(dst-ip){SPACE}   {

BEGIN(S_dst_ip);

}<S_dst_ip>\{{IPV4ADDRESS}\}  {

/*code to process the sring here.*/
}

соответствовать вводу формы

dst-ip {10.13.12.138}

Теперь я хочу соответствовать

dst-ip { 10.13.12.138 } in addition to dst-ip {10.13.12.138}

Я изменяю IPV4ADDRESS, определенный выше, следующим образом

IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]*

Однако эта модификация, кажется, не соответствует

  dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}

Может кто-то указать на ошибку в моем коде?

1

Решение

Поскольку это «работает для меня», я не могу сказать вам, что не так с вашим кодом, так как вы не показали SSCCE (Короткий, самостоятельный, правильный пример). Вот один из них:

/*IPV4ADDRESS     (([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))*/
IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]*
SPACE [ \t]

%x S_rule S_dst_ip

%%

%{
BEGIN S_rule;
%}

<S_rule>(dst-ip){SPACE}   {
BEGIN(S_dst_ip);
}

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

. { ECHO; }

%%

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

int yywrap(void)
{
return 1;
}

Использование файла тестовых данных на основе текста из вашего вопроса:

dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 }
dst-ip {10.13.12.138}
dst-ip { 10.13.12.138 } OR dst-ip {10.13.12.138}

Программа выше производит (некоторые пустые строки пропущены):

MATCH [{10.13.12.138}]

MATCH [{ 10.13.12.138 }]

MATCH [{10.13.12.138}]

MATCH [{ 10.13.12.138 }]

OR

MATCH [{10.13.12.138}]

Если бы мне пришлось угадывать, что происходит не так, я бы заподозрил, что вам не хватает переключателя обратно в состояние S_rule после признания S_dst_ip (и, возможно, открытие %{ BEGIN S_rule; %} фраза тоже).

Попутно отмечаю, что это примет {999.999.999.999} как адрес IPv4. Тем не менее, это возможно исправить с помощью более строго контролируемого выражения, и это не относится к вашей основной проблеме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]