private IokeObject ParseMessageChain() { top = new ChainContext(top); while (ParseMessage()) { ; } top.PopOperatorsTo(999999); IokeObject ret = top.Pop(); top = top.parent; return(ret); }
private void PossibleOperator(IokeObject mx) { string name = Message.GetName(mx); if (IsUnary(name) || onlyUnaryOperators.Contains(name)) { top.Add(mx); top.Push(-1, mx, Level.Type.UNARY); return; } if (operatorTable.ContainsKey(name)) { var op = operatorTable[name]; top.PopOperatorsTo(op.precedence); top.Add(mx); top.Push(op.precedence, mx, Level.Type.REGULAR); } else { if (trinaryOperatorTable.ContainsKey(name)) { var opa = trinaryOperatorTable[name]; if (opa.arity == 2) { IokeObject last = top.PrepareAssignmentMessage(); mx.Arguments.Add(last); top.Add(mx); top.Push(13, mx, Level.Type.ASSIGNMENT); } else { IokeObject last = top.PrepareAssignmentMessage(); mx.Arguments.Add(last); top.Add(mx); } } else { if (invertedOperatorTable.ContainsKey(name)) { var op = invertedOperatorTable[name]; top.PopOperatorsTo(op.precedence); top.Add(mx); top.Push(op.precedence, mx, Level.Type.INVERTED); } else { int possible = PossibleOperatorPrecedence(name); if (possible != -1) { top.PopOperatorsTo(possible); top.Add(mx); top.Push(possible, mx, Level.Type.REGULAR); } else { top.Add(mx); } } } } }