close

Вход

Забыли?

вход по аккаунту

?

Отчет по лабе 2

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
Таганрогский Технологический Институт
Южного Федерального Университета
Факультет автоматики и вычислительной техники
Кафедра вычислительной техники
Отчет по лабораторной работе №2
Выполнили: студент гр. А-30
Ананьев А.
Таганрог 2013
Цель работы:
Ознакомиться с теоретическими и практическими основами построения блока лексического анализа компилятора. Разработать алгоритм работы лексического анализатора (ЛА) и реализовать его в программе в упрощенном варианте. Задание к лабораторной работе:
ВарТип данныхОператорыОперацииДоп. элементыРеализация1integer, stringПрисваивания, if-then-else, goto + - * / = <> <= >= > массивыПрямая программная
Описание языка:
Данный мини-язык программирования содержит два типа данных, которые можно использовать при написании программ. Так же реализованы 2 вида условий: if-then-else и goto.
Реализованы основные действия. Так же имеется поддержка массивов.
* Типы данных:
int - целочисленные тип данных (от integer);
string - строковый тип данных;
Инициализация переменных выглядит следующим образом:
int a;
string a, b;
* Операторы:
= - оператор присваивания;
If-then-else - условие, по которому выполняются или не выполняются какие-либо действия;
o - безусловный переход на указатель / метку;
Синтаксис операторов:
a = 5;
If <условие> then <выполнить действие 1> else <выполнить действие 2>;
goto <указатель / метка>;
* Операции:
+сложение-вычитание*умножение/деление==равенство< >неравенство<=меньше или равно>=больше или равно>больше
Синтаксис реализации операций:
a = a + 5;
If a <> 5 then a = a + 1 else if a <= 2 then a = 10;
* Доп. элементы:
Перед массивом идет его тип и название. После название массива ставится пробел. При указание размерности массива ставится пробел между компонентами.
Массивы могут быть как одномерными ( [] ), так и двухмерными ( [ . ] );
Пример массива:
int a [ 5 ];
int a [ 3 . 5 ];
* Разделители:
Разделителями являются знаки: "," - при перечислении, ";" - конец строки.
Следует отметить, что каждая строка ОБЯЗАТЕЛЬНО оканчивается ";", при этом последняя строка НЕ ЗАКАНЧИВАЕТСЯ этим знаком.
* Комментарии
Комментарии реализованы и начинаются с определенной последовательности символов:
"/*"
Что бы закончить комментарий, требуется поставить ";", который символизирует конец строки, при этом закрывать комментарий символами "*/" - не обязательно.
Пример использования комментария:
string a, b, c;
/* Это моя первая программа, которая анализирует другую программу;
If a == b then a = a + 1
Примеры программ на данном языке:
Пример программы 1:
integer i, a, m[10];
string S;
S = 0;
if i == 1 then
S = S + i;
else S = S - i;
Пример программы 2:
string Mass [ 5 ];
int C = 10;
if Mass <= 5 then
C = C + 1;
else if Mass <> 0 then
C = C - 10;
Пример программы 3:
/*моя программа, которая работает;
int C = 10;
if С + 2 <= 5 then
F = C + 1;
else if С <> 0 then
F = C * 10;
Синтаксическая диаграмма:
Общий вид:
Объявление оператора:
Действие:
Условие (на примере условия if):
Комментарий:
Граф распознавания лексических единиц:
Таблица ключевых слов и разделителей:
ТипыОператорыОперацииМассивыРазделителиint=+[ ];stringif-[ . ],then*[пробелelse/]goto==.<><=>=<>
Программа лексического анализатора:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
namespace LexicalAnalyzerAnanev
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public string[] DelimitersLevel1 = { ";" }; //строковое деление
public string[] DelimitersLevel2 = { " ", "," }; // деление строк
//public List<string[]> Structure = new List<string[]>();
public string OpenCodeFile = null;
public string[] SplitCodeFile = null;
public void OpenFile()
{
}
public void AnalyzerMain()
{
int i = 0, index = 0, indexStructure = 0, indexFind = 1; string buff = null; string[] buff_2 = null;
bool StructureFind = false;
List<string[]> Structure = new List<string[]>();
//Обявление таблиц
//DataType
Structure.Add(new string[] { "T.", "int", "string" });
//Operators
Structure.Add(new string[] { "O.", "=", "if", "then", "else", "goto" }); //Arithmetic
Structure.Add(new string[] { "A.", "+", "-", "*", "/", "==", "<>", "<=", ">=", "<", ">" }); //Array
Structure.Add(new string[] { "M.", "[" + "]", "[" + "." + "]", "[", "]" , "."}); //Комментарии
Structure.Add(new string[] { "К.", "/*" }); //Сплитуем строку на уровне знака ;
SplitCodeFile = OpenCodeFile.Split(DelimitersLevel1, StringSplitOptions.None);
for (i = 0; i < SplitCodeFile.Length; i++)
{
buff = SplitCodeFile[i];
//Проверка на соответствие строке массиву
if (SplitCodeFile[i][0] == '/' && SplitCodeFile[i][1] == '*' && SplitCodeFile[i].Length > 0)
{
CountTextDataType.Text += "K." + indexStructure + " " + buff + "\r\n";
}
else
{
//Сплитуем i элемент строки SplitCodeFile на уровне знаков пробела и ,
buff_2 = buff.Split(DelimitersLevel2, StringSplitOptions.None);
//Восстановление разделительных знаков ; и ,
for (int index1 = 0; index1 < buff_2.Length; index1++)
{
if (buff_2[0] == "")
{
buff_2[index1] = ";";
}
if (buff_2[index1] == "")
{
buff_2[index1] = ",";
}
}
for (index = 0; index < buff_2.Length; index++)
{
StructureFind = false;
//входим List, в котором хранятся все таблицы
foreach (string[] a in Structure)
{
//Проверяем таблицу
for (indexStructure = 1; indexStructure < a.Length; indexStructure++)
{
if (buff_2[index] == a[indexStructure])
{
CountTextDataType.Text += a[0] + indexStructure + " " + buff_2[index] + "\r\n";
StructureFind = true;
}
}
}
//Действия которые наступают, когда проверяемый элемент
//не находится ни в одной таблице
if (StructureFind == false)
{
if (buff_2[index] == ";" || buff_2[index] == ",")
{
CountTextDataType.Text += "R." + indexFind + " " + buff_2[index] + "\r\n";
indexFind++;
}
else
{
if (buff_2[index][buff_2[index].Length - 1] == ']')
{
CountTextDataType.Text += "M." + indexFind + " " + buff_2[index] + "\r\n";
}
else
{
CountTextDataType.Text += "C." + indexFind + " " + buff_2[index] + "\r\n";
indexFind++;
}
}
}
}
}
}
}
private void ButtonAnalyze_Click(object sender, RoutedEventArgs e)
{
string[] OpenFile = System.IO.File.ReadAllLines(@"F:\FileProgram.txt");
for (int i = 0; i < OpenFile.Length; i++ )
{
OpenCodeFile += OpenFile[i];
WriteProgramField.Text += OpenFile[i] + "\r\n";
}
CountTextDataType.Text = "";
AnalyzerMain();
}
}
}
Результаты работы анализатора:
Вид программы:
Документ
Категория
Рефераты
Просмотров
34
Размер файла
709 Кб
Теги
лабораторная работа, лаба, отчет, лабе, лабораторная
1/--страниц
Пожаловаться на содержимое документа