idTech4.UI.idGuiScript.Parse C# (CSharp) Method

Parse() public method

public Parse ( idScriptParser parser ) : bool
parser idTech4.Text.idScriptParser
return bool
		public bool Parse(idScriptParser parser)
		{
			// first token should be function call
			// then a potentially variable set of parms
			// ended with a ;
			idToken token;
			GuiCommand cmd = new GuiCommand();

			if((token = parser.ReadToken()) == null)
			{
				parser.Error("Unexpected end of file");
				return false;
			}

			_handler = null;

			string tokenLower = token.ToString().ToLower();

			foreach(GuiCommand tmp in CommandList)
			{
				if(tmp.Name.ToLower() == tokenLower)
				{
					_handler = tmp.Handler;
					cmd = tmp;
					break;
				}
			}

			if(_handler == null)
			{
				parser.Error("Unknown script call {0}", token.ToString());
			}

			// now read parms til ;
			// all parms are read as idWinStr's but will be fixed up later 
			// to be proper types
			while(true)
			{
				if((token = parser.ReadToken()) == null)
				{
					parser.Error("Unexpected end of file");
					return false;
				}

				tokenLower = token.ToString().ToLower();

				if(tokenLower == ";")
				{
					break;
				}
				else if(tokenLower == "}")
				{
					parser.UnreadToken(token);
					break;
				}

				idWinString str = new idWinString(string.Empty);
				str.Set(token.ToString());

				_parameters.Add(new idWinGuiScript(true, str));
			}

			// 
			//  verify min/max params
			if((_handler != null) && ((_parameters.Count < cmd.MinParameterCount) || (_parameters.Count > cmd.MaxParameterCount)))
			{
				parser.Error("incorrect number of parameters for script {0}", cmd.Name);
			}
			// 

			return true;
		}
		#endregion

Usage Example

示例#1
0
		private bool ParseScript(idScriptParser parser, idGuiScriptList list, bool elseBlock = false)
		{
			bool ifElseBlock = false;

			idToken token;

			// scripts start with { ( unless parm is true ) and have ; separated command lists.. commands are command,
			// arg.. basically we want everything between the { } as it will be interpreted at
			// run time
			if(elseBlock == true)
			{
				token = parser.ReadToken();

				if(token.ToString().ToLower() == "if")
				{
					ifElseBlock = true;
				}

				parser.UnreadToken(token);

				if((ifElseBlock == false) && (parser.ExpectTokenString("{") == false))
				{
					return false;
				}
			}
			else if(parser.ExpectTokenString("{") == false)
			{
				return false;
			}

			int nest = 0;
			string tokenLower;

			while(true)
			{
				if((token = parser.ReadToken()) == null)
				{
					parser.Error("Unexpected end of file");
					return false;
				}

				tokenLower = token.ToString().ToLower();

				if(tokenLower == "{")
				{
					nest++;
				}
				else if(tokenLower == "}")
				{
					if(nest-- <= 0)
					{
						return true;
					}
				}

				idGuiScript script = new idGuiScript();

				if(tokenLower == "if")
				{
					script.ConditionRegister = ParseExpression(parser);

					ParseScript(parser, script.IfList);

					if((token = parser.ReadToken()) != null)
					{
						if(token.ToString() == "else")
						{
							// pass true to indicate we are parsing an else condition
							ParseScript(parser, script.ElseList, true);
						}
						else
						{
							parser.UnreadToken(token);
						}
					}

					list.Append(script);

					// if we are parsing an else if then return out so 
					// the initial "if" parser can handle the rest of the tokens
					if(ifElseBlock == true)
					{
						return true;
					}

					continue;
				}
				else
				{
					parser.UnreadToken(token);
				}

				// empty { } is not allowed
				if(token.ToString() == "{")
				{
					parser.Error("Unexpected {");
					return false;
				}

				script.Parse(parser);
				list.Append(script);
			}
		}