Разработка инструментальных средств создания текстовых предметно-ориентированных языков: компонент проверки синтаксиса

Характеристика метода создания текстовых предметно-ориентированных языков. Расчет трудоемкости разработки компонента проверки синтаксиса. Проектирование архитектуры языкового инструментария и программная реализация компонента проверки синтаксиса.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 01.08.2017
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

{

repository = rep;

UseVisualStyleBackColor = true;

level = i2 < 0 ? 1 : 2;

SolutionName = rep.repository[i0].name;

LanguageName = rep.repository[i0].list[i1].language.name;

CText model = level == 1 ? rep.repository[i0].list[i1].language : rep.repository[i0].list[i1].programs[i2];

ProgramName = level == 1 ? null : model.name;

SetTitle();

if (level == 2)

{

for (int i = 0; i < container.TabCount; i++)

{

CTab tab = container.TabPages[i] as CTab;

if (tab != this && tab.SolutionName == SolutionName && tab.LanguageName == LanguageName)

{

sentence = tab.sentence;

break;

}

}

if (sentence == null)

sentence = new CSentence(rep.repository[i0].list[i1].language.content);

}

}

void CTab_Enter(object sender, EventArgs e)

{

CompileText();

}

/// При покидании вставки

void CTab_Leave(object sender, EventArgs e)

{

if (menuEditor != null && menuEditor.Visible)

menuEditor.Close();

}

private void ReplaceLanguage()

{

TabControl t = Parent as TabControl;

for (int i = 0; i < t.TabPages.Count; i++)

{

CTab tab = t.TabPages[i] as CTab;

if (tab.level == 2 && tab.SolutionName == SolutionName && tab.LanguageName == LanguageName)

tab.sentence = sentence;

}

}

internal void CompileText()

{

editor.SelectionChanged -= TextHandler;

if (level == 2)

{

List<string> menu = sentence.Compile(editor.Text, editor.SelectionStart);

ShowText(sentence.CompiledText, menu);

}

else

{

sentence = new CSentence(editor.Text);

ReplaceLanguage();

ShowText(sentence.TextStructure, null);

}

Shape1.BackColor = sentence.LanguageFault ? Color.Red : Color.LightGreen;

if (level == 2)

Shape2.BackColor = sentence.CompileError ? Color.Red : Color.LightGreen;

else

SetSemanticErrors();

editor.SelectionChanged += TextHandler;

}

internal void RenameProgram(string solution, string language, string OldName, string NewName)

{

if (level == 1 || OldName != ProgramName || solution != SolutionName || language != LanguageName)

return;

ProgramName = NewName;

SetTitle();

}

/// Переименовать язык, если он имеет заданное имя

internal void RenameLanguage(string solution, string OldName, string NewName)

{

if (OldName != LanguageName || solution != SolutionName)

return;

LanguageName = NewName;

SetTitle();

}

/// Переименовать решение, если он имеет заданное имя

internal void RenameSolution(string OldName, string NewName)

{

if (OldName != SolutionName)

return;

SolutionName = NewName;

SetTitle();

}

/// Вывод в окно ошибок

private void SetSemanticErrors()

{

string[] lines = new string[sentence.SemanticErrors.Count];

for (int i = 0; i < lines.GetLength(0); i++)

lines[i] = sentence.SemanticErrors[i];

semantics.Lines = lines;

}

/// Текст изменился

private void richText_TextChanged(object sender, EventArgs e)

{

editor.SelectionChanged -= TextHandler;

if (menuEditor != null && menuEditor.Visible)

menuEditor.Close();

GC.Collect();

if (level == 1)

{

sentence = new CSentence(editor.Text);

ReplaceLanguage();

ShowText(sentence.TextStructure, null);

Shape1.BackColor = sentence.LanguageFault ? Color.Red : Color.LightGreen;

SetSemanticErrors();

}

else

{

List<string> MenuItems = sentence.Compile(editor.Text, editor.SelectionStart);

ShowText(sentence.CompiledText, MenuItems);

Shape2.BackColor = sentence.CompileError ? Color.Red : Color.LightGreen;

}

editor.SelectionChanged += TextHandler;

}

/// Сохранить модель в репозитории

private void Save(object sender, EventArgs e)

