GPLex + GPPG: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Строка 55: Строка 55:
}</source>
}</source>
- означает, что если встречен любой символ (.) или конец строки (\n), то просто вывести его. Это правило стоит последним, поэтому оно выполняется только если не выполняются другие правила.
- означает, что если встречен любой символ (.) или конец строки (\n), то просто вывести его. Это правило стоит последним, поэтому оно выполняется только если не выполняются другие правила.
Однострочный комментарий можно создать так:
<source lang="csharp">DotChr [^\r\n]
OneLineCmnt  \/\/{DotChr}*
</source>
\/ означает символ /, он так пишется, поскольку значок /, написанный без \, имеет другой смысл

Версия от 23:57, 22 марта 2010

Практическое занятие 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}*

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