Главная:
Рефераты
Главная
Финансы деньги и налоги
Философия
Физика и энергетика
Управление
Схемотехника
Стратегический менеджмент
Статистика
Соцобеспечение
Семейное право
Программирование компьютеры и кибернетика
Охрана окружающей среды экология
Основы права
Медицина
Криминалистика и криминология
Коммуникации и связь
Кибернетика
Качество упр-е качеством
КСЕ
Информатика ВТ телекоммуникации
Журналистика
Государство и право
Биографии
Банковское дело
Карта сайта
Рефераты. Интерактивный интерпретатор
get {
int count = m_names.Count;
string[] res = new string[count];
for (int i = 0; i < count; i++) {
res[i] = (m_names[i] as String);
}
for (int i = 0; i < count - 1; i++) {
int k = i;
for (int j = i + 1; j < count; j++)
k = (string.Compare(res[j], res[k]) < 0) ? j : k;
if (i != k) {
string temp = res[i];
res[i] = res[k];
res[k] = temp;
}
}
return res;
}
}
public void ReloadAll() {
m_subs = new ArrayList();
m_names = new ArrayList();
DirectoryInfo di =
new DirectoryInfo(Directory.GetCurrentDirectory() + @"\subroutines");
if (!di.Exists) {
di.Create();
}
foreach (FileInfo file in di.GetFiles()) {
if (Parser.IsID(file.Name)) {
LoadFile(file);
}
}
}
public void Unload(string name) {
int index = m_names.IndexOf(name);
if (index >= 0) {
m_names.RemoveAt(index);
m_subs.RemoveAt(index);
}
}
}
public Subroutine GetSub(string name) {
Subroutine res = m_subsman[name];
if (res == null)
throw new CalcException("Функция " + name + " не существует");
return res;
}
public void UnloadSub(string name) {
m_subsman.Unload(name);
}
}
}
4. Класс Namespace.
using System;
using System.Collections;
using interpr.logic.vartypes;
namespace interpr.logic {
public class NamespaceSerializationException : Exception {
public NamespaceSerializationException() : base() {}
}
public class Namespace {
protected class Pair {
internal string m_str;
internal VarBase m_var;
}
protected ArrayList m_list = new ArrayList();
protected int m_n = 0;
private Namespace m_previous_namespace = null;
public Namespace PreviousNamespace {
get { return m_previous_namespace; }
}
public Namespace(Namespace previous) {
m_previous_namespace = previous;
}
protected Namespace() {}
public VarBase Get(string name) {
if (m_n == 0)
return null;
int i = 0;
Pair p;
do {
p = (m_list[i++] as Pair);
if (p.m_str == name)
return p.m_var;
} while (i < m_n);
return null;
}
public void Assign(VarBase var, string name) {
Pair p;
if (m_n != 0) {
int i = 0;
do {
p = (m_list[i++] as Pair);
if (p.m_str == name) {
p.m_var = var;
return;
}
} while (i < m_n);
}
p = new Pair();
p.m_var = var;
p.m_str = name;
m_list.Add(p);
m_n++;
}
public void AssignToElement(SingleVar var, string name, int index) {
Pair p;
if (m_n != 0) {
int i = 0;
do {
p = (m_list[i++] as Pair);
if (p.m_str == name) {
if (!p.m_var.IsArray())
throw new CalcException("Переменная не является массивом");
(p.m_var as ArrayVar)[index] = var;
return;
}
} while (i < m_n);
}
p = new Pair();
p.m_var = new ArrayVar();
(p.m_var as ArrayVar)[index] = var;
p.m_str = name;
m_list.Add(p);
m_n++;
}
public void Remove(String name) {
if (m_n == 0)
return;
int i = 0;
do {
Pair p = (m_list[i++] as Pair);
if (p.m_str == name) {
m_list.RemoveAt(i - 1);
m_n--;
return;
}
} while (i < m_n);
}
public VarBase this[string name] {
set { Assign(value, name); }
get { return Get(name); }
}
}
}
5. Интерфейс IСomputable.
namespace interpr.logic {
public interface IComputable {
logic.vartypes.VarBase Compute();
}
}
6. Класс Call.
using interpr.logic.vartypes;
namespace interpr.logic {
public class Call : IComputable {
private Operation m_op;
private ArgList m_al = null;
public Call(Operation op) {
m_op = op;
}
public void SetArgList(ArgList al) {
m_al = al;
}
public int ReqCount {
get { return m_op.ReqCount; }
}
public VarBase Compute() {
return m_op.Perform(m_al);
}
}
}
7. Класс ArgList
using interpr.logic.vartypes;
namespace interpr.logic {
public class ArgList {
private bool m_read = false;
private LinkedList m_list = new LinkedList();
private LinkedList.Iterator m_i = null;
public void Add(VarBase var) {
if (m_read)
throw new OtherException("Write to the argument list after reading begin");
m_list.Add(var);
}
public VarBase Get() {
if (!m_read)
throw new OtherException("Try to read from argument list before reset");
if (!m_i.HasPrevious)
throw new OtherException("Try to read from empty argument list");
m_read = true;
IComputable obj = (m_i.Previous() as IComputable);
if (obj == null)
throw new CalcException("Переменная не инициализированна.");
return obj.Compute();
}
public void Reset() {
m_read = true;
m_i = m_list.GetIterator(m_list.Count);
}
public int Count {
get { return m_list.Count; }
}
}
}
8. Класс Expression.
using System;
using interpr.logic.vartypes;
namespace interpr.logic {
public class Expression {
public Expression(String str) {
Parser p = new Parser(str);
Analyse(p);
}
public Expression(Parser p) {
Analyse(p);
}
private class Element {
internal IComputable m_o;
internal Element m_next;
internal Element(IComputable obj, Element next) {
m_o = obj;
m_next = next;
}
}
private Element m_top = null;
private Element m_bottom = null;
private int m_c = 0;
private void AddFront(IComputable obj) {
m_c++;
if (m_c == 1)
m_top = m_bottom = new Element(obj, null);
else {
Element t = new Element(obj, null);
m_bottom.m_next = t;
m_bottom = t;
}
}
private void Analyse(Parser p) {
try {
LinkedList l = new LinkedList();
while (p.MoveNext())
l.Add(p.Current);
OPZ(l);
}
catch (CalcException ex) {
throw ex;
}
catch {
throw new SyntaxErrorException("Синтаксическая ошибка в выражении");
}
}
private void OPZ(LinkedList tokens) {
/* ** Бинарная операция выталкивает из стека в результат
* все операции с большим или равным приоритетом, затем
* записывается в стек сама
* ** Унарная операция записывается в стек
* ** Открывающая скобка записывается в стек
* ** Закрывающая скобка выталкивает в результат все операции
* из стека до открывающей скобки, затем
* скобки уничтожаются и выталкиваются унарные операции
* ** Переменная или константа сразу пишутся в результат, затем
* выталкиваются из стека унарные операции
* ** При вызове функции
Страницы:
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
, 10,
11
,
12
,
13
,
14
,
15
,
16
,
17
Апрель (48)
Март (20)
Февраль (988)
Январь (720)
Январь (21)
2012 © Все права защищены
При использовании материалов активная
ссылка на источник
обязательна.