Example #1
0
        public void TestEnv()
        {
            var global = new Env(null);
            var main = new Env(global);

            var tok = new Word("some_var", Tag.ID);
            var id = new Id(tok, Sara.Type.Int, 0xff);
            global.AddIdentifier(tok, id);
            
            Assert.ReferenceEquals(id, main.Get(tok));
            Assert.IsNull(global.Get(new Token(Tag.ID)));
        }
Example #2
0
        public void TestWord()
        {
            Assert.AreEqual(Tag.AND, Word.and.TagValue);
            Assert.AreEqual("&&", Word.and.Lexeme);

            Assert.AreEqual(Tag.EQ, Word.eq.TagValue);
            Assert.AreEqual("==", Word.eq.Lexeme);

            Assert.AreEqual(Tag.FALSE, Word.False.TagValue);
            Assert.AreEqual("false", Word.False.Lexeme);

            Assert.AreEqual(Tag.GE, Word.ge.TagValue);
            Assert.AreEqual(">=", Word.ge.Lexeme);

            Assert.AreEqual(Tag.LE, Word.le.TagValue);
            Assert.AreEqual("<=", Word.le.Lexeme);

            Assert.AreEqual(Tag.MINUS, Word.minus.TagValue);
            Assert.AreEqual("minus", Word.minus.Lexeme);

            Assert.AreEqual(Tag.NE, Word.ne.TagValue);
            Assert.AreEqual("!=", Word.ne.Lexeme);

            Assert.AreEqual(Tag.OR, Word.or.TagValue);
            Assert.AreEqual("||", Word.or.Lexeme);

            Assert.AreEqual(Tag.TEMP, Word.temp.TagValue);
            Assert.AreEqual("t", Word.temp.Lexeme);

            Assert.AreEqual(Tag.TRUE, Word.True.TagValue);
            Assert.AreEqual("true", Word.True.Lexeme);

            var w = new Word("foo", Tag.ID);
            Assert.AreEqual("foo", w.Lexeme);
            Assert.AreEqual("foo", w.ToString());
            Assert.AreEqual(Tag.ID, w.TagValue);
        }
Example #3
0
        /// <summary>
        /// Read and return the current token
        /// </summary>
        /// <returns></returns>
        public Token Scan()
        {
            //for white spaces
            for (; !this.EofReached; this.ReadChar())
            {
                if (_curr == ' ' || _curr == '\t')
                { 
                    continue; 
                }
                else if (_curr == '\r')
                {
                    this.ReadChar();    //eat \r    
                    ++Line; 
                }
                else break;
            }

            if (this.EofReached) return null;

            //for operators like && !=, etc
            switch (_curr)
            {
                case '&':
                    return this.ReadChar('&') ? Word.and : new Token('&');
                case '|':
                    return this.ReadChar('|') ? Word.or : new Token('|');
                case '=':
                    return this.ReadChar('=') ? Word.eq : new Token('=');
                case '!':
                    return this.ReadChar('=') ? Word.ne : new Token('!');
                case '<':
                    return this.ReadChar('=') ? Word.le : new Token('<');
                case '>':
                    return this.ReadChar('=') ? Word.ge : new Token('>');
            }

            //for numbers
            if (char.IsDigit(_curr))
            {
                int v = 0;
                do{
                    v = 10 * v + (int)(_curr - '0');
                    this.ReadChar();
                } while (char.IsDigit(_curr));
                if (_curr != '.') return new Num(v);

                float f = v;
                for (float d = 10; ; d *= 10)
                {
                    this.ReadChar();
                    if (!char.IsDigit(_curr)) break;
                    f += (int)(_curr - 48) / d;
                }
                return new Real(f);
            }

            //for identifiers
            if (char.IsLetter(_curr))
            {
                var b = new StringBuilder();
                do
                {
                    b.Append(_curr); 
                    this.ReadChar();
                } while (char.IsLetterOrDigit(_curr));
                var s = b.ToString();
                if (KeyWords.ContainsKey(s)) return KeyWords[s];
                else return KeyWords[s] = new Word(s, Tag.ID);
            }

            //for the rest 
            var tok = new Token(_curr);
            if (!this.EofReached) _curr = ' ';
            return tok;
        }
Example #4
0
 private void Reserve(Word word)
 {
     KeyWords.Add(word.Lexeme, word); 
 }