Exemplo n.º 1
0
        private bool processCode()
        {
            currentObject = null;
            while (oWordEngine.NextLine())
            {
                while (oWordEngine.NextWord != null)
                {
                    #region Main Processor
                    switch (oWordEngine.Current.ToLower())
                    {
                    case "class":
                        if (validateName(oWordEngine.NextNonWhitespace))
                        {
                            currentObject = new ClassObject(oWordEngine.Current);
                        }
                        else
                        {
                            errors.Add(oWordEngine.FormatedPosition + "The name " + oWordEngine.Current + " is not a valid name for a class.\r\n" + oWordEngine.GetLineWithPositionMarker);
                            return(false);
                        }
                        break;

                    default:
                        if (currentObject == null)
                        {
                            errors.Add(oWordEngine.FormatedPosition + "Expecting class definition, found " + oWordEngine.Current + "." + oWordEngine.GetLineWithPositionMarker);
                            return(false);
                        }
                        if (!currentObject.Parse(oWordEngine))
                        {
                            if (currentObject.HasParseError || !currentObject.IsParseComplete)
                            {
                                if (currentObject.HasParseError)
                                {
                                    errors.Add(oWordEngine.FormatedPosition + currentObject.ParseError + "\r\n" + oWordEngine.GetLineWithPositionMarker);
                                }
                                else
                                {
                                    errors.Add(oWordEngine.FormatedPosition + "Compiler error! ClassObject parser returned false, but is not complete." + oWordEngine.GetLineWithPositionMarker);
                                }
                                return(false);
                            }
                            else
                            {
                                KOSObjects.Add(currentObject);
                            }
                        }
                        break;
                    }
                    #endregion
                }
            }
            if (oWordEngine.HasError)
            {
                errors.Add(oWordEngine.FormatedPosition + oWordEngine.Error + "\r\n" + oWordEngine.GetLineWithPositionMarker);
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        public bool     Parse(WordEngine oWordEngine)
        {
            switch (parseState)
            {
            case eParseShate.Start:
                if (!oWordEngine.RegisterBlockTest(this))
                {
                    parseState = eParseShate.Error;
                    return(false);
                }
                parseState = eParseShate.MainLoop;
                break;

            case eParseShate.MainLoop:
                switch (oWordEngine.CurrentNonWhitespace)
                {
                case "private":
                    currentIsPublic = false;
                    parseState      = eParseShate.FuncVar;
                    break;

                case "public":
                    currentIsPublic = true;
                    parseState      = eParseShate.FuncVar;
                    break;

                case "property":
                    currentIsPublic = true;
                    parseState      = eParseShate.Property;
                    break;

                case WordEngine.BlockEndChar:
                    parseState = eParseShate.Done;
                    return(false);

                default:
                    if (oWordEngine.HasError)
                    {
                        parseError = oWordEngine.Error;
                    }
                    else
                    {
                        parseError = "Expecting private public or property, found " + oWordEngine.Current;
                    }
                    parseState = eParseShate.Error;
                    return(false);
                }
                break;

            case eParseShate.SendWordsEngineToObject:
                if (currentObject == null)
                {
                    parseError = "Compiler error! trying to send the word " + oWordEngine.Current + " to an null KOSObject.";
                    return(false);
                }
                if (!currentObject.Parse(oWordEngine))
                {
                    if (currentObject.HasParseError || !currentObject.IsParseComplete)
                    {
                        if (currentObject.HasParseError)
                        {
                            parseError = currentObject.ParseError;
                        }
                        else
                        {
                            parseError = "Compiler error! Parser " + currentObject.Name + " returned false, but is not complete and has no errors.";
                        }
                        return(false);
                    }
                    else
                    {
                        parseState = addObject(currentObject);
                    }
                }
                break;

            case eParseShate.Property:
                if (validateName(oWordEngine.NextNonWhitespace))
                {
                    currentObject = new PropertyObject(oWordEngine.Current, currentIsPublic);
                    parseState    = eParseShate.SendWordsEngineToObject;
                }
                else
                {
                    parseError = "The name " + oWordEngine.Current + " is not a valid name for a property.";
                    parseState = eParseShate.Error;
                    return(false);
                }
                break;

            case eParseShate.FuncVar:
                string funcVarName = oWordEngine.CurrentNonWhitespace;
                if (oWordEngine.NextNonWhitespace.Equals("("))     //function
                {
                    if (validateName(funcVarName))
                    {
                        currentObject   = new FunctionObject(funcVarName, currentIsPublic);
                        parseState      = eParseShate.GetFuncPrams;
                        canGetParameter = true;
                    }
                    else
                    {
                        parseError = "The name " + oWordEngine.Current + " is not a valid name for a function.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                }
                else if (oWordEngine.Current.Equals("=") || oWordEngine.Current.Equals("."))
                {
                    if (validateName(oWordEngine.Current))
                    {
                        currentObject = new VariableObject(funcVarName, currentIsPublic);
                        if (oWordEngine.Current.Equals("="))
                        {
                            parseState = eParseShate.SendWordsEngineToObject;
                        }
                        else
                        {
                            parseState = addObject(currentObject);
                        }
                    }
                    else
                    {
                        parseError = "The name " + funcVarName + " is not a valid name for a variable.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                }
                else
                {
                    parseState = eParseShate.Error;
                    parseError = "Expecting ( = or ., found " + oWordEngine.Current;
                    return(false);
                }
                break;

            case eParseShate.GetFuncPrams:
                if (oWordEngine.CurrentNonWhitespace.Equals(")"))
                {
                    parseState = eParseShate.SendWordsEngineToObject;
                }
                else if (oWordEngine.Current.Equals(","))
                {
                    if (canGetParameter)
                    {
                        parseError = "Expecting to find a paramter and found a , insted.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                    else
                    {
                        canGetParameter = true;
                    }
                }
                else if (canGetParameter)
                {
                    if (validateName(oWordEngine.Current))
                    {
                        FunctionObject func = currentObject as FunctionObject;
                        if (func != null)
                        {
                            if (!func.AddParameter(oWordEngine.Current))
                            {
                                parseError = "The function " + func.Name + " has two parameters withe the same name (" + oWordEngine.Current + ").";
                                parseState = eParseShate.Error;
                                return(false);
                            }
                            else
                            {
                                canGetParameter = false;
                            }
                        }
                        else
                        {
                            parseError = "Compiler error! Expecting a type of function object in currentObject(IKOSppObject).";
                            parseState = eParseShate.Error;
                            return(false);
                        }
                    }
                    else
                    {
                        parseError = "The name " + oWordEngine.Current + " is not a valid name for a function parameter.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                }
                else
                {
                    parseError = "Expecting to find a , or ) but found " + oWordEngine.Current + " insted";
                    parseState = eParseShate.Error;
                    return(false);
                }
                break;

            case eParseShate.Error:
                if (!HasParseError)
                {
                    parseError = "Compiler error! The parser " + name + " was put in Error state, but had no error.";
                }
                return(false);

            case eParseShate.Done:
                return(false);

            default:
                parseError = "Compiner error! Unhandled state in ClassObject: " + name + "" + parseState.ToString();
                parseState = eParseShate.Error;
                return(false);
            }
            return(true);
        }
Exemplo n.º 3
0
        public bool     Parse(WordEngine oWordEngine)
        {
            switch (parseState)
            {
            case eParseShate.Start:
                if (!oWordEngine.RegisterBlockTest(this))
                {
                    parseState = eParseShate.Error;
                    return(false);
                }
                parseState = eParseShate.MainLoop;
                break;

            case eParseShate.MainLoop:
                switch (oWordEngine.CurrentNonWhitespace)
                {
                case "get":
                    if (getFunction == null)
                    {
                        getFunction   = new FunctionObject("get", false, "_get" + name);
                        currentObject = getFunction;
                    }
                    else
                    {
                        parseError = "The can only be one get in a propety.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                    break;

                case "set":
                    if (setFunction == null)
                    {
                        setFunction = new FunctionObject("set", false, "_set" + name);
                        setFunction.AddParameter("value");
                        currentObject = setFunction;
                    }
                    else
                    {
                        parseError = "The can only be one set in a propety.";
                        parseState = eParseShate.Error;
                        return(false);
                    }
                    break;

                case WordEngine.BlockEndChar:
                    parseState = eParseShate.Done;
                    return(false);

                default:
                    if (oWordEngine.HasError)
                    {
                        parseError = oWordEngine.Error;
                    }
                    else
                    {
                        parseError = "Expecting get or set, found " + oWordEngine.Current;
                    }
                    parseState = eParseShate.Error;
                    return(false);
                }
                parseState = eParseShate.SendWordsEngineToObject;
                break;

            case eParseShate.SendWordsEngineToObject:
                if (currentObject == null)
                {
                    parseError = "Compiler error! trying to send the word " + oWordEngine.Current + " to an null KOSObject.";
                    return(false);
                }
                if (!currentObject.Parse(oWordEngine))
                {
                    if (currentObject.HasParseError || !currentObject.IsParseComplete)
                    {
                        if (currentObject.HasParseError)
                        {
                            parseError = currentObject.ParseError;
                        }
                        else
                        {
                            parseError = "Compiler error! Parser " + currentObject.Name + " returned false, but is not complete and has no errors.";
                        }
                        return(false);
                    }
                    else
                    {
                        parseState = eParseShate.MainLoop;
                    }
                }
                break;

            case eParseShate.Done:
                return(false);

            case eParseShate.Error:
                if (!HasParseError)
                {
                    parseError = "Compiler error! The parser " + name + " was put in Error state, but had no error.";
                }
                return(false);

            default:
                parseError = "Compiner error! Unhandled state in PropertyObject: " + name + "" + parseState.ToString();
                parseState = eParseShate.Error;
                return(false);
            }
            return(true);
        }