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 )); } } }
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; } } }