using System; using System.Collections.Generic; using System.Linq; using System.Text; using OCamlC.AST; using OCamlC.Lex; using OCamlC.Parse; namespace OCamlC.Tests { public class TokenListBuilder { private readonly List _tokens = new List(); private bool _verbose = false; public TokenListBuilder Int(long value) { _tokens.Add(new IntLiteral(value, value.ToString())); return this; } /// /// Adds an infix operator of the correct precedence, /// or a keyword if this particular operator is a kw. /// public TokenListBuilder Infix(string op) { TokenType kwType; if (StaticData.Keywords.TryGetValue(op, out kwType)) { _tokens.Add(new Keyword(kwType, op)); } else { _tokens.Add(new InfixSymbol(StaticData.InfixSymbolClass(op), op)); } return this; } /// /// Adds a prefix operator of the correct precedence, /// or a keyword if this particular operator is a kw. /// public TokenListBuilder Prefix(string op) { TokenType kwType; if (StaticData.Keywords.TryGetValue(op, out kwType)) { _tokens.Add(new Keyword(kwType, op)); } else { _tokens.Add(new PrefixSymbol(op)); } return this; } internal TokenListBuilder Kw(string kw) { _tokens.Add(new Keyword(StaticData.Keywords[kw], kw)); return this; } internal TokenListBuilder Kw(TokenType kw) { _tokens.Add(new Keyword(kw, StaticData.KeywordTypes[kw])); return this; } internal TokenListBuilder Id(string p) { if (StaticData.Keywords.ContainsKey(p)) throw new ArgumentException(String.Format("{0} is a keyword, not an identifier"), p); _tokens.Add(new Identifier(p)); return this; } /// /// End of statement keyword, ";;" /// /// public TokenListBuilder EOS() { _tokens.Add(new Keyword(TokenType.KW_SEMISEMI, ";;")); return this; } /// /// Set the resulting scanner to give verbose output /// public TokenListBuilder Verbose() { _verbose = true; return this; } public ScanBase ToScanner() { ScannerInterfacer scanner = new ScannerInterfacer(_tokens); scanner.Verbose = _verbose; return scanner; } } }