Разработка инструментальных средств создания текстовых предметно-ориентированных языков: компонент проверки синтаксиса
Характеристика метода создания текстовых предметно-ориентированных языков. Расчет трудоемкости разработки компонента проверки синтаксиса. Проектирование архитектуры языкового инструментария и программная реализация компонента проверки синтаксиса.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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