RSS    

   Реферат: Проектирование трансляторов

     Пробел - любой символ пробела в выражении, если он не  нахо-

дится внутри квадратных скобок, необходимо  заключать  в  двойные

кавычки. Это необходимо, так как пробел и табуляция  используются

Lex в качестве разделителя между определением и действием в  пра-

виле.

                 Операторы регулярных выражений

     Операторы обозначаются символами-операторами, к ним относят-

ся:

     \   ^   ?   *   +   |   $   /   %

           [] {} () <>

     Каждый из этих символов или пар скобок в регулярном  выраже-

нии играет роль оператора. Если необходимо  отменить  специальное

значение символа, обозначающего оператор, перед ним нужно  поста-

вить символ "\" или указать его в двойных кавычках.

     Оператор выделения классов  символов.Квадратные  скобки  за-

дают классы символов, которые в них заключены.

     [abc] означает либо символ "a", либо "b", либо символ "c";

     Знак "-" используется для указания любого символа из  лекси-

кографически упорядоченной последовательности: [A-z] означает лю-

бой латинский символ;

                           Повторители

     Когда необходимо указать повторяемость вхождения  символа  в

регулярном выражении, используют операторы-повторители "*" и "+".

     Оператор "*" означает любое (в том числе и 0) число  вхожде-

ний символа или класса символов. Например: x* любое число вхожде-

ний символа "x"; Оператор "+" означает одно  и  более  вхождений.

Например: x+ одно или более вхождений "x";

                        Операторы выбора

     Операторы: / | ? $ ^ управляют процессом выбора символов.

     Оператор "/": ab/cd "ab" учитывается только тогда, когда  за

ним следует "cd".

     Опeратор "|": ab|cd или "ab", или "cd".

     Опeратор  "?":  x?  означает  необязательный  символ    "x".

     _?[A-Za-z]* означает, что перед цепочкой  любого  количества

латинских букв может быть необязательный знак подчеркивания.

     -?[0-9]+ выделит любое целое число с необязательным  минусом

впереди.

     Оператор "$": x$ означает выбрать символ "x",  если  он  яв-

ляется последним в строке. Стоит перед символом "\n"! abc$  озна-

чает выбрать цепочку "abc", если она завершает строку.

     Оператор "^": ^x означает выбрать символ "x",  если  он  яв-

ляется первым символом строки; ^abc означает выбрать цепочку сим-

волов "abc", если она начинает строку. [^A-Z]* означает все  сим-

волы, кроме прописных латинских букв. Когда символ "^" стоит  пе-

ред выражением или внутри "[]", он выполняет операцию дополнение.

Внутри квадратных скобок символ  "^"  должен  обязательно  стоять

первым у открывающей скобки!

     Оператор {} имеет два различных применения:

     x{n,m} здесь n и m натуральные, m > n. Означает от  n  до  m

вхождений x, например, x{2,7} - от 2 до 7 вхождений x;

     {имя} вместо "{имя}" в данное место выражения будет подстав-

лено определение имени из области определений Lex-программы.

     yytext -  это внешний массив  символов  программы  lex.yy.c,

которую строит Lex. yytext формируется в процессе чтения  входно-

го файла и содержит текст, для которого установлено  соответствие

какому-либо выражению. Этот массив доступен пользовательским раз-

делам Lex-программы.

           Оператор <>. Служебные слова START и BEGIN

     Раздел правил Lex-программы может содержать активные и неак-

тивные правила. Активные правила выполняются  всегда.  Неактивные

выполняются только в тех случаях, когда выполняется некоторое на-

чальное условие.

     Начальные условия Lex-программы помещаются в раздел  опреде-

лений, а неактивные правила помечаются соответствующими  условия-

ми. Оператор Start позволяет  указать  список  начальных  условий

Lex-программы, а оператор BEGIN позволяет  активировать  правила,

помеченные начальными условиями.

     Активные правила имеют следующий синтаксис:

     РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ ДЕЙСТВИЕ

     Неактивные правила имют следующий синтаксис:

     <МЕТКА_УСЛОВИЯ>РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ ДЕЙСТВИЕ

     ВАЖНО: любое правило  должно  начинаться  с  первой  позиции

строки, пробелы и табуляции недопустимы -  они  используются  как

разделители между регулярным выражением и действием в правиле.

     Lex-программа  может  содержать  несколько  помеченных   на-

чальных условий.

     Каждое правило, перед которым указан  оператор  типа  "<МЕТ-