{

int i0, i1, i2;

if (level == 1)

{

if (!sentence.LanguageFault || MessageBox.Show("Модель не компилируется. Вы уверены, что её нужно сохранить?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

repository.IndexesOf(SolutionName, LanguageName, out i0, out i1);

repository.repository[i0].list[i1].language.content = editor.Text;

TabControl p = Parent as TabControl;

for (int i = 0; i < p.TabPages.Count; i++)

{

CTab tab = p.TabPages[i] as CTab; //Текущая вкладка

if (tab.level == 2 && tab.SolutionName == SolutionName && tab.LanguageName == LanguageName)

tab.sentence = sentence;

}

}

}

else

{

if (!sentence.CompileError || MessageBox.Show("Модель не компилируется. Вы уверены, что её нужно сохранить?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

if (repository.IndexesOf(SolutionName, LanguageName, ProgramName, out i0, out i1, out i2))

repository.repository[i0].list[i1].programs[i2].content = editor.Text;

}

}

}

/// Сохранить модель в репозитории и выйти

private void SaveAndClose(object sender, EventArgs e)

{

Save(sender, e);

if (menuEditor != null)

menuEditor.Close();

(Parent as TabControl).TabPages.Remove(this);

}

/// Выйти без сохранения

private void Exit(object sender, EventArgs e)

{

if (menuEditor != null)

menuEditor.Close();

(Parent as TabControl).TabPages.Remove(this);

}

/// Выбран пункт меню

private void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

{

int NewCaret = editor.SelectionStart + e.ClickedItem.Text.Length;

editor.SelectionChanged -= TextHandler;

editor.Text = editor.Text.Insert(editor.SelectionStart, e.ClickedItem.Text);

editor.SelectionChanged += TextHandler;

OldStructure[0].type = (ETextPiece) 100000;

editor.SelectionStart = NewCaret;

}

}

}

public partial class CLaguageEditor : Form

