コード例 #1
0
        /// <summary>
        /// Take a token from the stream.
        /// </summary>
        public ScriptToken Take()
        {
            Peek();

            var result = _read[0];

            _read.RemoveAt(0);

            Previous = result;

            return(result);
        }
コード例 #2
0
        public ScriptType ParseType(ScriptToken token)
        {
            if (token.Type != ScriptTokenType.Identifier)
            {
                throw new CompilerException(token, CompilerError.ExpectedButFound, ScriptTokenType.Identifier, token);
            }

            var isResizable = false;
            var arrayDims   = 0;

            if (token.Contents == "resizeable") // yes
            {
                isResizable = true;
                token       = Take(ScriptTokenType.Identifier);
            }

            var typeName = token.Contents;

            if (Match(ScriptTokenType.Dot))
            {
                typeName += "." + string.Join(".", ParseSeparatedBy(ScriptTokenType.Dot, (_, first) =>
                {
                    if (first)
                    {
                        Take(ScriptTokenType.Dot);
                    }

                    return(Take(ScriptTokenType.Identifier).Contents);
                }));
            }

            if (isResizable)
            {
                Take(ScriptTokenType.LeftSquare);
                Take(ScriptTokenType.RightSquare);
            }
            else
            {
                while (MatchAndTake(ScriptTokenType.LeftSquare))
                {
                    Take(ScriptTokenType.RightSquare);
                    arrayDims++;
                }
            }

            return(new ScriptType(typeName, arrayDims, isResizable));
        }
コード例 #3
0
        public void ParseNamedType(ScriptToken token, out ScriptType type, out string name)
        {
            type = ParseType(token);
            name = Take(ScriptTokenType.Identifier).Contents;

            var arrayDims = 0;

            while (MatchAndTake(ScriptTokenType.LeftSquare))
            {
                Take(ScriptTokenType.RightSquare);
                arrayDims++;
            }

            if (arrayDims == 0)
            {
                return;
            }

            type = new ScriptType(type.Name, type.ArrayDimensions + arrayDims, type.IsResizable);
        }
コード例 #4
0
        static ScriptLexer()
        {
            EofToken = new ScriptToken(null, default(SourcePosition), default(SourcePosition), ScriptTokenType.Eof, null);

            _operators = new OperatorDictionary <ScriptTokenType>
            {
                { ";", ScriptTokenType.Semicolon },
                { ",", ScriptTokenType.Comma },
                { ".", ScriptTokenType.Dot },
                { "=", ScriptTokenType.Assign },
                { "?", ScriptTokenType.QuestionMark },
                { ":", ScriptTokenType.Colon },

                { "(", ScriptTokenType.LeftParen },
                { ")", ScriptTokenType.RightParen },

                { "{", ScriptTokenType.LeftBrace },
                { "}", ScriptTokenType.RightBrace },

                { "[", ScriptTokenType.LeftSquare },
                { "]", ScriptTokenType.RightSquare },

                { "+", ScriptTokenType.Add },
                { "+=", ScriptTokenType.AddAssign },
                { "-", ScriptTokenType.Subtract },
                { "-=", ScriptTokenType.SubtractAssign },
                { "*", ScriptTokenType.Multiply },
                { "*=", ScriptTokenType.MultiplyAssign },
                { "/", ScriptTokenType.Divide },
                { "/=", ScriptTokenType.DivideAssign },
                { "%", ScriptTokenType.Remainder },
                { "%=", ScriptTokenType.RemainderAssign },
                { "++", ScriptTokenType.Increment },
                { "--", ScriptTokenType.Decrement },

                { "==", ScriptTokenType.EqualTo },
                { "!=", ScriptTokenType.NotEqualTo },
                { ">", ScriptTokenType.GreaterThan },
                { ">=", ScriptTokenType.GreaterThanOrEqual },
                { "<", ScriptTokenType.LessThan },
                { "<=", ScriptTokenType.LessThanOrEqual },

                { "&&", ScriptTokenType.LogicalAnd },
                { "||", ScriptTokenType.LogicalOr },
                { "!", ScriptTokenType.LogicalNot },

                { "~", ScriptTokenType.BitwiseNot },
                { "&", ScriptTokenType.BitwiseAnd },
                { "&=", ScriptTokenType.BitwiseAndAssign },
                { "|", ScriptTokenType.BitwiseOr },
                { "|=", ScriptTokenType.BitwiseOrAssign },
                { "^", ScriptTokenType.BitwiseXor },
                { "^=", ScriptTokenType.BitwiseXorAssign },
                { "<<", ScriptTokenType.BitwiseShiftLeft },
                { "<<=", ScriptTokenType.BitwiseShiftLeftAssign },
                { ">>", ScriptTokenType.BitwiseShiftRight },
                { ">>=", ScriptTokenType.BitwiseShiftRightAssign },

                { "##", ScriptTokenType.Hash },

                { "#define", ScriptTokenType.PreprocessDefine },
                { "#ifdef", ScriptTokenType.PreprocessIfDef },
                { "#endif", ScriptTokenType.PreprocessEndIf },
            };

            _keywords = new Dictionary <string, ScriptTokenType>
            {
                { "null", ScriptTokenType.Null },
                { "true", ScriptTokenType.True },
                { "false", ScriptTokenType.False },

                { "return", ScriptTokenType.Return },
                { "if", ScriptTokenType.If },
                { "else", ScriptTokenType.Else },
                { "for", ScriptTokenType.For },
                { "while", ScriptTokenType.While },
                { "do", ScriptTokenType.Do },
                { "break", ScriptTokenType.Break },
                { "continue", ScriptTokenType.Continue },
                { "switch", ScriptTokenType.Switch },
                { "case", ScriptTokenType.Case },
                { "default", ScriptTokenType.Default },

                { "inherits", ScriptTokenType.Inherits },
                { "include", ScriptTokenType.Include },
                { "const", ScriptTokenType.Const },
                { "public", ScriptTokenType.Public },
                { "new", ScriptTokenType.New },
                { "instanceof", ScriptTokenType.InstanceOf },
                { "try", ScriptTokenType.Try },
                { "catch", ScriptTokenType.Catch },
                { "throw", ScriptTokenType.Throw },
            };
        }
コード例 #5
0
 internal CompilerException(ScriptToken token, string format, params object[] args)
     : base(string.Format("{0}({1}): {2}", token.FileName ?? "null", token.RangeString, string.Format(format, args)))
 {
 }