public void ReturnsLoneArgumentsValue()
        {
            var number = 1234.567;
            var tokens = new Token[] { new Argument(number) };

            CheckResult(tokens, number);
        }
        public void ThrowsWhenTooFewArgumentsForOperator()
        {
            var tokens = new Token[]
            {
                new Argument(-3.7),
                new SumOperator()
            };

            var expression = new RpnExpression(tokens);
            var result = expression.CalculateResult();
        }
        public void CalculatesSimpleDivision()
        {
            var tokens = new Token[]
            {
                new Argument(18.9),
                new Argument(3),
                new DivisionOperator()
            };

            CheckResult(tokens, 6.3);
        }
        public void CalculatesSimpleSum()
        {
            var tokens = new Token[]
            {
                new Argument(4),
                new Argument(5),
                new SumOperator()
            };

            CheckResult(tokens, 9);
        }
        public void ResolvesMultipleOperatorExpression()
        {
            var tokens = new Token[]
            {
                new Argument(47.5),
                new Argument(38.5),
                new SubtractOperator(),
                new Argument(2),
                new MultiplicationOperator()
            };

            CheckResult(tokens, 18);
        }
        public void DisplaysReadableExpressionRepresentation()
        {
            var tokens = new Token[]
            {
                new Argument(89),
                new Argument(3.5),
                new SumOperator()
            };

            var expression = new RpnExpression(tokens);

            Assert.AreEqual("89 3.5 +", expression.ToString());
        }
        public void ThrowsIfTooManyTokensInExpression()
        {
            var tokens = new Token[]
            {
                new Argument(4.5),
                new Argument(7),
                new SumOperator(),
                new Argument(-1)
            };

            var expression = new RpnExpression(tokens);
            var result = expression.CalculateResult();
        }
        private void HandleToken(Token token, Stack<Argument> stack)
        {
            switch (token.Type)
            {
                case Token.TokenType.Argument:
                    stack.Push((Argument)token);
                    break;

                case Token.TokenType.Operator:
                    stack.Push(ExecuteOperator((Operator)token, stack));
                    break;

                default:
                    throw new ArgumentException("Unknown token type", nameof(token));
            }
        }
Beispiel #9
0
 public void Parse()
 {
     la = new Token();
     la.val = "";
     Get();
     Expressions();
     Expect(0);
 }
Beispiel #10
0
        Token NextToken()
        {
            while (ch == ' ' ||
            ch >= 9 && ch <= 10 || ch == 13
            ) NextCh();

            int recKind = noSym;
            int recEnd = pos;
            t = new Token();
            t.pos = pos; t.col = col; t.line = line; t.charPos = charPos;
            int state;
            if (start.ContainsKey(ch)) { state = (int) start[ch]; }
            else { state = 0; }
            tlen = 0; AddCh();

            switch (state) {
            case -1: { t.kind = eofSym; break; } // NextCh already done
            case 0: {
                if (recKind != noSym) {
                    tlen = recEnd - t.pos;
                    SetScannerBehindT();
                }
                t.kind = recKind; break;
            } // NextCh already done
            case 1:
                recEnd = pos; recKind = 1;
                if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;}
                else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
            case 2:
                recEnd = pos; recKind = 2;
                if (ch >= '0' && ch <= '9') {AddCh(); goto case 2;}
                else {t.kind = 2; break;}
            case 3:
                {t.kind = 3; break;}
            case 4:
                {t.kind = 4; break;}
            case 5:
                {t.kind = 6; break;}
            case 6:
                {t.kind = 9; break;}
            case 7:
                {t.kind = 10; break;}
            case 8:
                {t.kind = 11; break;}
            case 9:
                if (ch == '=') {AddCh(); goto case 10;}
                else {goto case 0;}
            case 10:
                {t.kind = 12; break;}
            case 11:
                {t.kind = 14; break;}
            case 12:
                {t.kind = 16; break;}
            case 13:
                {t.kind = 17; break;}
            case 14:
                {t.kind = 18; break;}
            case 15:
                {t.kind = 19; break;}
            case 16:
                {t.kind = 20; break;}
            case 17:
                recEnd = pos; recKind = 5;
                if (ch == '=') {AddCh(); goto case 8;}
                else {t.kind = 5; break;}
            case 18:
                recEnd = pos; recKind = 13;
                if (ch == '=') {AddCh(); goto case 11;}
                else {t.kind = 13; break;}
            case 19:
                recEnd = pos; recKind = 15;
                if (ch == '=') {AddCh(); goto case 12;}
                else {t.kind = 15; break;}

            }
            t.val = new String(tval, 0, tlen);
            return t;
        }
