Пример #1
0
        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);
        }
Пример #2
0
        //外から見えるのはここだけ
        /// <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);
        }