Рефераты. Интерактивный интерпретатор

res = "~";

break;

}

case '>':

{

cur++;

if (m_a[cur] == '=') {

cur++;

res = ">=";

} else

res = ">";

break;

}

case '<':

{

cur++;

switch (m_a[cur]) {

case '=':

{

cur++;

res = "<=";

break;

}

case '>':

{

cur++;

res = "<>";

break;

}

default:

{

res = "<";

break;

}

}

break;

}

default:

{

res = m_a[cur].ToString();

cur++;

break;

}

}

} else {

res = m_a[cur].ToString();

cur++;

}

}

if ((cur < end) && IsSp(m_a[cur]))

cur++;

m_new_cur = cur;

return res;

}

public object Current {

get { return GetCurrent(); }

}

public bool MoveNext() {

if (m_at_begin) {

m_at_begin = false;

return HasMore();

}

if (m_new_cur < 0)

GetCurrent();

m_cur = m_new_cur;

m_new_cur = -1;

return HasMore();

}

public IEnumerator GetEnumerator() {

return this;

}

public static bool IsUserID(string name) {

if (!IsID(name))

return false;

if (name == "abs")

return false;

if (name == "cos")

return false;

if (name == "sin")

return false;

if (name == "tg")

return false;

if (name == "arccos")

return false;

if (name == "arcsin")

return false;

if (name == "arctg")

return false;

if (name == "exp")

return false;

if (name == "pow")

return false;

if (name == "ln")

return false;

if (name == "lg")

return false;

if (name == "log")

return false;

if (name == "sqrt")

return false;

if (name == "pi")

return false;

if (name == "idiv")

return false;

if (name == "iff")

return false;

if (name == "imod")

return false;

if (name == "random")

return false;

if (name == "substr")

return false;

if (name == "strlen")

return false;

if (name == "strpos")

return false;

if (name == "toint")

return false;

if (name == "toreal")

return false;

if (name == "tostring")

return false;

if (name == "isarray")

return false;

if (name == "issingle")

return false;

if (name == "isstring")

return false;

if (name == "isnum")

return false;

if (name == "isreal")

return false;

if (name == "isint")

return false;

if (name == "size")

return false;

return true;

}

}

}

11. Класс LineCompiler.

using System;

using interpr.logic.operators;

namespace interpr.logic {

public class LineCompiler {

private LineCompiler() {}

public static Command CompileCommand(string str) {

Parser p = new Parser(str);

if (!p.HasMore()) {

return new EmptyCommand();

}

String pstr = p.GetString();

int posa = pstr.IndexOf(":=");

if (posa >= 0) {

int cq = 0;

for (int iq = 0; iq < posa; iq++)

if (pstr[iq] == '\"')

cq++;

if (cq%2 == 0) {

try {

if (posa == 0)

throw new SyntaxErrorException("Синтаксическая ошибка");

try {

if (pstr[posa - 1] == '}') {

int posob = pstr.IndexOf(' else {

return new AssignCommand(pstr.Substring(0, posa),

pstr.Substring(posa + 2));

}

} catch {

throw new SyntaxErrorException("Синтаксическая ошибка");

}

} catch (CalcException ex) {

throw new SyntaxErrorException(ex.Message);

}

}

}

p.MoveNext();

string firsttoken = (p.Current as String);

try {

if (firsttoken == "clear") {

if (!p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

Command cc = new ClearCommand(p.Current as String);

if (p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

return cc;

}

if (firsttoken == "print") {

Expression expr = new Expression(p);

return new PrintCommand(expr);

} else if (firsttoken == "println") {

Expression expr = new Expression(p);

return new PrintLnCommand(expr);

} else if (firsttoken == "call") {

Expression expr = new Expression(p);

return new CallCommand(expr);

} else {

p.Reset();

Expression expr1 = new Expression(p);

return new PrintLnCommand(expr1);

}

} catch (SyntaxErrorException ex) {

throw ex;

} catch (Exception ex) {

throw new SyntaxErrorException(ex.Message);

}

}

public static IOperator CompileOperator(string str) {

Parser p = new Parser(str);

if (!p.HasMore()) {

return new EmptyCommand();

}

String pstr = p.GetString();

p.MoveNext();

string firsttoken = (p.Current as String);

if (firsttoken == "for") {

try {

return ParseForStatement(p.GetString());

} catch (SyntaxErrorException ex) {

throw ex;

} catch (Exception ex) {

throw new SyntaxErrorException(ex.Message);

}

}

int posa = pstr.IndexOf(":=");

if (posa >= 0) {

int cq = 0;

for (int iq = 0; iq < posa; iq++)

if (pstr[iq] == '\"')

cq++;

if (cq%2 == 0) {

try {

if (posa == 0)

throw new SyntaxErrorException("Синтаксическая ошибка");

try {

if (pstr[posa - 1] == '}') {

int posob = pstr.IndexOf(' else {

return new AssignCommand(pstr.Substring(0, posa),

pstr.Substring(posa + 2));

}

} catch {

throw new SyntaxErrorException("Синтаксическая ошибка");

}

} catch (CalcException ex) {

throw new SyntaxErrorException(ex.Message);

}

}

}

try {

if (firsttoken == "clear") {

if (!p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

Command cc = new ClearCommand(p.Current as String);

if (p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

return cc;

} else if (firsttoken == "next") {

if (p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

return new NextOperator();

} else if (firsttoken == "else") {

if (p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

return new ElseOperator();

} else if (firsttoken == "endif") {

if (p.MoveNext())

throw new SyntaxErrorException("Синтаксическая ошибка");

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.