示例#1
0
        public override void VisitString(ASTString n)
        {
            //push string on stack, we need to trim off the two "s that our grammar adds
            string escaped = n.Value.Substring(1, n.Value.Length - 2);

            _gen.Emit(OpCodes.Ldstr, escaped);
            _lastWalkedType = typeof(string);
        }
示例#2
0
 private VisitResult VisitString(ASTString node)
 {
     return(new VisitResult
     {
         ControlType = ControlType.Return,
         Value = node.Value
     });
 }
示例#3
0
文件: ThirdPass.cs 项目: goric/cflat
 /// <summary>
 /// String literal
 /// </summary>
 /// <param name="n"></param>
 public override void VisitString(ASTString n)
 {
     n.CFlatType = _lastSeenType = new TypeString();
 }
示例#4
0
 public bool Visit(ASTString node)
 {
     throw new NotImplementedException();
 }
示例#5
0
        private static ASTNode ParseSingleStatement()
        {
            ASTNode ret = null;

            if (currentTokens[currentToken] is StringToken)
            {
                ret = new ASTString {
                    String = currentTokens[currentToken].Token
                };
                currentToken++;
            }
            else if (currentTokens[currentToken] is NumberToken)
            {
                double dResult;
                if (double.TryParse(currentTokens[currentToken].Token, NumberStyles.Any, CultureInfo.GetCultureInfo("en"), out dResult))
                {
                    ret = new ASTNumber {
                        Number = dResult
                    };
                }
                else
                {
                    throw new ParserException(string.Format("Number {0} is not valid.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber);
                }
                currentToken++;
            }
            else if (currentTokens[currentToken] is ReservedWordToken)
            {
                if (currentTokens[currentToken].Token == "this" || currentTokens[currentToken].Token == "VM")
                {
                    string scope = currentTokens[currentToken].Token;
                    currentToken++;
                    if (currentTokens[currentToken] is SpecialToken && currentTokens[currentToken].Token == ".")
                    {
                        currentToken++;
                        ret = ParseFunctionCallOrParameterAccess(scope);
                    }
                    else
                    {
                        throw new ParserException(string.Format("Expected '.' instead of '{0}'.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber);
                    }
                }
                else if (currentTokens[currentToken].Token == "object" ||
                         currentTokens[currentToken].Token == "string" ||
                         currentTokens[currentToken].Token == "number")
                {
                    VMType type = currentTokens[currentToken].Token == "number" ? VMType.Number : (currentTokens[currentToken].Token == "string" ? VMType.String : VMType.Object);
                    currentToken++;
                    if (currentTokens[currentToken] is IdentifierToken)
                    {
                        ret = new ASTLocalVariable()
                        {
                            Type = type,
                            Name = currentTokens[currentToken].Token
                        };
                    }
                    else
                    {
                        throw new ParserException("Expected Identifier.", currentTokens[currentToken].LineNumber);
                    }
                    currentToken++;
                }
                else if (currentTokens[currentToken].Token == "new")
                {
                    currentToken++;
                    ASTNode createClass = ParseFunctionCallOrParameterAccess("constructor");
                    if (createClass is ASTFunctionCall)
                    {
                        ASTFunctionCall fc = (ASTFunctionCall)createClass;
                        ret = new ASTCreateClass()
                        {
                            Scope        = fc.FunctionName,
                            FunctionName = fc.FunctionName,
                            Parameter    = fc.Parameter
                        };
                    }
                    else
                    {
                        throw new ParserException("Error with new.", currentTokens[currentToken].LineNumber);
                    }
                }
                else if (currentTokens[currentToken].Token == "return")
                {
                    currentToken++;
                    ret = new ASTReturn()
                    {
                        Return = ParseStatement()
                    };

                    // Point to ';' again!!!
                    --currentToken;
                }
                else
                {
                    throw new ParserException(string.Format("Reserved Word {0} is not legal in Statement.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber);
                }
            }
            else if (currentTokens[currentToken] is IdentifierToken)
            {
                string identifierOrScope = currentTokens[currentToken].Token;
                currentToken++;
                if (currentTokens[currentToken] is SpecialToken)
                {
                    if (currentTokens[currentToken].Token == ".")
                    {
                        currentToken++;
                        TokenBase isFunction = currentTokens[currentToken + 1];
                        ret = ParseFunctionCallOrParameterAccess(identifierOrScope);
                    }
                    else if (currentTokens[currentToken].Token == "(")
                    {
                        // Set focus again to the function name
                        --currentToken;
                        ret = ParseFunctionCallOrParameterAccess("this");
                    }
                    else if (currentTokens[currentToken].Token == "[")
                    {
                        currentToken++;
                        ASTStatement statement = ParseStatement();
                        if (statement == null)
                        {
                            throw new ParserException("Expected Statement for Parameter Access.", currentTokens[currentToken].LineNumber);
                        }
                        ret = new ASTClassParameter()
                        {
                            Scope     = identifierOrScope,
                            Parameter = statement
                        };
                    }
                    else
                    {
                        ret = new ASTIdentifier()
                        {
                            Identifier = identifierOrScope
                        };
                    }
                }
                else
                {
                    ret = new ASTIdentifier()
                    {
                        Identifier = identifierOrScope
                    };
                }
            }

            if (ret == null)
            {
                throw new ParserException(String.Format("Problems parsing the Identifier/Function Call/String/Number {0}.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber);
            }
            return(ret);
        }