Как построить LEX для этого? - PullRequest
1 голос
/ 24 декабря 2009

Я хочу заставить автоматы принимать следующие регулярные выражения, используя lex и yacc. Регулярное выражение: R = (ab + a) *.

Может кто-нибудь помочь мне сконструировать этот автомат, используя lex и yacc.

Спасибо.

1 Ответ

1 голос
/ 24 декабря 2009

Первое, что приходит на ум, это что-то вроде этого. Не завершенные программы, но кое-что, с чего можно начать:

Сканер (лекс):

%%
a           return TOKENA; /* for an a in the input */
b           return TOKENB; /* for a b in the input */
\n                      /* ignore end of line */;
[ \t]+                  /* ignore whitespace */;
%%

Парсер (yacc):

commands: /* empty */
        | commands command
        { printf("found a (ab + a)* pattern"); }

command:
        ab
        |
        a
        ;

ab: TOKENA TOKENB
    ;
a: TOKENA
    ;

Я не совсем уверен, работает ли грамматика или есть конфликты редукции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...