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))); }
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); }
/// <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; }
private void Reserve(Word word) { KeyWords.Add(word.Lexeme, word); }