ñêà÷àòü ðåôåðàòû
  RSS    

Ìåíþ

Áûñòðûé ïîèñê

ñêà÷àòü ðåôåðàòû

ñêà÷àòü ðåôåðàòûÊóðñîâàÿ ðàáîòà: Èíòåðàêòèâíûé èíòåðïðåòàòîð

                   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


Íîâîñòè

Áûñòðûé ïîèñê

Ãðóïïà âÊîíòàêòå: íîâîñòè

Ïîêà íåò

Íîâîñòè â Twitter è Facebook

  ñêà÷àòü ðåôåðàòû              ñêà÷àòü ðåôåðàòû

Íîâîñòè

ñêà÷àòü ðåôåðàòû

© 2010.