Êóðñîâàÿ ðàáîòà: Èíòåðàêòèâíûé èíòåðïðåòàòîð
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) {
/* ** Áèíàðíàÿ îïåðàöèÿ âûòàëêèâàåò èç ñòåêà â ðåçóëüòàò
* âñå îïåðàöèè ñ áîëüøèì èëè ðàâíûì ïðèîðèòåòîì, çàòåì
* çàïèñûâàåòñÿ â ñòåê ñàìà
* ** Óíàðíàÿ îïåðàöèÿ çàïèñûâàåòñÿ â ñòåê
* ** Îòêðûâàþùàÿ ñêîáêà çàïèñûâàåòñÿ â ñòåê
* ** Çàêðûâàþùàÿ ñêîáêà âûòàëêèâàåò â ðåçóëüòàò âñå îïåðàöèè
* èç ñòåêà äî îòêðûâàþùåé ñêîáêè, çàòåì
* ñêîáêè óíè÷òîæàþòñÿ è âûòàëêèâàþòñÿ óíàðíûå îïåðàöèè
* ** Ïåðåìåííàÿ èëè êîíñòàíòà ñðàçó ïèøóòñÿ â ðåçóëüòàò, çàòåì
* âûòàëêèâàþòñÿ èç ñòåêà óíàðíûå îïåðàöèè
* ** Ïðè âûçîâå ôóíêöèè
* ñíà÷àëà îòäåëüíî ðàçáèðàþòñÿ âñå îïåðàíäû, çàòåì â ðåçóëüòàò
* äîïèñûâàåòñÿ ñàìà ôóíêöèÿ, êàê îïåðàöèÿ
* ** Îáðàùåíèå ê ýëåìåíòó ìàññèâà îáðàáàòûâàåòñÿ àíàëîãè÷íî
* Â êîíöå âñå îñòàâøèåñÿ â ñòåêå îïåðàöèè âûòàëêèâàþòñÿ â ðåçóëüòàò
*/
InterprEnvironment env = InterprEnvironment.Instance;
if (tokens.IsEmpty()) return;
LinkedList.Iterator itr = tokens.GetIterator();
LinkedList stk = new LinkedList();
while (itr.HasMore) {
string si = (itr.Step() as System.String);
if (si == "(") {
stk.Add(O_BR);
}
else if (si == ")") {
while (true) {
object o = stk.RemoveLast();
if (o == O_BR) break;
AddFront(new Call(o as Operation));
}
while ((!stk.IsEmpty()) && IsUnary(stk.Last)) {
AddFront(new Call(stk.RemoveLast() as Operation));
}
}
else if (Parser.IsID(si)) {
bool bfun = false;
bool barray = false;
if (itr.HasMore) {
string s = (itr.Step() as System.String);
if (s == "[")
bfun = true;
else if (s == "{")
barray = true;
else
itr.Previous();
}
if (bfun) {
LinkedList l = null;
while (true) {
l = new LinkedList();
int level = 0;
while (true) {
if (!itr.HasMore)
throw new SyntaxErrorException("Ñèíòàêñè÷åñêàÿ îøèáêà â âûðàæåíèè");
string sj = (itr.Step() as System.String);
if (sj == "[") {
level++;
l.Add(sj);
}
else if (sj == "]") {
if (level == 0)
goto label1;
else {
level--;
l.Add(sj);
}
}
else if (sj == ",") {
if (level > 0)
l.Add(sj);
else
break;
}
else
l.Add(sj);
}
OPZ(l);
}
label1:
if (l != null)
OPZ(l);
Operation sub = env.GetFunction(si);
AddFront(new Call(sub));
while ((stk.Count > 0) && IsUnary(stk.Last)) {
AddFront(new Call((Operation) stk.RemoveLast()));
}
}
else if (barray) {
LinkedList l = new LinkedList();
int level = 0;
while (true) {
if (!itr.HasMore)
throw new SyntaxErrorException("Ñèíòàêñè÷åñêàÿ îøèáêà â âûðàæåíèè");
String sj = (String) itr.Step();
if (sj == "{") {
level++;
l.Add(sj);
}
else if (sj == "}") {
if (level == 0)
break;
else {
level--;
l.Add(sj);
}
}
else
l.Add(sj);
}
OPZ(l);
VarName v = new VarName(si);
AddFront(v);
AddFront(new Call(Operation.INDEX));
while ((stk.Count > 0) && IsUnary(stk.Last)) {
AddFront(new Call(stk.RemoveLast() as Operation));
}
}
else {
VarName v = new VarName(si);
AddFront(v);
while ((stk.Count > 0) && IsUnary(stk.Last)) {
AddFront(new Call(stk.RemoveLast() as Operation));
}
}
}
else {
Operation op = StrToOperation(si);
if (op == null) {
SingleVar sv = SingleVar.FromString(si);
if (si == null)
throw new SyntaxErrorException("Ñèíòàêñè÷åñêàÿ îøèáêà â âûðàæåíèè");
AddFront(sv);
while ((stk.Count > 0) && IsUnary(stk.Last)) {
AddFront(new Call(stk.RemoveLast() as Operation));
}
}
else {
//operation
if (op == Operation.ADD) {
itr.Previous();
if (!itr.HasPrevious) {
stk.Add(Operation.UPLUS);
itr.Step();
continue;
}
String strpr = (String) itr.Previous();
itr.Step();
itr.Step();
if ((StrToOperation(strpr) != null) || (strpr == "(") ||
(strpr == "[") || (strpr == "{")) {
stk.Add(Operation.UPLUS);
continue;
}
}
else if (op == Operation.SUB) {
itr.Previous();
if (!itr.HasPrevious) {
stk.Add(Operation.UMINUS);
itr.Step();
continue;
}
String strpr = (String) itr.Previous();
itr.Step();
itr.Step();
if ((StrToOperation(strpr) != null) || (strpr == "(") ||
(strpr == "[") || (strpr == "{")) {
stk.Add(Operation.UMINUS);
continue;
}
}
else if (op == Operation.NOT) {
stk.Add(op);
continue;
}
if (stk.IsEmpty() || (stk.Last == O_BR)) {
Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14