КА>", мы будем называть помеченным  правилом.  Метка  формируется

также как и метка в Си.

     Количество помеченных правил не ограничивается. Кроме  того,

разрешается одно правило помечать несколькими метками,  например:

<МЕТКА1,МЕТКА2,МЕТКА3>x ДЕЙСТВИЕ

     Запятая - обязательный разделитель списка меток !

                     Структура Lex-программы

     Lex-программа включает разделы опредeлений, правил и пользо-

вательских программ. Рассмотрим подробнее способы оформления этих

разделов.

     Все строки, в которых занята  первая  позиция,  относятся  к

Lex-программе. Любая строка, не  являющаяся  частью  правила  или

действия, которая начинается с пробела или табуляции,  копируется

в сгенерированную программу lex.yy.c - результат работы Lex.

                Раздел определений Lex-программы

     Определения, предназначенные для Lex, помещаются перед  пер-

вым %%. Любая строка этого раздела, не содержащаяся между %{ и %}

и начинающаяся в первой  колонке,  является  определением  строки

подстановки Lex. Раздел определений Lexпрограммы может включать:

     - начальные условия;

     - определения;

     - фрагменты программы пользователя;

     - таблицы наборов символов;

     - указатели host-языка;

     - изменения размеров внутренних массивов;

     - комментарии в формате host-языка.

     НАЧАЛЬНЫЕ УСЛОВИЯ задаются в форме:

        %START имя1 имя2 ...

     Если начальные условия определены, то эта строка должна быть

первой в Lex-программе.

     ОПРЕДЕЛЕНИЯ задаются в форме:

        имя трансляция

     В качестве разделителя используется один или более  пробелов

или табуляций. Имя - как обычно, любая последовательность букв  и

цифр, начинающаяся с буквы. Трансляция - это  регулярное  выраже-

ние (или его часть), которое будет  подставлено  всюду  там,  где

указано имя (смотрите третью строку этого примера).

     ФРАГМЕНТЫ ПРОГРАММЫ ПОЛЬЗОВАТЕЛЯ указываются двумя способами:

     - в виде "пробел фрагмент";

     - в виде %{ строки фрагмента программы  пользователя %}

     Такая форма включения пользовательского фрагмента  необходи-

ма для ввода, например, макроопределений Си, которые должны начи-

наться в первой колонке строки. Все  строки  фрагмента  пользова-

тельской программы, размещенные в разделе определений, будут  яв-

ляться внешними для любой функции программы lex.yy.c

     ТАБЛИЦА НАБОРОВ СИМВОЛОВ задается в виде:

   %T

   целое_число   строка_символов

    .........

   целое_число   строка_символов

   %T

     Сгенерированная программа lex.yy.c  осуществляет  ввод-вывод

символов посредством библиотечных функций Lex  с  именами  input,

output, unput. Таким образом, Lex помещает  в  yytext  символы  в

представлении, используемом в  этих  библиотечных  функциях.  Для

внутреннего использования  символ  представляется  целым  числом,

значение которого образовано набором битов,  представляющих  сим-

вол в конкретной ЭВМ.  Пользователю  предоставляется  возможность

менять представление символов (целых констант) с помощью  таблицы

наборов символов. Если таблица символов  присутствует  в  разделе

определений, то любой символ, появляющийся либо во входном  пото-

ке, либо в правилах, должен быть определен  в  таблице  символов.

Символам нельзя назначать число 0 и число, большее  числа,  выде-

ленного для внутреннего представления символов конкретной ЭВМ.

     УКАЗАТЕЛЬ host-языка имеет вид:

     %C для Си;

     %R для Ратфора.

     Если указатель host-языка отсутствует, то по умолчанию  при-

нимается Си.

     ИЗМЕНЕНИЯ РАЗМЕРА ВНУТРЕННИХ МАССИВОВ задаются в форме:

     %x число

     "число" - новый размер массива;

     "x" - одна из букв p - позиции;

     n - состояния;

     e - узлы дерева;

     a - упакованные переходы;

     k - упакованные классы символов;

     o - массив выходных элементов.

     Lex имеет внутренние таблицы,  размеры  которых  ограничены.

При построении программы лексического анализа может произойти пе-

реполнение любой из этих таблиц, о чем Lex сообщает при  построе-

нии лексического анализатора. Пользователю  предоставляется  воз-

можность изменить размеры таблиц (сокращая размеры одних и увели-

чивая размеры других) таким образом, чтобы они не  переполнялись.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.