Реализовать граничные состояния слова в flex / lex (парсер-генератор) - PullRequest
1 голос
/ 02 января 2009

Я хочу иметь возможность предсказать совпадения с образцом, если они происходят после символов слова или после символов, не являющихся словами. Другими словами, я хочу смоделировать \ b word break regex char в начале шаблона, который не поддерживает flex / lex.

Вот моя попытка ниже (которая не работает должным образом):

%{
#include <stdio.h>
%}

%x inword
%x nonword

%%
[a-zA-Z]    { BEGIN inword; yymore(); }
[^a-zA-Z]   { BEGIN nonword; yymore(); }

<inword>a { printf("'a' in word\n"); }
<nonword>a { printf("'a' not in word\n"); }

%%

Ввод:

a
ba
a

Ожидаемый результат

'a' not in word
'a' in word
'a' not in word

фактическая мощность:

a
'a' in word
'a' in word

Я делаю это, потому что хочу сделать что-то вроде диалектизатор , и я всегда хотел научиться использовать настоящий лексер. Иногда шаблоны, которые я хочу заменить, должны быть фрагментами слов, иногда они должны быть только целыми словами.

Ответы [ 2 ]

2 голосов
/ 05 января 2009

Вот что я выполнил:

%{
#include <stdio.h>
%}

WC      [A-Za-z']
NW      [^A-Za-z']

%start      INW NIW

{WC}  { BEGIN INW; REJECT; }
{NW}  { BEGIN NIW; REJECT; }

<INW>a { printf("'a' in word\n"); }
<NIW>a { printf("'a' not in word\n"); }

Таким образом, я могу сделать эквивалент \ B или \ b в начале или конце любого шаблона. Вы можете сопоставить в конце, выполнив a/{WC} или a/{NW}.

Я хотел установить состояния без использования каких-либо символов. Хитрость заключается в использовании REJECT, а не yymore (), что, я думаю, я не до конца понял.

1 голос
/ 03 января 2009
%%
[a-zA-Z]+a[a-zA-Z]* {printf("a in word: %s\n", yytext);}
a[a-zA-Z]+ {printf("a in word: %s\n", yytext);}
a {printf("a not in word\n");}
. ;

Тестирование:

user@cody /tmp $ ./a.out <<EOF
> a
> ba
> ab
> a
> EOF
a not in word

a in word: ba

a in word: ab

a not in word
...