/// <summary> /// Take a token from the stream. /// </summary> public ScriptToken Take() { Peek(); var result = _read[0]; _read.RemoveAt(0); Previous = result; return(result); }
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)); }
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); }
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 }, }; }
internal CompilerException(ScriptToken token, string format, params object[] args) : base(string.Format("{0}({1}): {2}", token.FileName ?? "null", token.RangeString, string.Format(format, args))) { }