Лекс: Как я могу предотвратить совпадение с подстроками? - PullRequest
1 голос
/ 02 марта 2010

Например, я должен конвертировать "int" в "INT". Но если есть слово "целое число", я не думаю, что оно должно превратиться в "INTeger".

Если я определю "int" printf("INT");, то подстроки совпадают. Есть ли способ предотвратить это?

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Я считаю, что следующее захватывает то, что вы хотите.

%{
#include <stdio.h>
%}

ws                      [\t\n ]

%%

{ws}int{ws}         { printf ("%cINT%c", *yytext, yytext[4]); }
.                       { printf ("%c", *yytext); }

Чтобы расширить это за границы слов (в данном случае {ws}), вам нужно будет либо добавить модификаторы к ws, либо добавить дополнительные проверки.

1 голос
/ 02 марта 2010

Лекс выберет правило с максимально длинным соответствием для текущего ввода.Чтобы избежать совпадений подстрок, необходимо добавить дополнительное правило, которое длиннее int.Самый простой способ сделать это - добавить простое правило, которое выбирает любую строку длиной более одного символа, то есть [a-zA-Z]+.Вся программа lex будет выглядеть так: -

%%

[\t ]+          /* skip whitespace */
int { printf("INT"); }
[a-zA-Z]+       /* catch-all to avoid substring matches */

%%

int main(int argc, char *argv[])
   {
   yylex();
   }
1 голос
/ 02 марта 2010

ну вот как я это сделал:

(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");

лучшие предложения приветствуются.

...