Beispiel #1
0
        public void Parse(ref string[] program)
        {
            string ruleName = ParseUtils.GetToken(ref program);
            _RulePrototype = WooScript.GetRulePrototype(ruleName);
            WooScript._Log.AddMsg("Call Rule : " + ruleName);

            string openbracket = ParseUtils.PeekToken(program);
            if (openbracket.Equals("(", StringComparison.Ordinal) || _RulePrototype._Args.Count()>0)
            {
                openbracket = ParseUtils.GetToken(ref program);
                if (!openbracket.Equals("(", StringComparison.Ordinal))
                    throw new ParseException("rule called without required arguments, or syntax error. Found " + openbracket + ", expeceted \"(\" instead.");
                
                for (int i=0; i<_RulePrototype._Args.Count(); i++)
                {
                    _ArgValue.Add(ExpressionBuilder.Parse(ref program));
                    if (i+1<_RulePrototype._Args.Count())
                    {
                        string comma = ParseUtils.GetToken(ref program);
                        if (!comma.Equals(",", StringComparison.Ordinal))
                            throw new ParseException("Found "+comma+" but expected another argument after a \",\"");
                    }
                }

                string closebracket = ParseUtils.GetToken(ref program);
                if (!closebracket.Equals(")", StringComparison.Ordinal))
                    throw new ParseException("rules not currently supported with arguments, missing ), found " + closebracket + " instead.");
            }
        }
Beispiel #2
0
        public void Parse(ref string[] program)
        {
            string ruleName = ParseUtils.GetToken(ref program);

            _RulePrototype = WooScript.GetRulePrototype(ruleName);
            WooScript._Log.AddMsg("Call Rule : " + ruleName);

            string openbracket = ParseUtils.PeekToken(program);

            if (openbracket.Equals("(", StringComparison.Ordinal) || _RulePrototype._Args.Count() > 0)
            {
                openbracket = ParseUtils.GetToken(ref program);
                if (!openbracket.Equals("(", StringComparison.Ordinal))
                {
                    throw new ParseException("rule called without required arguments, or syntax error. Found " + openbracket + ", expeceted \"(\" instead.");
                }

                for (int i = 0; i < _RulePrototype._Args.Count(); i++)
                {
                    _ArgValue.Add(ExpressionBuilder.Parse(ref program));
                    if (i + 1 < _RulePrototype._Args.Count())
                    {
                        string comma = ParseUtils.GetToken(ref program);
                        if (!comma.Equals(",", StringComparison.Ordinal))
                        {
                            throw new ParseException("Found " + comma + " but expected another argument after a \",\"");
                        }
                    }
                }

                string closebracket = ParseUtils.GetToken(ref program);
                if (!closebracket.Equals(")", StringComparison.Ordinal))
                {
                    throw new ParseException("rules not currently supported with arguments, missing ), found " + closebracket + " instead.");
                }
            }
        }
Beispiel #3
0
        public void ParseProgram(ref string[] program)
        {
            string token;

            // pre parse
            string[] preprogram = program.Clone() as string[];
            do
            {
                token = ParseUtils.GetToken(ref preprogram);

                if (string.Compare(token, "rule", true) == 0)
                {
                    string rulename = ParseUtils.GetToken(ref preprogram);
                    _Log.AddMsg("Preparser found rule " + rulename);
                    RulePrototype ruleproto = new RulePrototype(rulename);

                    string itoken = ParseUtils.PeekToken(preprogram);
                    if (itoken.Equals("(", StringComparison.Ordinal))
                    {
                        itoken = ParseUtils.GetToken(ref preprogram);
                        do
                        {
                            itoken = ParseUtils.GetToken(ref preprogram); // type
                            Argument arg = new Argument();
                            if (itoken.Equals("float", StringComparison.Ordinal))
                            {
                                arg._Type = VarType.varFloat;
                            }
                            else if (itoken.Equals("vec", StringComparison.Ordinal))
                            {
                                arg._Type = VarType.varVector;
                            }
                            else
                            {
                                throw new ParseException("Expected type of parameter (float OR vec), not" + itoken);
                            }
                            arg._Name = ParseUtils.GetToken(ref preprogram); // name

                            ruleproto._Args.Add(arg);

                            itoken = ParseUtils.GetToken(ref preprogram); // , or )
                        }
                        while (itoken.Equals(",", StringComparison.Ordinal));
                    }
                    _RulePrototypes.Add(ruleproto);
                    ConsumeRule(ref preprogram);
                }
                else if (string.Compare(token, "shader", true) == 0)
                {
                    string shadername = ParseUtils.GetToken(ref preprogram);
                    _Log.AddMsg("Preparser found shader " + shadername);
                    _ShaderNames.Add(shadername);
                    ConsumeRule(ref preprogram);
                }
                else
                {
                    if (token.Length > 0)
                        throw new ParseException("Global statements must start with \"rule\".");
                }
            }
            while (token.Length > 0);

            // full parse
            do
            {
                token = ParseUtils.GetToken(ref program);

                if (string.Compare(token, "rule", true) == 0)
                {
                    string rulename = ParseUtils.GetToken(ref program);
                    _Log.AddMsg("Found rule " + rulename);
                    Rule newRule = new Rule(rulename);
                    _Log.Indent();
                    newRule.Parse(ref program);
                    _Log.UnIndent();
                    _Rules.Add(newRule);
                }
                else if (string.Compare(token, "shader", true) == 0)
                {
                    string shadername = ParseUtils.GetToken(ref program);
                    _Log.AddMsg("Found shader " + shadername);
                    Shader newShader = new Shader(shadername);
                    _Log.Indent();
                    newShader.Parse(ref program);
                    _Log.UnIndent();
                    _Shaders.Add(newShader);
                }
                else
                {
                    if (token.Length>0)
                        throw new ParseException("Global statements must start with \"rule\".");
                }
            }
            while (token.Length > 0);

            // rule rulename { statement* }
            // statement = floatvar aop floatrhs | vecvar aop vecexpr | nfun ( args )
            // args = (rulename|floatexpr|vecexpr)*
            // floatexpr = ( floatexpr ) | num op floatexpr | ffun(args) op floatexpr | num | ffun(args) | floatvar
            // num = 0.x | vec.sel
            // vecexpr = Vec(floatexpr, floatexpr, floatexpr) | vec op vecexpr | vfun ( args )
            // vec = vec(x,y,z) | vec(x,y,z).rep
        }
