Example #1
0
        public void Visit(FunctionCallStmt funcCallStmt, object[] args)
        {
            //检查存在性!
            funcCallStmt.Name     = reader.Name;
            funcCallStmt.ParamMap = new Dictionary <string, FireEngine.FireMLEngine.Expr.Expression>();

            int attCount = reader.AttributeCount;

            for (int i = 0; i < attCount; i++)
            {
                reader.MoveToAttribute(i);
                if (reader.Name == "return")
                {
                    funcCallStmt.ReturnDest = exprParser.ParseLeftValueExpr(reader.Value,
                                                                            new Location(file, reader.LineNumber, reader.LinePosition).Offset(reader.Name.Length + 2)); //TODO: Location
                }
                else if (reader.Name == "par")
                {
                    //FINISH: 解析参数字串!
                    string[] paraStrList = ParaStrProcessor.ReadParaCallList(reader.Value);
                    if (paraStrList == null)
                    {
                        kernel.IssueError(ErrorType.ParaStrCallFormatError, getCurrentLoc(), reader.Value);
                    }
                    else
                    {
                        funcCallStmt.ParaStr = paraStrList;
                    }
                }
                else
                {
                    //先把实参按字符串暂存,之后扫描AST树时再按指定类型解析
                    funcCallStmt.ParamMap.Add(reader.Name,
                                              exprParser.CreateStringConst(reader.Value,
                                                                           new Location(file, reader.LineNumber, reader.LinePosition).Offset(reader.Name.Length + 2) //TODO: Location
                                                                           ));
                }
            }
        }
Example #2
0
        public void Visit(FunctionDef functionDef, object[] args)
        {
            Location location = new Location(file, reader.LineNumber, reader.LinePosition);

            functionDef.ParaMap        = new Dictionary <string, ParameterDef>();
            functionDef.FuncDefContent = new List <Statement>();
            //funcParaStrMap.Add(functionDef.Name, new List<string>());
            functionDef.ParaStrMap = new Dictionary <int, string[]>();

            while (reader.Read())
            {
                reader.MoveToContent();
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    switch (dic[reader.Name])
                    {
                    case "para":
                        reader.MoveToAttribute("name");
                        string parName = reader.Value;
                        parName = parName.Substring(1, parName.Length - 1);         //去掉$符
                        if (functionDef.ParaMap.ContainsKey(parName))
                        {
                            kernel.IssueError(ErrorType.DuplicatedParameter,
                                              new Location(file, reader.LineNumber, reader.LinePosition),
                                              parName,
                                              functionDef.Name
                                              );
                            continue;
                        }

                        ParameterDef parDef = new ParameterDef();
                        parDef.Location = location;
                        parDef.Parent   = functionDef;
                        functionDef.ParaMap.Add(parName, parDef);

                        parDef.Accept(this);

                        break;

                    case "parastr":
                        //funcParaStrMap[functionDef.Name].Add(reader.ReadString());
                        string   paraStrDef = reader.ReadString();
                        string[] paraStr    = ParaStrProcessor.ReadDefVarList(paraStrDef);
                        if (paraStr == null)
                        {
                            kernel.IssueError(ErrorType.ParaStrDefFormatError, getCurrentLoc(), paraStrDef);
                        }
                        else if (functionDef.ParaStrMap.ContainsKey(paraStr.Length))
                        {
                            kernel.IssueError(ErrorType.SameNumberInParaStr, getCurrentLoc());
                        }
                        else
                        {
                            foreach (string varName in paraStr)
                            {
                                if (!functionDef.ParaMap.ContainsKey(varName))
                                {
                                    kernel.IssueError(ErrorType.ParameterNotDefined, getCurrentLoc(), varName);
                                }
                            }
                            functionDef.ParaStrMap.Add(paraStr.Length, paraStr);
                        }
                        break;

                    case "funcdef":
                        if (reader.IsEmptyElement)
                        {
                            break;
                        }

                        visitMainContent(functionDef, functionDef.FuncDefContent);
                        break;

                    default:
                        break;
                    }
                    break;

                case XmlNodeType.EndElement:
                    reader.Read();
                    return;
                }
            }
        }