
- •Содержание
- •1.Рабочая программа
- •2.Модуль Вводный
- •3.Модуль Формальные грамматики и языки
- •3.1.Языки и цепочки символов. Способы задания языков
- •3.1.1.Цепочки символов. Операции над цепочками символов
- •3.1.2.Понятие языка. Формальное определение языка
- •3.1.3.Способы задания языков
- •3.1.4.Синтаксис и семантика языка
- •3.2.Определение грамматики
- •3.2.1.Особенности языков программирования
- •3.2.2.Определение грамматики. Форма Бэкуса—Наура
- •3.2.3.Принцип рекурсии в правилах грамматики
- •3.2.4.Другие способы задания грамматик
- •3.3.Классификация языков и грамматик
- •3.3.1.Классификация грамматик
- •3.3.2.Классификация языков
- •3.4.Контроль
- •4.Модуль Распознаватели, механизм вывода цепочек символов
- •4.1.Цепочки вывода. Сентенциальная форма.
- •4.1.1.Сентенциальная форма грамматики. Язык, заданный грамматикой
- •4.1.2.Левосторонний и правосторонний выводы
- •4.1.3.Однозначные и неоднозначные грамматики
- •4.1.4.Эквивалентность и преобразование грамматик
- •4.2.Распознаватели. Задача разбора
- •4.2.1.Общая схема распознавателя
- •4.2.2.Виды распознавателей
- •4.2.3.Классификация распознавателей по типам языков
- •4.3.Контроль
- •5.Модуль Регулярные грамматики и языки
- •5.1.Регулярные языки и грамматики
- •5.2.Леволинейные и праволинейные грамматики. Автоматные грамматики
- •5.3.Алгоритм преобразования регулярной грамматики к автоматному виду
- •5.4.Конечные автоматы
- •5.4.1.Определение конечного автомата
- •5.4.2.Детерминированные и недетерминированные конечные автоматы
- •5.4.3.Преобразование конечного автомата к детерминированному виду
- •5.5.Контроль
- •6.Модуль Контекстно-свободные грамматики и языки
- •6.1.Контекстно-свободные языки
- •6.1.1.Распознаватели кс-языков. Автоматы с магазинной памятью. Определение мп-автомата
- •6.2.Классы кс-языков и грамматик. Класс ll(k) грамматик.
- •6.3.Принципы построения распознавателей для ll(k)-грамматик
- •6.4.Левая факторизация
- •6.5.Удаление левой рекурсии
- •6.6.Алгоритм разбора для ll(1)-грамматик
- •6.7.Алгоритм построения множества first(1,a)
- •6.8.Алгоритм построения множества follow(1,a)
- •6.9.Восходящие распознаватели кс-языков без возвратов
- •6.9.1.Определение lr(k)-грамматики
- •6.10.Принципы построения распознавателей для lr(k)-грамматик
- •6.10.1.Грамматики простого предшествования
- •6.11.Распознаватели для lr(0) и lr(1) грамматик
- •6.11.1.Распознаватель для lr(0)-грамматики
- •6.11.2.Распознаватель для lr(1) грамматики
- •6.12.Контроль
- •7.Модуль Инструментальные средства для построения трансляторов
- •7.1.Инструментальные средства для построения компиляторов
- •7.1.1.Построитель лексических анализаторов Lex
- •7.2.Контроль
- •8.Модуль Особенности программирование трансляторов
- •8.1.Использование значений произвольных типов, алгоритм разбора
- •8.1.1.Алгоритм синтаксического разбора
- •8.1.2.Семантический стек
- •8.2.Неоднозначности и конфликты
- •8.3.Старшинство операций
- •8.4.Дополнительные возможности программ yacc и lex
- •8.4.1.Обработка ошибок
- •8.5.Совместное использование lex и yacc
- •8.5.1.Кодировка лексем и интерфейс
- •8.5.2.Сборка yacc-программ
- •8.6.Советы по подготовке спецификаций
- •8.6.1.Стиль
- •8.6.2.Использование левой рекурсии
- •8.6.3.Уловки анализа лексики
- •8.6.4.Входной синтаксис yacc'а
- •8.7.Контроль
- •9.Модуль Заключение
- •10.Обеспечение лабораторного практикума
- •11.Дополнительная информация. Примеры
- •11.4.Пример простейшего интерпретатора формул
- •11.5.Простой пример
- •11.6.Более сложный пример
- •11.7.Генераторы лексических и синтаксических анализаторов
- •11.8.Генераторы лексических и синтаксических анализаторов на java
- •11.9.Пакеты для разработки компиляторов
- •Список сокращений
- •Литература
- •Приложения Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex. Анализ структуры программ
- •Краткая теория:
- •Рассмотрим примеры:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления
- •Краткая теория:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex и синтаксический анализатор yacc. Изображение геометрических фигур
- •Краткая теория:
- •Создание метафайла и работа сним
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Порядок выполнения работы:
Запустить MSVisualC++, создать приложение «Lexer and Parser AppWizard» (например, Example).
Настроить входной поток: в функции main при создании парсера указать входной файл, в lex-файле (.l) заменить функцию getchar() на getc(yyin) (yy заменяется названием вашего проекта – Examplein).
В yacc-файле (.y) в разделе правил оставить строчку (YACC должен только вызывать LEX):
rule1: {}
В lex-файле (.l) выделить необходимые лексемы.
Используя метки, проанализировать структуру текста.
С помощью функции printf или ECHO вывести необходимые данные на экран.
Нажав правую клавишу миши и выбрав соответствующий пункт, откомпилировать lex-файл и запустить приложение.
Таблица 5 ─ Варианты заданий на лабораторную работу №2
Язык |
Вариант |
C++ |
1 |
Pascal |
2 |
HTML |
3 |
Контрольные вопросы
Для чего необходим лексический анализатор?
Как описать лексему в лексическом анализаторе Lex?
Опишите назначение операторов \, ^, ?, *, +, |, $, /, %, [], {}, ., (), <>.
Для чего используются операторы START и BEGIN?
Опишите структуру Lex-программы.
Какая функция заменяет printf в Lex программах?
Какие правила используются для решения проблемы, когда одна цепочка символов удовлетворяет нескольким правилам?
Лабораторная работа №3
Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления
Цель работы: освоить работу в MS VisualC++ с LEX и YACC. Изучить правила выделения лексем, задания правил для вычисления значения алгебраического выражения. Ознакомиться с правилами анализа ошибок.
Краткая теория:
Для совместной работы Lex и Yacc используется также внешний массив символов, который формирует lex – yytext.
Вся необходимая дополнительная информация приводится в пунктах 11.1, 11.2, 11.3 настоящего УМК.
Рассмотрим пример:
calc.l |
calc.y |
%{ #include <stdlib.h> #include "calc.cpp.h" #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \ { \ int c = getc(calcin); \ result = (c == EOF) ? \ YY_NULL : (buf[0] = c, 1); \ } %} %% [ \t\n] ; [0-9][0-9]* { calclval.integer_type = atoi(calctext); return NUM; } . return calctext[0]; %%
|
%{ #include <iostream.h> extern int calcerror(const char* s); extern int calclex(); extern int result; %}
%union { int integer_type; } %left '+', '-' %left '*', '/' %token <integer_type> NUM %type <integer_type> formula, exp %start formula
%% formula: NUM {$$=$1;result=$1;} | exp {$$=$1;result=$1;} ; exp: '(' exp ')' {$$=$2;} | exp '+' exp {$$=$1+$3;} | exp '-' exp {$$=$1-$3;} | exp '*' exp {$$=$1*$3;} | exp '/' exp {$$=$1/$3;} | '-' exp {$$=-$2;} | NUM {$$=$1;} ;
%%
/* programs */ extern "C" { int calcwrap() { return 1; } } int calcerror(const char *s) { cerr << "Syntax error: " << s << endl; return 0; }
|
Данная программа выполняет функцию простейшего калькулятора, подсчитывая значение выражения из файла. Функция main будет выглядеть следующим образом:
#include "calcParser.h"
#include<stdio.h>
#include<stdlib.h>
int result=0;
char str[1000];
int main(int argc, char** argv) {
calcParser parser("formula.txt");
parser.Parse();
printf("\n\nresult = %d\n\n",result);
return 0;
}
Задания:
Задача состоит в нахождении значения алгебраического выражения (усовершенствованный калькулятор). В выражении могут использоваться четыре знака операций: +, -, *, / и некоторые простейшие функции: косинус, синус, тангенс, логарифм и др. Также в выражении могут использоваться скобки любой вложенности. Числа могут быть представлены в виде десятичной дроби и экспонентциальной форме, могут быть отрицательными. Требуется корректно разобрать выражение с использованием анализаторов LEX и YACC и вычислить результат. Данные при этом могут быть записаны с использованием знаков пробелов, табуляций, переводов строк.
Само выражение читается из входного файла, результат вычисления выводится на экран.