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