public void TestCreateWord() { var w = new Word( Tag.True, "true" ); Assert.AreEqual( Tag.True, w.Tag ); Assert.AreEqual( "true", w.Lexeme ); }
public Token Scan( StringReader reader ) { for ( ;; _peek = (char) reader.Read() ) { if ( _peek == ' ' || _peek == '\t' ) continue; if ( _peek == '\n' ) Line += 1; else break; } if ( Char.IsDigit( _peek ) ) { var buf = new StringBuilder(); do { buf.Append( _peek ); _peek = (char) reader.Read(); } while( Char.IsDigit( _peek ) ); if ( _peek == '.' ) { buf.Append( _peek ); _peek = (char) reader.Read(); while( Char.IsDigit( _peek ) ) { buf.Append( _peek ); _peek = (char)reader.Read(); } CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); ci.NumberFormat.CurrencyDecimalSeparator = "."; double d = double.Parse( buf.ToString(), NumberStyles.Any, ci ); return new Float( Tag.Float, d ); } return new Num( Tag.Num, int.Parse( buf.ToString() ) ); } if ( _peek == '.' ) { var buf = new StringBuilder(); buf.Append( _peek ); _peek = (char)reader.Read(); while ( Char.IsDigit( _peek ) ) { buf.Append( _peek ); _peek = (char)reader.Read(); } CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); ci.NumberFormat.CurrencyDecimalSeparator = "."; double d = double.Parse( buf.ToString(), NumberStyles.Any, ci ); return new Float( Tag.Float, d ); } if ( Char.IsLetter( _peek ) ) { var buf = new StringBuilder(); do { buf.Append( _peek ); _peek = (char) reader.Read(); } while( Char.IsLetterOrDigit( _peek ) ); string s = buf.ToString(); var w = (Word) _words[s]; if ( w != null ) return w; w = new Word( Tag.Id, s ); _words.Add( s, w ); return w; } if ( _peek == '/' ) { _peek = (char) reader.Read(); if ( _peek == '/' ) { _peek = (char) reader.Read(); var buf = new StringBuilder(); do { buf.Append( _peek ); _peek = (char) reader.Read(); } while( _peek != '\n' ); return new Comment( Tag.Comment, buf.ToString() ); } if ( _peek == '*' ) { var buf = new StringBuilder(); _peek = (char) reader.Read(); while( true ) { if ( _peek == '*' ) { _peek = (char) reader.Read(); if ( _peek == '/' ) { return new Comment( Tag.Comment, buf.ToString() ); } buf.Append( '*' ); } else { buf.Append( _peek ); _peek = (char) reader.Read(); } } } } if ( _peek == '<' ) { var buf = new StringBuilder(); buf.Append( _peek ); _peek = (char) reader.Read(); if ( _peek == '=' ) { buf.Append( _peek ); _peek = (char) reader.Read(); return new Word( Tag.LessOrEqual, buf.ToString() ); } return new Word( Tag.Less, buf.ToString() ); } if ( _peek == '>' ) { var buf = new StringBuilder(); buf.Append( _peek ); _peek = (char) reader.Read(); if ( _peek == '=' ) { buf.Append( _peek ); _peek = (char) reader.Read(); return new Word( Tag.BetterOrEqual, buf.ToString() ); } return new Word( Tag.Better, buf.ToString() ); } if ( _peek == '=' ) { var buf = new StringBuilder(); buf.Append( _peek ); _peek = (char) reader.Read(); if ( _peek == '=' ) { buf.Append( _peek ); _peek = (char) reader.Read(); return new Word( Tag.Equal, buf.ToString() ); } } if ( _peek == '!' ) { var buf = new StringBuilder(); buf.Append( _peek ); _peek = (char) reader.Read(); if ( _peek == '=' ) { buf.Append( _peek ); _peek = (char) reader.Read(); return new Word( Tag.NotEqual, buf.ToString() ); } } var t = new Token( _peek ); _peek = ' '; return t; }
private void Reserve( Word word ) { _words.Add( word.Lexeme, word ); }