Пример #1
0
        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);
        }
Пример #2
0
        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]);
            }
        }
Пример #3
0
        public void BasicHelloWorld()
        {
            List <Token> tokens = m_Tokenizer.Tokenize("hello, world!").Flush();

            AssertHelloWorld(tokens);
        }
Пример #4
0
    /// <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);
    }