public void SimpleEscape() { List <Token> tokens = m_Tokenizer.Tokenize("hello\\, world\\!").Flush(); Assert.AreEqual(3, tokens.Count); TokenizerTestHelper.AssertToken(tokens[0], ETokenType.Value, "hello,", 0, 0); TokenizerTestHelper.AssertToken(tokens[1], ETokenType.Separator, " ", 0, 6); TokenizerTestHelper.AssertToken(tokens[2], ETokenType.Value, "world!", 0, 7); }
public void TokenizingTest() { var source = new[] { "export", "interface", "ISomething", "{", "private", "field:", "number;", "}" }; StringBuilder sb = new StringBuilder(); Random r = new Random(); foreach (var s in source) { if (r.Next(10) > 5) { sb.Append("\t"); } sb.Append(s); var num = r.Next(1, 10); sb.Append(new string(' ', num)); if (r.Next() > 5) { sb.Append('\n'); } } string[] result = null; using (var ss = new StringReader(sb.ToString())) { SimpleTokenizer st = new SimpleTokenizer(ss); result = st.Tokenize().ToArray(); } Assert.Equal(result.Length, source.Length); for (int i = 0; i < source.Length; i++) { Assert.Equal(source[i], result[i]); } }
public void BasicHelloWorld() { List <Token> tokens = m_Tokenizer.Tokenize("hello, world!").Flush(); AssertHelloWorld(tokens); }
/// <summary> /// コマンド の entry point /// </summary> /// <param name="args">コマンドライン引数</param> static void Main(string[] args) { bool tokenizeOnly = false; // tokenize だけで終わるかどうか bool parseOnly = false; // parse だけで終わるかどうか bool runAsCalcurator = false; // 計算機として動く string src = null; // 直接実行するソース // 引数をparseする var rest = new List <string>(); for (int i = 0; i < args.Length; i++) { var arg = args[i]; switch (arg) { case "-h": case "--help": showHelpAndExit(); break; case "-t": case "--tokenize": tokenizeOnly = true; break; case "-p": case "--parse": parseOnly = true; break; case "-d": case "--debug": Logger.LogEnabled = true; break; case "-e": src = args[i + 1]; i++; break; case "-c": case "--calc": runAsCalcurator = true; src = args[i + 1]; i++; break; default: rest.Add(arg); break; } } // 各実行器を用意する var tokenizer = new SimpleTokenizer(); var parser = new Parser(); var interpreter = new Interpreter(); // ソースファイルを読み込む if (src == null) { // 引数がないなら、ヘルプを表示して終わる if (rest.Count != 1) { showHelpAndExit(); } src = File.ReadAllText(rest[0]); } // Tokenize を行う var tokens = tokenizer.Tokenize(src); if (tokenizeOnly) { Console.WriteLine(string.Join(" ", tokens.Select(t => t.Text).ToArray())); exit(0); } // Parse を行う MyLang.Ast.Ast ast; if (runAsCalcurator) { ast = parser.ParseCalcurator(tokens); } else { ast = parser.Parse(tokens); } if (parseOnly) { Console.WriteLine(new MyLang.AstDisplayer().BuildString(ast, false)); exit(0); } // Interpreter で実行する interpreter.Run(ast); exit(0); }