{

internal CRepository repository;

static private readonly Color[] LanguageColors = { Color.Red, Color.Black, Color.Blue, Color.Gray, Color.Green};

private readonly char[] BackSlash = { '\\' };

private const string RepositoryName = "LanguageRepository.XML";

public CLaguageEditor()

{

InitializeComponent();

if (File.Exists(RepositoryName))

try

{

repository = new CRepository(RepositoryName);

}

catch

{

repository = new CRepository();

}

else

repository = new CRepository();

for (int i = 0; i < repository.repository.Count; i++)

{

TreeNode SolutionNode = treeRepository.Nodes.Add(repository.repository[i].name);

SolutionNode.ContextMenuStrip = menuLanguage;

List<CLangaugeRepository> LanguageRepository = repository.repository[i].list;

for (int j = 0; j < LanguageRepository.Count; j++)

{

TreeNode LanguageNode = SolutionNode.Nodes.Add(LanguageRepository[j].language.name);

LanguageNode.ContextMenuStrip = menuLanguage;

List<CText> programs = LanguageRepository[j].programs;

for (int k = 0; k < programs.Count; k++)

{

TreeNode ProgramNode = LanguageNode.Nodes.Add(programs[k].name);

ProgramNode.ContextMenuStrip = menuProgram;

}

}

}

}

private void buttonCancel_Click(object sender, EventArgs e)

{

repository.XML.Save(RepositoryName);

Close();

}

private string GetName(string ObjectType)

{

AskName ask = new AskName();

ask.Text = "Введите имя " + ObjectType;

if (ask.ShowDialog() == DialogResult.OK)

{

if (ask.textName.Text == "")

{

MessageBox.Show("Имя " + ObjectType + " не задано.");

return null;

}

if (ask.textName.Text.Contains('\\'))

{

MessageBox.Show("Имя не может содержать символ '\\'.");

return null;

}

return ask.textName.Text;

}

return null;

}

private string GetNewSolutionName()

{

string name = GetName("решения");

if (name == null)

return null;

for (int i = 0; i < repository.repository.Count; i++)

if (repository.repository[i].name == name)

{

MessageBox.Show("Решение с именем '" + name + "' уже существует.");

return null;

}

return name;

}

private bool IsSelected(TreeNode node, int Y)

{

return node.Bounds.Top <= Y && node.Bounds.Top + node.Bounds.Height > Y;

}

/// Есть ли модель во вкладках

private bool IsModelOpened(string solution, string language, string program)

{

for (int i = 0; i < tabEditor.TabPages.Count; i++)

{

CTab tab = tabEditor.TabPages[i] as CTab;

if (tab.SolutionName == solution && tab.LanguageName == language && tab.level == (program == null ? 1 : 2)

&& (tab.level == 1 || tab.ProgramName == program))

return true;

}

return false;

}

private void contextNode_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

{

int i0, i1 = -1, i2 = -1;

ContextMenuStrip menu = sender as ContextMenuStrip;

TreeNode SelectedNode = null;

Rectangle r = treeRepository.RectangleToClient(new Rectangle(menu.Location, menu.Size));

int Y = r.Top;

int level = 0;

string OldName;

string AskName;

for (i0 = 0; i0 < treeRepository.Nodes.Count; i0++)

{

if (IsSelected(treeRepository.Nodes[i0], Y))

{

SelectedNode = treeRepository.Nodes[i0];

i1 = i2 = -1;

level = 1;

}

for (i1 = 0; i1 < treeRepository.Nodes[i0].Nodes.Count; i1++)

{

if (IsSelected(treeRepository.Nodes[i0].Nodes[i1], Y))

{

SelectedNode = treeRepository.Nodes[i0].Nodes[i1];

i2 = -1;

level = 2;

break;

}

for (i2 = 0; i2 < treeRepository.Nodes[i0].Nodes[i1].Nodes.Count; i2++)

if (IsSelected(treeRepository.Nodes[i0].Nodes[i1].Nodes[i2], Y))

{

SelectedNode = treeRepository.Nodes[i0].Nodes[i1].Nodes[i2];

level = 3;

break;

}

if (SelectedNode != null)

break;

}

if (SelectedNode != null)

break;

}

if (SelectedNode == null)

return;

string[] sp = SelectedNode.FullPath.Split(BackSlash);

string selected = e.ClickedItem.Text;

if (selected == "Редактировать" || selected == "Редактировать всё")

{

bool NewTabs = true;

if (selected == "Редактировать")

{

switch (level)

{

case 1:

List<CLangaugeRepository> lan = repository.repository[i0].list;

NewTabs = lan.Count > 0;

for (int i = 0; i < lan.Count; i++)

if (!IsModelOpened(repository.repository[i0].name, lan[i].language.name, null))

tabEditor.TabPages.Add(new CTab(repository, i0, i, -1, tabEditor));

break;

case 2:

if (IsModelOpened(repository.repository[i0].name, repository.repository[i0].list[i1].language.name, null))

MessageBox.Show("Модель 1 '" + repository.repository[i0].list[i1].language.name + "' решения '"

+ repository.repository[i0].name + "' уже загружена.");

else

tabEditor.TabPages.Add(new CTab(repository, i0, i1, -1, tabEditor));

break;

default:

if (IsModelOpened(repository.repository[i0].name, repository.repository[i0].list[i1].language.name,

repository.repository[i0].list[i1].programs[i2].name))

MessageBox.Show("Модель 2 '" + repository.repository[i0].list[i1].programs[i2].name

+ "' модели 1 '" + repository.repository[i0].list[i1].language.name + "' решения '"

+ repository.repository[i0].name + "' уже загружена.");

else

{

tabEditor.TabPages.Add(new CTab(repository, i0, i1, i2, tabEditor));

tabEditor.SelectedTab = tabEditor.TabPages[tabEditor.TabPages.Count - 1];

}

break;

}

}

else

{switch (level)

{

case 1:

List<CLangaugeRepository> lan = repository.repository[i0].list;

NewTabs = lan.Count > 0;

for (int i = 0; i < lan.Count; i++)

{

if (!IsModelOpened(repository.repository[i0].name, lan[i].language.name, null))

tabEditor.TabPages.Add(new CTab(repository, i0, i, -1, tabEditor));

for (int j = 0; j < repository.repository[i0].list[i].programs.Count; j++)

if (!IsModelOpened(repository.repository[i0].name, lan[i].language.name, lan[i].programs[j].name))

tabEditor.TabPages.Add(new CTab(repository, i0, i, j, tabEditor));

}

break;

case 2:

if (!IsModelOpened(repository.repository[i0].name, repository.repository[i0].list[i1].language.name, null))

{

tabEditor.TabPages.Add(new CTab(repository, i0, i1, -1, tabEditor));

tabEditor.SelectedTab = tabEditor.TabPages[tabEditor.TabPages.Count - 1];

}

for (int j = 0; j < repository.repository[i0].list[i1].programs.Count; j++)

if (!IsModelOpened(repository.repository[i0].name, repository.repository[i0].list[i1].language.name,

repository.repository[i0].list[i1].programs[j].name))

tabEditor.TabPages.Add(new CTab(repository, i0, i1, j, tabEditor));

break;

default:

if (IsModelOpened(repository.repository[i0].name, repository.repository[i0].list[i1].language.name,

repository.repository[i0].list[i1].programs[i2].name))

MessageBox.Show("Модель 2 '" + repository.repository[i0].list[i1].programs[i2].name

+ "' модели 1 '" + repository.repository[i0].list[i1].language.name + "' решения '"

+ repository.repository[i0].name + "' уже загружена.");

else

{

tabEditor.TabPages.Add(new CTab(repository, i0, i1, i2, tabEditor));

tabEditor.SelectedTab = tabEditor.TabPages[tabEditor.TabPages.Count - 1];

}

break;

}

if (NewTabs)

{

tabEditor.SelectedTab = tabEditor.TabPages[tabEditor.TabPages.Count - 1];

(tabEditor.SelectedTab as CTab).editor.Focus();

(tabEditor.SelectedTab as CTab).CompileText();

}

else

MessageBox.Show("Решение не содержит ни одной модели");

return;

}

if (NewTabs)

{

tabEditor.SelectedTab = tabEditor.TabPages[tabEditor.TabPages.Count - 1];

(tabEditor.SelectedTab as CTab).editor.Focus();

(tabEditor.SelectedTab as CTab).CompileText();

}

else

MessageBox.Show("Решение не содержит ни одной модели");

return;

}

if (selected == "Переименовать")

{

AskName = GetName(level == 1 ? "решения " + SelectedNode.FullPath : level == 2 ? "модели 1 " + SelectedNode.FullPath : "модели 2 " + SelectedNode.FullPath);

if (AskName == null)

return;

switch (level)

{

case 1:

for (int i = 0; i < repository.repository.Count; i++)

if (repository.repository[i].name == AskName)

{

MessageBox.Show("Имя решения с таким именем уже существует.");

return;

}

OldName = repository.repository[i0].name;

treeRepository.Nodes[i0].Text = repository.repository[i0].name = AskName;

for (int i = 0; i < tabEditor.TabPages.Count; i++)

(tabEditor.TabPages[i] as CTab).RenameSolution(OldName, AskName);

return;

case 2:

for (int i = 0; i < repository.repository[i0].list.Count; i++)

if (repository.repository[i0].list[i].language.name == AskName)

{

MessageBox.Show("Имя модели 1 с таким именем уже существует.");

return;

}

OldName = repository.repository[i0].list[i1].language.name;

treeRepository.Nodes[i0].Nodes[i1].Text = repository.repository[i0].list[i1].language.name = AskName;

for (int i = 0; i < tabEditor.TabPages.Count; i++)

(tabEditor.TabPages[i] as CTab).RenameLanguage(sp[0], OldName, AskName);

return;

default:

List<CText> programs = repository.repository[i0].list[i1].programs;

for (int i = 0; i < programs.Count; i++)

if (programs[i].name == AskName)

{

MessageBox.Show("Имя модели 2 с таким именем уже существует.");

return;

}

OldName = programs[i2].name;

treeRepository.Nodes[i0].Nodes[i1].Nodes[i2].Text = programs[i2].name = AskName;

for (int i = 0; i < tabEditor.TabPages.Count; i++)

(tabEditor.TabPages[i] as CTab).RenameProgram(sp[0], sp[1], OldName, AskName);

return;

}

}

if (selected == "Удалить")

switch (level)

{

case 1:

for (int i = tabEditor.TabPages.Count - 1; i >= 0; i--) if ((tabEditor.TabPages[i] as CTab).SolutionName == sp[0])

tabEditor.TabPages.RemoveAt(i);

repository.repository.RemoveAt(i0);

treeRepository.Nodes.RemoveAt(i0);

return;

case 2:

for (int i = tabEditor.TabPages.Count - 1; i >= 0; i--)

if ((tabEditor.TabPages[i] as CTab).SolutionName == sp[0] && (tabEditor.TabPages[i] as CTab).LanguageName == sp[1])

tabEditor.TabPages.RemoveAt(i);

repository.repository[i0].list.RemoveAt(i1);

treeRepository.Nodes[i0].Nodes.RemoveAt(i1);

return;

default:

for (int i = tabEditor.TabPages.Count - 1; i >= 0; i--)

if ((tabEditor.TabPages[i] as CTab).SolutionName == sp[0] && (tabEditor.TabPages[i] as CTab).LanguageName == sp[1]

&& (tabEditor.TabPages[i] as CTab).ProgramName == sp[2])

tabEditor.TabPages.RemoveAt(i);

repository.repository[i0].list[i1].programs.RemoveAt(i2);

treeRepository.Nodes[i0].Nodes[i1].Nodes.RemoveAt(i2);

return;

}

if (selected == "Создать модель")

{

AskName = GetName(level == 1 ? "модели 1" : "модели 2");

if (AskName == null)

return;

switch (level)

{

case 1:

List<CLangaugeRepository> lan = repository.repository[i0].list;

for (int i = 0; i < lan.Count; i++)

if (lan[i].language.name == AskName)

{

MessageBox.Show("Модель 1 '" + AskName + "' в решении '" + sp[0] + "' уже есть.");

return;

}

repository.repository[i0].list.Add(new CLangaugeRepository(new CText(AskName, "")));

TreeNode node = treeRepository.Nodes[i0].Nodes.Add(AskName);

node.ContextMenuStrip = menuLanguage;

return;

case 2:

List<CText> programs = repository.repository[i0].list[i1].programs;

for (int i = 0; i < programs.Count; i++)

if (programs[i].name == AskName)

{

MessageBox.Show("Модель 2 '" + AskName + "' в решении '" + sp[0] + "' в модели 1 '" + sp[1] + "' уже есть.");

return;

}

repository.repository[i0].list[i1].programs.Add(new CText(AskName, ""));

node = treeRepository.Nodes[i0].Nodes[i1].Nodes.Add(AskName);

node.ContextMenuStrip = menuProgram;

return;

default:

return;

}

}

if (selected == "Загрузить в репозиторий извне" || selected == "Загрузить в репозиторий извне всё")

{

OpenFileDialog dialog = new OpenFileDialog();

dialog.Filter = level == 1 ? "Модель уровня 1 | *.language" : "Модель уровня 2 | *." + sp[1];

if (dialog.ShowDialog() == DialogResult.OK)

{

string ReadName = dialog.FileName;

string ModelName = CText.GetModelName(ReadName);

int ip0, ip1, ip2;

string content;

switch (level)

{

case 1:

if (repository.IndexesOf(sp[0], ModelName, out ip0, out ip1))

{

if (MessageBox.Show("Модель 1 '" + ModelName + "' в решении '" + sp[0] + "' уже существует. Заменить?",

"", MessageBoxButtons.YesNo) != DialogResult.Yes)

return;

}

try

{

CLangaugeRepository language;

content = File.ReadAllText(ReadName, Encoding.Default);

CSentence sentence = new CSentence(content);

if (sentence.LanguageFault && MessageBox.Show("Модель 1 '" + ModelName + "' в решении '" + sp[0] + "' содержит ошибки. Загружать её?",

"", MessageBoxButtons.YesNo) != DialogResult.Yes)

return;

if (ip1 < 0)

{

language = new CLangaugeRepository(new CText(ModelName, content));

ip1 = repository.repository[i0].list.Count;

repository.repository[i0].list.Add(language);

TreeNode node = treeRepository.Nodes[i0].Nodes.Add(ModelName);

node.ContextMenuStrip = menuLanguage;

}

else

{

language = repository.repository[i0].list[ip1];

language.language.content = content;

if (selected == "Загрузить в репозиторий извне")

{

language.programs.Clear();

treeRepository.Nodes[i0].Nodes[ip1].Nodes.Clear();

}

}

if (selected == "Загрузить в репозиторий извне")

{

string[] spd = dialog.FileName.Split(BackSlash);

string DirectoryName = "";

for (int i = 0; i < spd.GetLength(0) - 1; i++)

DirectoryName += spd[i] + "\\";

string[] FileNames = Directory.GetFiles(DirectoryName, "*." + ModelName);

for (int i = 0; i < FileNames.GetLength(0); i++)

{

ReadName = FileNames[i];

content = File.ReadAllText(ReadName, Encoding.Default);

string ProgramName = CText.GetModelName(ReadName);

List<CText> programs = repository.repository[i0].list[ip1].programs;

bool ToAdd = true;

for (int j = 0; j < programs.Count; j++)

if (programs[j].name == ProgramName)

{

ToAdd = false;

if (MessageBox.Show("Модель 2 '" + ProgramName + "' модели 1 '" + ModelName + "' в решении '" + sp[0] + "' уже существует. Заменить?",

"", MessageBoxButtons.YesNo) != DialogResult.Yes)

{

programs[j].content = content;

for (int k = 0; k < tabEditor.TabPages.Count; k++)

{

CTab tab = tabEditor.TabPages[k] as CTab;

if (tab.level == 2 && tab.SolutionName == sp[0] && tab.LanguageName == ModelName && tab.ProgramName == ProgramName)

tab.editor.Text = content;

}

}

}

if (ToAdd)

{

programs.Add(new CText(ProgramName, content));

TreeNode node = treeRepository.Nodes[i0].Nodes[ip1].Nodes.Add(ProgramName);

node.ContextMenuStrip = menuProgram;

}

}

}

sentence = new CSentence(language.language.content);

for (int i = tabEditor.TabPages.Count - 1; i >= 0; i--)

{

CTab tab = tabEditor.TabPages[i] as CTab;

if (tab.SolutionName == sp[0] && tab.LanguageName == ModelName)

{

if (tab.level == 1)

tab.editor.Text = language.language.content;

else

{

for (ip2 = language.programs.Count - 1; ip2 >= 0; ip2--)

if (tab.ProgramName == language.programs[ip2].name)

{

tab.sentence = sentence;

tab.editor.Text = language.programs[ip2].content;

break;

}

if (ip2 < 0)

tabEditor.TabPages.RemoveAt(i);

}

}

}

}

catch

{

MessageBox.Show("Ошибка при чтении '" + ReadName + "'");

}

return;

case 2:

if (repository.IndexesOf(sp[0], sp[1], ModelName, out ip0, out ip1, out ip2))

{

if (MessageBox.Show("Модель 2 '" + ModelName + "модели 1 '" + sp[1] + "' в решении '" + sp[0] + "' уже существует. Заменить?",

"", MessageBoxButtons.YesNo) != DialogResult.Yes)

return;

}

try

{

CText program;

CSentence sentence = new CSentence(repository.repository[i0].list[i1].language.content);

content = File.ReadAllText(ReadName, Encoding.Default);

sentence.Compile(content, -1);

if (!sentence.LanguageFault && sentence.CompileError &&

MessageBox.Show("Модель 2 '" + ModelName + "' модели 1 '" + sp[1] + "' в решении '" + sp[0] + "' содержит ошибки. Загружать её?",

"", MessageBoxButtons.YesNo) != DialogResult.Yes)

return;

if (ip2 < 0)

{

program = new CText(ModelName, content);

ip2 = repository.repository[i0].list[i1].programs.Count;

repository.repository[i0].list[i1].programs.Add(program);

TreeNode node = treeRepository.Nodes[i0].Nodes[i1].Nodes.Add(ModelName);

node.ContextMenuStrip = menuProgram;

}

else

{

program = repository.repository[i0].list[i1].programs[ip2];

program.content = content;

for (int i = 0; i < tabEditor.TabPages.Count; i++)

{

CTab tab = tabEditor.TabPages[i] as CTab;

if (tab.SolutionName == sp[0] && tab.LanguageName == sp[1] && tab.ProductName == ModelName)

tab.editor.Text = program.content;

}

}

}

catch

{

MessageBox.Show("Ошибка при чтении '" + ReadName + "'");

}

return;

default:

return;

}

}

}

}

/// Запомнить XML-репозиторий

private void buttonSave_Click(object sender, EventArgs e)

{

repository.XML.Save(RepositoryName);

}

private void contextCreate_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

{

string name;

string selected = e.ClickedItem.Text;

if (selected == "Создать решение")

{

name = GetNewSolutionName();

if (name != null)

{

repository.repository.Add(new CSolution(name));

TreeNode SolutionNode = treeRepository.Nodes.Add(name);

SolutionNode.ContextMenuStrip = menuLanguage;

}

return;

}

if (selected == "Загрузить решение извне" || selected == "Загрузить решение извне полностью")

{

FolderBrowserDialog dialog = new FolderBrowserDialog();

if (dialog.ShowDialog() == DialogResult.OK)

{

string FileName = dialog.SelectedPath;

name = GetNewSolutionName();

if (name != null)

{

repository.repository.Add(new CSolution(name));

List<CLangaugeRepository> list = repository.repository[repository.repository.Count - 1].list;

TreeNode SolutionNode = treeRepository.Nodes.Add(name);

SolutionNode.ContextMenuStrip = menuLanguage;

string LoadName = "";

try

{

string[] LanguageNames = Directory.GetFiles(FileName, "*.language");

for (int i = 0; i < LanguageNames.GetLength(0); i++)

{

LoadName = LanguageNames[i];

string LanguageName = CText.GetModelName(LoadName);

string content = File.ReadAllText(LoadName, Encoding.Default);

CSentence sentence = new CSentence(content);

if (!sentence.LanguageFault || MessageBox.Show("Модель 1 '" + LanguageName + "' в решении '" + name + "' содержит ошибки. Загружать её?",

"", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

CLangaugeRepository lan = new CLangaugeRepository(new CText(LanguageName, content));

list.Add(lan);

TreeNode LanguageNode = SolutionNode.Nodes.Add(LanguageName);

LanguageNode.ContextMenuStrip = menuLanguage;

if (selected == "Загрузить решение извне полностью")

{

string[] ProgramNames = Directory.GetFiles(FileName, "*." + LanguageName);

for (int j = 0; j < ProgramNames.GetLength(0); j++)

{

LoadName = ProgramNames[j];

string ProgramName = CText.GetModelName(LoadName);

content = File.ReadAllText(LoadName, Encoding.Default);

sentence.Compile(content, -1);

if (sentence.LanguageFault || !sentence.CompileError ||

MessageBox.Show("Модель 2 '" + ProgramName + "' модели 1 '" + LanguageName + "' в решении '" + name + "' содержит ошибки. Загружать её?",

"", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

lan.programs.Add(new CText(ProgramName, content));

TreeNode ProgramNode = LanguageNode.Nodes.Add(ProgramName);

ProgramNode.ContextMenuStrip = menuProgram;

}

}

}

}

}

}

catch

{

MessageBox.Show("Произошёл сбой при чтении файла '" + LoadName + "'.");

}

}

}

}

}

}

}

internal class CText

{

internal string name;

internal string content;

internal CText(string name, string content)

{

this.name = name;

this.content = content;

}

internal CText(XmlElement el)

{

this.name = el.GetAttribute("name");

this.content = el.InnerText;

}

internal XmlElement XML(XmlDocument doc, string type)

{

XmlElement ret = doc.CreateElement(type);

ret.SetAttribute("name", name);

ret.InnerText = content;

return ret;

}

static internal string GetModelName(string path)

{

char[] PointSeparator = { '.' };

char[] CatalogSeparator = { '\\', '/', ':' };

string[] sp = path.Split(CatalogSeparator);

sp = sp[sp.GetLength(0) - 1].Split(PointSeparator);

return sp[0];

} }

internal class CLangaugeRepository

{

internal CText language;

internal List<CText> programs;

internal CLangaugeRepository(CText langauge)

{

this.language = langauge;

programs = new List<CText>();

}

internal CLangaugeRepository(XmlElement el)

{

language = new CText(el.ChildNodes[0] as XmlElement);

programs = new List<CText>();

for (int i = 1; i < el.ChildNodes.Count; i++)

programs.Add(new CText(el.ChildNodes[i] as XmlElement));

}

internal XmlElement XML(XmlDocument doc)

{

XmlElement ret = doc.CreateElement("LangaugeRepository");

ret.AppendChild(language.XML(doc, "Language"));

for (int i = 0; i < programs.Count; i++)

ret.AppendChild(programs[i].XML(doc, "Program"));

return ret;

}

}

internal class CSolution

{

internal string name;

internal List<CLangaugeRepository> list;

internal CSolution(string name)

{

this.name = name;

list = new List<CLangaugeRepository>();

}

internal CSolution(XmlElement el)

{

name = el.GetAttribute("name");

list = new List<CLangaugeRepository>();

for (int i = 0; i < el.ChildNodes.Count; i++)

list.Add(new CLangaugeRepository(el.ChildNodes[i] as XmlElement));

}

internal XmlElement XML(XmlDocument doc)

{

XmlElement ret = doc.CreateElement("Solution");

ret.SetAttribute("name", name);

for (int i = 0; i < list.Count; i++)

ret.AppendChild(list[i].XML(doc));

return ret;

}

}

internal class CRepository

{

internal List<CSolution> repository;

internal CRepository()

{

repository = new List<CSolution>();

}

internal CRepository(XmlDocument doc)

{

for (int i = 0; i < doc.ChildNodes.Count; i++)

repository.Add(new CSolution(doc.ChildNodes[i] as XmlElement));

}

internal CRepository(string name)

{

XmlDocument doc = new XmlDocument();

doc.Load(name);

XmlNode root = doc.DocumentElement;

repository = new List<CSolution>();

for (int i = 0; i < root.ChildNodes.Count; i++)

repository.Add(new CSolution(root.ChildNodes[i] as XmlElement));

}

internal int IndexOf(string SolutionName)

{

for (int i = 0; i < repository.Count; i++)

if (repository[i].name == SolutionName)

return i;

return -1;

}

internal bool IndexesOf(string SolutionName, string LanguageName, out int i0, out int i1)

{

i0 = i1 = -1;

for (int i = 0; i < repository.Count; i++)

if (repository[i].name == SolutionName)

{

i0 = i;

List<CLangaugeRepository> languages = repository[i].list;

for (int j = 0; j < languages.Count; j++)

if (languages[j].language.name == LanguageName)

{

i1 = j;

return true;

}

}

return false;

}

internal bool IndexesOf(string SolutionName, string LanguageName, string ProgramName, out int i0, out int i1, out int i2)

{

i0 = i1 = i2 = -1;

for (int i = 0; i < repository.Count; i++)

if (repository[i].name == SolutionName)

{

i0 = i;

List<CLangaugeRepository> languages = repository[i].list;

for (int j = 0; j < languages.Count; j++)

if (languages[j].language.name == LanguageName)

{

i1 = j;

List<CText> programs = languages[j].programs;

for (int k = 0; k < programs.Count; k++)

if (programs[k].name == ProgramName)

{

i2 = k;

return true;

}}}return false; }

internal XmlDocument XML

{

get

{

XmlDocument ret = new XmlDocument();

ret.LoadXml("<?xml version='1.0' ?><LanguagesRepository></LanguagesRepository>");

XmlNode root = ret.DocumentElement;

for (int i = 0; i < repository.Count; i++)

root.AppendChild(repository[i].XML(ret));

return ret;

}}}}

