Предположим, что мы пишем анализатор, который должен уметь обрабатывать условные предложения на базе примитивных выражений, состоящих из идентификаторов и чисел. Приведем правила, задающие лексические классы для такого языка:
Кроме того, будем считать заданной структуры лексических классов и их атрибутов, которые должен порождать наш анализатор (см. след. таблицу):
ws | - | - |
if | if_LC | - |
then | then_LC | - |
else | else_LC | - |
Id | Identifier_LC | Pointer to ReprTab |
num | Number_LC | Pointer to ReprTab |
< | relop_LC | LT |
<= | relop_LC | LE |
= | relop_LC | EQ |
< > | relop_LC | NE |
> | relop_LC | GT |
>= | relop_LC | GE |
Напишем соответствующую Lex-программу:
%{ определение констант %} %% /* регулярные определения */ delim {\t\n} ws {delim}+ letter {A-Za-z} digit {0-9} id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+|-]?{digit}+)? %% {ws} {} if {return (if_LC);} then {return (then_LC);} else {return (else_LC);} {id} {yylval = addToReprTab (); return (Identifier_LC);} {number} {yylval = addToReprTab (); return (Number_LC);} "<" {yylval = LT; return (relop_LC);} ...