GPLex + GPPG

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску

Практическое занятие 1

  • GPLex - генератор сканеров (лексических анализаторов)
  • GPPG - генератор парсеров (синтаксических анализаторов)

Комплект для практического занятия скачиваем отсюда. Состав:

  • LexProjects.sln - файл решения, содержащее проект Lex1.csproj
  • Lex1.csproj - файл демонстрационного проекта для GPLex
  • gplex.exe - исполняемый файл генератора сканеров
  • gppg.exe - исполняемый файл генератора парсеров (он нам понадобится на следующем занятии)
  • ShiftReduceParser.dll - внешняя сборка, необходимая для работы сгенерированного компилятора
  • gplexx.frame - файл, включаемый в генерируемый файл лексического анализатора
  • mymain.cs - основная программа, содержащая создание сканера и сканирование всех лексем в файле
  • my.lex - файл, содержащий правила для генерации лексического анализатора
  • a.txt - файл программы, подаваемой на вход сгенерированному лексеру

Компиляция проекта

  • Выполняем команду gplex.exe /noparser my.lex
При этом генерируется файл my.cs, содержащий код лексера. Ключ /noparser означает, что генерируется лексер без парсера.
  • Открываем и компилируем .sln

Формат .lex-файла

Определения
%%
Правила
%%
Пользовательский код

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

Класс Scanner

  • Основной метод - int yylex() - возвращает номер следующей лексемы (токена)
  • Свойства
string yytext - текст лексемы
int yyline - номер строки лексемы
int yycol - номер столбца лексемы
int yyleng - длина лексемы

Задание 1

  1. Откомпилировать лексический анализатор и запустить его для файла a.txt
  2. Сделать имя файла, обрабатываемого лексическим анализатором, параметром командной строки
  3. Подсчитать количество, среднюю, минимальную и максимальную длину всех идентификаторов
  4. Найти сумму всех целых и сумму всех вещественных в файле
  5. Дана программа, в которой встречаются ключевые слова begin end. Определить, правильно ли они расставлены
  6. По данному тексту слов составить таблицу
слово   список его вхождений в текст в формате (строка,столбец), (строка,столбец)

Практическое занятие 2

Создадим программу для HTML-форматирования кода на языке программирования. Необходимо выделять ключевые слова жирным, строковые литералы - синим, комментарии - серым, цифры - зеленым. Комментарии в {} писать вразрядку (после каждого символа - пробел)

Правила в .lex-файле:

.|\n {
  Console.Write(yytext);
}

- означает, что если встречен любой символ (.) или конец строки (\n), то просто вывести его. Это правило стоит последним, поэтому оно выполняется только если не выполняются другие правила.

Однострочный комментарий можно создать так:

DotChr [^\r\n]
OneLineCmnt  \/\/{DotChr}*

\/ означает символ /, он так пишется, поскольку значок /, написанный без \, имеет другой смысл

^" "+

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

\'[^']*\'

означает "строка, заключенная в одинарные апострофы"

[^']

означает "последовательность символов, не включающая '"

Инициализацию полей провести в статическом методе

public static void Init(){

Состояния лексического анализатора

При работе лексер может переходить из состояния в состояние командой BEGIN(ИмяСостояния);

Для возврата в первоначальное состояние следует вызвать BEGIN(INITIAL);

В другом состоянии могут распознаваться другие лексемы.

Например, вот как делаются многострочные комментарии {...}

В первой секции (до первого %%) следует задать новое состояние:

%x COMMENT

Вход, выход и действия в состоянии COMMENT обрабатываются следующим образом:

"{" {

 // переход в состояние COMMENT
 BEGIN(COMMENT);

}

<COMMENT> "}" {

 // переход в состояние INITIAL
 BEGIN(INITIAL);

}

<COMMENT>{ID} {

 // обрабатывается ID внутри комментария

}


После этого