Размещено на Allbest.ru

...

Подобные документы

  • Разработка текстового редактора с подсветкой синтаксиса языков программирования. Загрузка из XML-файла настроек для подсветки синтаксиса и конструкций языка. Формат файлов конфигурации и проверки. Разбор текста и применение к нему стилей, тестовый пример.

    курсовая работа [141,6 K], добавлен 13.03.2013

  • Формат файла конфигурации, содержащего данные для подсветки синтаксиса. Его проверка при помощи XML Schema. Реализация функций для чтения данных подсветки и по загрузке таблицы стилей, ключевых слов и типов. Разбор текста и применение к нему стилей.

    курсовая работа [122,3 K], добавлен 30.05.2015

  • Разработка программного приложения, производящего проверку синтаксиса простой программы: выбор метода создания синтаксического анализатора, описание требований к программному обеспечению, написание алгоритмов решения и тестирование конечного продукта.

    курсовая работа [579,7 K], добавлен 03.07.2011

  • Краткая характеристика предметно-ориентированных языков, различия между "внутренними" и "внешними" DSL. Особенности работы транслятора (компилятора). Листинг программы для разработки простейшего калькулятора с использованием программной среды Java.

    лабораторная работа [57,8 K], добавлен 31.03.2017

  • Применение правил грамматики. Синтаксический анализатор, нис- и восходящий разбор, полный перебор правил подстановки. Классификация грамматик по Хомскому. Определение языков с помощью автоматов. Форма Бекуса-Наура описания синтаксиса формальных языков.

    лекция [270,1 K], добавлен 19.10.2014

  • Разработка алгоритма как конструктивный компонент программирования, не зависящий от особенностей синтаксиса языков программирования и специфики функционирования конкретных ЭВМ. Алгоритм - операциональный подход к программированию. Экономичность алгоритма.

    учебное пособие [346,8 K], добавлен 09.02.2009

  • Обзор разнообразных методов теории линейных систем: методов корреляционного и регрессионного анализа, косинор-анализа. Особенности применения факторного анализа. Программная реализация метода главных компонент. Разработка нелинейных регрессионных моделей.

    дипломная работа [390,2 K], добавлен 03.09.2016

  • История разработки языка программирования Си. Программа на Си как одна или несколько единиц компиляции (файлов), стадии работы компилятора. Идентификаторы и ключевые слова, типы констант. Форма Бекуса-Наура описания синтаксиса формальных языков.

    презентация [257,7 K], добавлен 05.01.2014

  • Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.

    курсовая работа [2,6 M], добавлен 17.11.2014

  • Классификация текстовых редакторов и процессоров. Способы хранения текста в файле. Форматирование документа и его редактирование. Среда текстового редактора. Автоматическая проверка орфографии и синтаксиса текста, автотекст, автозамена, гипертекст.

    курсовая работа [35,0 K], добавлен 25.04.2013

  • Ознакомление с ситуацией распространения на рынке языков программирования. Определение плюсов и минусов Pascal, C++, VBA. Сравнение и анализ синтаксиса программ на основе одной задачи. Выявление лучшего языка для освоения первоначальных навыков.

    курсовая работа [1022,0 K], добавлен 13.10.2014

  • Классификация и возможности текстовых редакторов. Среда текстового редактора Microsoft Word 2003. Процесс редактирования текста, его копирование и перемещение. Проверка орфографии и синтаксиса, автотекст и автозамена. Пример гипертекстового документа.

    курсовая работа [2,4 M], добавлен 25.04.2013

  • Классификация и возможности текстовых редакторов, их основные элементы: рабочее поле, курсор, строка состояния и меню, полосы прокрутки, панель инструментов. Форматирование текста, проверка орфографии и синтаксиса. Создание гипертекстового документа.

    курсовая работа [3,6 M], добавлен 27.04.2013

  • Обзор средств разработки и технологий: особенности языка программирования Visual Basic и подсистемы WIN32 API. Методы, приемы решения задачи автоматического размещения текстовых надписей на рисунке. Механизм создания полигонального объекта. Код программы.

    курсовая работа [231,0 K], добавлен 28.08.2012

  • Основные методы описания синтаксиса языков программирования: формальные грамматики, формы Бэкуса-Наура и диаграммы Вирта. Разработка алгоритма решения задачи. Лексический и синтаксический анализатор, семантический анализ. Структурная организация данных.

    курсовая работа [680,1 K], добавлен 12.06.2011

  • Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.

    курсовая работа [83,0 K], добавлен 23.01.2014

  • Функциональные характеристики программы форматирования текстовых файлов, требования к ее интерфейсу и данным. Схема взаимодействия компонентов системы, выбор среды исполнения и программная реализация алгоритмов. Тестирование и оценка качества программы.

    курсовая работа [61,1 K], добавлен 25.07.2012

  • Разработка интерфейса программы, обеспечивающего доступ ко всем возможностям среды структурно-визуального программирования. Реализация инструментальных средств, позволяющих связывать компоненты в единое приложение. Создание иерархии классов представления.

    дипломная работа [2,3 M], добавлен 11.04.2012

  • Разработка алгоритмов и программных средств поддержки взаимодействия компетентностно-ориентированных моделей в обучающих ИЭС (АТ-ТЕХНОЛОГИЯ). Анализ функциональных возможностей базовой версии компонента выявления текущего уровня компетенций обучаемого.

    отчет по практике [1,6 M], добавлен 28.04.2015

  • Характеристика средств обработки текстовой информации, способы редактирования и форматирования документов. Порядок создания списков и таблиц, проверка орфографии и синтаксиса текста. Выбор формата файла. Работа в табличном процессоре Microsoft Excel.

    курсовая работа [411,1 K], добавлен 27.04.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.