Разработка компиляторов

       

Пример Lex-программы


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

Кроме того, будем считать заданной структуры лексических классов и их атрибутов, которые должен порождать наш анализатор (см. след. таблицу):

Регулярное выражениеЛексический класс (token) Атрибут
ws--
ifif_LC-
thenthen_LC-
elseelse_LC-
IdIdentifier_LCPointer to ReprTab
numNumber_LCPointer to ReprTab
<relop_LCLT
<=relop_LCLE
=relop_LCEQ
< >relop_LCNE
>relop_LCGT
>=relop_LCGE

Напишем соответствующую 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);} ...



Содержание раздела