LogLine CreateLine(string[] columns) { LogLine line = null; var type = columns[0].Sanitize(); switch (type) { case SMTPDaemonLine.LINE_TYPE: line = new SMTPDaemonLine(); break; case SMTPClientLine.LINE_TYPE: line = new SMTPClientLine(); break; case TCPIPLine.LINE_TYPE: line = new TCPIPLine(); break; case ApplicationLine.LINE_TYPE: line = new ApplicationLine(); break; case POP3DaemonLine.LINE_TYPE: line = new POP3DaemonLine(); break; default: line = new UnknownLine(); break; } line.Parse(columns); return(line); }
//外から見えるのはここだけ /// <summary> /// 一行分のTokenCollectionからLogicalLineを作成する /// </summary> /// <param defaultName="parser"></param> /// <returns></returns> internal static LogicalLine GetCodeToken(TokenCollection stream) { if (stream == null) { return(null); } if (stream.Count == 0) { return(null); } if (stream.NextIsEndOfStream) { return(null); } LogicalLine line = null; try { if (stream.NextToken is IfStatementPrimitive) //if, else行 { return((LogicalLine)readIf(stream)); } if (stream.NextToken is McallFunctionPrimitive) //on行 { return((LogicalLine)readMcall(stream)); } if (stream.NextToken is OnEventFunctionPrimitive) { //on###行 if (stream.NextNextTokenIsGotoFunction) //goto/gosubがないなら { return((LogicalLine)readOnEvent(stream)); } else { return((LogicalLine)readCommand(stream)); } } if (stream.NextToken is OnFunctionPrimitive) //on行 { return((LogicalLine)readOn(stream)); } if (stream.NextToken is FunctionPrimitive) //その他の関数 { return((LogicalLine)readCommand(stream)); } if (stream.NextToken is VariablePrimitive) //代入行 { return((LogicalLine)readAssignment(stream)); } } //ここでHspLogicalLineExceptionをcatchする。他のところでは行ってはならない catch (HspLogicalLineException e) { line = new UnknownLine(stream.Primitives); line.AddError(e.Message); return(line); } line = new UnknownLine(stream.Primitives); line.AddError("?行:先頭の単語が解釈できない"); return(line); }