Занятие 3 по курсу МПК — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Формат .lex-файла) |
Admin (обсуждение | вклад) (→Формат .lex-файла) |
||
Строка 33: | Строка 33: | ||
<source lang="csharp">%namespace LexScanner | <source lang="csharp">%namespace LexScanner | ||
− | |||
− | |||
Alpha [a-zA-Z] | Alpha [a-zA-Z] | ||
− | |||
INTNUM [0-9]+ | INTNUM [0-9]+ | ||
− | |||
REALNUM {INTNUM}\.{INTNUM} | REALNUM {INTNUM}\.{INTNUM} | ||
− | |||
ID {Alpha}+ | ID {Alpha}+ | ||
− | |||
− | |||
%% | %% | ||
{INTNUM} { | {INTNUM} { | ||
− | |||
Console.WriteLine("IntNum "+yytext); | Console.WriteLine("IntNum "+yytext); | ||
− | |||
} | } | ||
− | |||
− | |||
{REALNUM} { | {REALNUM} { | ||
− | |||
Console.WriteLine("RealNum "+yytext); | Console.WriteLine("RealNum "+yytext); | ||
− | |||
} | } | ||
− | |||
− | |||
begin { | begin { | ||
− | |||
Console.WriteLine("Key: begin"); | Console.WriteLine("Key: begin"); | ||
− | |||
} | } | ||
− | |||
− | |||
end { | end { | ||
− | |||
Console.WriteLine("Key: end"); | Console.WriteLine("Key: end"); | ||
− | |||
} | } | ||
− | |||
− | |||
{ID} { | {ID} { | ||
− | |||
Console.WriteLine("ID "+yytext); | Console.WriteLine("ID "+yytext); | ||
− | |||
} | } | ||
− | |||
− | |||
%% | %% | ||
− | |||
− | |||
// Здесь можно делать описания переменных и методов - они попадают в класс Scanner | // Здесь можно делать описания переменных и методов - они попадают в класс Scanner |
Версия 12:13, 4 апреля 2011
- GPLex - генератор сканеров (лексических анализаторов)
- GPPG - генератор парсеров (синтаксических анализаторов)
Комплект 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.
Конкретный lex-файл имеет вид:
%namespace LexScanner
Alpha [a-zA-Z]
INTNUM [0-9]+
REALNUM {INTNUM}\.{INTNUM}
ID {Alpha}+
%%
{INTNUM} {
Console.WriteLine("IntNum "+yytext);
}
{REALNUM} {
Console.WriteLine("RealNum "+yytext);
}
begin {
Console.WriteLine("Key: begin");
}
end {
Console.WriteLine("Key: end");
}
{ID} {
Console.WriteLine("ID "+yytext);
}
%%
// Здесь можно делать описания переменных и методов - они попадают в класс Scanner
public int Sum = 0;
Класс Scanner
- Основной метод - int yylex() - возвращает номер следующей лексемы (токена)
- Свойства
string yytext - текст лексемы int yyline - номер строки лексемы int yycol - номер столбца лексемы int yyleng - длина лексемы
Задание
- Откомпилировать лексический анализатор и запустить его для файла a.txt
- Сделать имя файла, обрабатываемого лексическим анализатором, параметром командной строки
- Подсчитать количество, среднюю, минимальную и максимальную длину всех идентификаторов
- Найти сумму всех целых и сумму всех вещественных в файле
- Дана программа, в которой встречаются ключевые слова begin end. Определить, правильно ли они расставлены
- По данному тексту слов составить таблицу
слово список его вхождений в текст в формате (строка,столбец), (строка,столбец)