Beispiel #4
0
        public void ParseProgram(ref string[] program)
        {
            string token;

            // pre parse
            string[] preprogram = program.Clone() as string[];
            do
            {
                token = ParseUtils.GetToken(ref preprogram);

                if (string.Compare(token, "rule", true) == 0)
                {
                    string rulename = ParseUtils.GetToken(ref preprogram);
                    _Log.AddMsg("Preparser found rule " + rulename);
                    RulePrototype ruleproto = new RulePrototype(rulename);

                    string itoken = ParseUtils.PeekToken(preprogram);
                    if (itoken.Equals("(", StringComparison.Ordinal))
                    {
                        itoken = ParseUtils.GetToken(ref preprogram);
                        do
                        {
                            itoken = ParseUtils.GetToken(ref preprogram); // type
                            Argument arg = new Argument();
                            if (itoken.Equals("float", StringComparison.Ordinal))
                            {
                                arg._Type = VarType.varFloat;
                            }
                            else if (itoken.Equals("vec", StringComparison.Ordinal))
                            {
                                arg._Type = VarType.varVector;
                            }
                            else
                            {
                                throw new ParseException("Expected type of parameter (float OR vec), not" + itoken);
                            }
                            arg._Name = ParseUtils.GetToken(ref preprogram); // name

                            ruleproto._Args.Add(arg);

                            itoken = ParseUtils.GetToken(ref preprogram); // , or )
                        }while (itoken.Equals(",", StringComparison.Ordinal));
                    }
                    _RulePrototypes.Add(ruleproto);
                    ConsumeRule(ref preprogram);
                }
                else if (string.Compare(token, "shader", true) == 0)
                {
                    string shadername = ParseUtils.GetToken(ref preprogram);
                    _Log.AddMsg("Preparser found shader " + shadername);
                    _ShaderNames.Add(shadername);
                    ConsumeRule(ref preprogram);
                }
                else
                {
                    if (token.Length > 0)
                    {
                        throw new ParseException("Global statements must start with \"rule\".");
                    }
                }
            }while (token.Length > 0);

            // full parse
            do
            {
                token = ParseUtils.GetToken(ref program);

                if (string.Compare(token, "rule", true) == 0)
                {
                    string rulename = ParseUtils.GetToken(ref program);
                    _Log.AddMsg("Found rule " + rulename);
                    Rule newRule = new Rule(rulename);
                    _Log.Indent();
                    newRule.Parse(ref program);
                    _Log.UnIndent();
                    _Rules.Add(newRule);
                }
                else if (string.Compare(token, "shader", true) == 0)
                {
                    string shadername = ParseUtils.GetToken(ref program);
                    _Log.AddMsg("Found shader " + shadername);
                    Shader newShader = new Shader(shadername);
                    _Log.Indent();
                    newShader.Parse(ref program);
                    _Log.UnIndent();
                    _Shaders.Add(newShader);
                }
                else
                {
                    if (token.Length > 0)
                    {
                        throw new ParseException("Global statements must start with \"rule\".");
                    }
                }
            }while (token.Length > 0);

            // rule rulename { statement* }
            // statement = floatvar aop floatrhs | vecvar aop vecexpr | nfun ( args )
            // args = (rulename|floatexpr|vecexpr)*
            // floatexpr = ( floatexpr ) | num op floatexpr | ffun(args) op floatexpr | num | ffun(args) | floatvar
            // num = 0.x | vec.sel
            // vecexpr = Vec(floatexpr, floatexpr, floatexpr) | vec op vecexpr | vfun ( args )
            // vec = vec(x,y,z) | vec(x,y,z).rep
        }