Beispiel #11
0
 void Init()
 {
     pos = -1; line = 1; col = 0; charPos = -1;
     oldEols = 0;
     NextCh();
     if (ch == 0xEF) { // check optional byte order mark for UTF-8
     NextCh(); int ch1 = ch;
     NextCh(); int ch2 = ch;
     if (ch1 != 0xBB || ch2 != 0xBF) {
         throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2));
     }
     buffer = new UTF8Buffer(buffer); col = 0; charPos = -1;
     NextCh();
     }
     pt = tokens = new Token();  // first token is a dummy
 }
Beispiel #12
0
 // get the next token (possibly a token already seen during peeking)
 public Token Scan()
 {
     if (tokens.next == null) {
     return NextToken();
     } else {
     pt = tokens = tokens.next;
     return tokens;
     }
 }
Beispiel #13
0
 // make sure that peeking starts at the current scan position
 public void ResetPeek()
 {
     pt = tokens;
 }
Beispiel #14
0
 // make sure that peeking starts at the current scan position
 public void ResetPeek()
 {
     pt = tokens;
 }
Beispiel #15
0
        Token NextToken()
        {
            while (ch == ' ' ||
                   ch >= 9 && ch <= 10 || ch == 13
                   )
            {
                NextCh();
            }

            int recKind = noSym;
            int recEnd  = pos;

            t     = new Token();
            t.pos = pos; t.col = col; t.line = line; t.charPos = charPos;
            int state;

            if (start.ContainsKey(ch))
            {
                state = (int)start[ch];
            }
            else
            {
                state = 0;
            }
            tlen = 0; AddCh();

            switch (state)
            {
            case -1: { t.kind = eofSym; break; }             // NextCh already done

            case 0: {
                if (recKind != noSym)
                {
                    tlen = recEnd - t.pos;
                    SetScannerBehindT();
                }
                t.kind = recKind; break;
            }             // NextCh already done

            case 1:
                recEnd = pos; recKind = 1;
                if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
                {
                    AddCh(); goto case 1;
                }
                else
                {
                    t.kind = 1; break;
                }

            case 2:
                recEnd = pos; recKind = 2;
                if (ch >= '0' && ch <= '9')
                {
                    AddCh(); goto case 2;
                }
                else
                {
                    t.kind = 2; break;
                }

            case 3:
            { t.kind = 3; break; }

            case 4:
            { t.kind = 4; break; }

            case 5:
                if (ch == '=')
                {
                    AddCh(); goto case 6;
                }
                else
                {
                    goto case 0;
                }

            case 6:
            { t.kind = 5; break; }

            case 7:
            { t.kind = 6; break; }

            case 8:
            { t.kind = 7; break; }

            case 9:
            { t.kind = 8; break; }

            case 10:
            { t.kind = 9; break; }

            case 11:
            { t.kind = 10; break; }
            }
            t.val = new String(tval, 0, tlen);
            return(t);
        }
Beispiel #16
0
        void Get()
        {
            for (;;) {
            t = la;
            la = scanner.Scan();
            if (la.kind <= maxT) { ++errDist; break; }

            la = t;
            }
        }
Beispiel #17
0
 void TypeExpr(out Type t)
 {
     t = null;
     if (la.kind == 7) {
     Get();
     t = Type.IntegerType;
     } else if (la.kind == 8) {
     Get();
     t = Type.BooleanType;
     } else SynErr(22);
 }
Beispiel #18
0
        // peek for the next token, ignore pragmas
        public Token Peek()
        {
            do {
            if (pt.next == null) {
                pt.next = NextToken();
            }
            pt = pt.next;
            } while (pt.kind > maxT); // skip pragmas

            return pt;
        }