Пример #1
0
		private void DeclareAndPopulateGlobalSourceUnit(CompilationUnit unit)
		{
			SourceUnit globalUnit = new SourceUnit(unit, "<global>");
	
			TypeDefinitionStatement globalType = new TypeDefinitionStatement( AccessLevel.Public, "RookGlobal" );
	
			globalUnit.Statements.Add( globalType );
	
			MethodDefinitionStatement entryPoint = new MethodDefinitionStatement( AccessLevel.Public );
			entryPoint.Name = "self.main";
	
			foreach(SourceUnit sunit in unit.SourceUnits)
			{
				foreach(IStatement stmt in sunit.Statements)
				{
					if (stmt.StatementType == StatementType.TypeDefinition) continue;

					stmt.Parent.RemoveChild( stmt );

					if (stmt.StatementType == StatementType.MethodDef)
					{
						(stmt as MethodDefinitionStatement).IsStatic = true;
					}
					if (stmt.StatementType == StatementType.MultipleVarDeclaration)
					{
						// TODO: Ensure no instance vars defined
					}

					if (stmt.StatementType == StatementType.ExpressionStmt || 
						stmt.StatementType == StatementType.MultipleVarDeclaration )
					{
						entryPoint.Statements.Add( stmt );
					}
					else
					{
						globalType.Statements.Add( stmt );
					}
				}
			}
	
			if (entryPoint.Statements.Count != 0)
			{
				globalType.Statements.Add( entryPoint );

				// Might be necessary
				// unit.EntryPointMethod = entryPoint;
			}
	
			unit.SourceUnits.Add(globalUnit);
		}
Пример #2
0
		public void AddMethod(MethodDefinitionStatement methodDef)
		{
			if (methodDef == null) throw new ArgumentNullException("methodDef");

			String name = methodDef.Name;

			IList list = null;

			if (!methodMap.Contains(name))
			{
				list = new ArrayList();
				methodMap[name] = list;
			}
			else
			{
				list = (IList) methodMap[name];
			}

			list.Add(methodDef);
		}
Пример #3
0
        public void AddMethod(MethodDefinitionStatement methodDef)
        {
            if (methodDef == null)
            {
                throw new ArgumentNullException("methodDef");
            }

            String name = methodDef.Name;

            IList list = null;

            if (!methodMap.Contains(name))
            {
                list            = new ArrayList();
                methodMap[name] = list;
            }
            else
            {
                list = (IList)methodMap[name];
            }

            list.Add(methodDef);
        }
Пример #4
0
		public override bool VisitMethodDefinitionStatement(MethodDefinitionStatement methodDef)
		{
			methodDef.DefiningSymbolTable.Parent.AddMethod( methodDef );

			return base.VisitMethodDefinitionStatement(methodDef);
		}
Пример #5
0
		public override bool VisitEnter(MethodDefinitionStatement methodDef)
		{
			return false;
		}
Пример #6
0
		public virtual bool VisitLeave(MethodDefinitionStatement methodDef)
		{
			return true;
		}
Пример #7
0
		public virtual bool VisitMethodDefinitionStatement(MethodDefinitionStatement methodDef)
		{
			if (VisitEnter(methodDef))
			{
				VisitNodes(methodDef.Arguments);
				VisitNodes(methodDef.Statements);

				return VisitLeave(methodDef);
			}

			return false;
		}
Пример #8
0
		public override bool VisitMethodDefinitionStatement(MethodDefinitionStatement methodDef)
		{
			if (!identifierService.IsValidMethodName(methodDef.Name))
			{
				errorReport.Error( "TODOFILENAME", methodDef.Position, "'{0}' is an invalid method name.", methodDef.Name );

				return false;
			}

			TransientType owner = methodDef.SymbolTable.CurrentTypeDefinition;

			System.Diagnostics.Debug.Assert( owner != null );

			try
			{
				owner.AddMethod(methodDef);
			}
			catch(Exception ex)
			{
				errorReport.Error( "TODOFILENAME", methodDef.Position, ex.Message, methodDef.Name );

				return false;
			}

			return base.VisitMethodDefinitionStatement(methodDef);
		}
Пример #9
0
		public override bool VisitLeave(MethodDefinitionStatement methodDef)
		{
			nowQueue = false;
			return base.VisitLeave(methodDef);
		}
Пример #10
0
		public override bool VisitEnter(MethodDefinitionStatement methodDef)
		{
			nowQueue = true;
			return base.VisitEnter(methodDef);
		}
Пример #11
0
	protected void modifier(
		MethodDefinitionStatement mdstmt
	) //throws RecognitionException, TokenStreamException
{
		
		
		switch ( LA(1) )
		{
		case LITERAL_override:
		{
			match(LITERAL_override);
			if (0==inputState.guessing)
			{
				mdstmt.IsOverride = true;
			}
			break;
		}
		case LITERAL_new:
		{
			match(LITERAL_new);
			if (0==inputState.guessing)
			{
				mdstmt.IsNewSlot  = true;
			}
			break;
		}
		case LITERAL_abstract:
		{
			match(LITERAL_abstract);
			if (0==inputState.guessing)
			{
				mdstmt.IsAbstract = true;
			}
			break;
		}
		case LITERAL_final:
		{
			match(LITERAL_final);
			if (0==inputState.guessing)
			{
				mdstmt.IsFinal    = true;
			}
			break;
		}
		default:
			if (((LA(1)==IDENT) && (tokenSet_11_.member(LA(2))))&&( withinOverride ))
			{
				if (0==inputState.guessing)
				{
					mdstmt.IsOverride = true;
				}
			}
			else if (((LA(1)==IDENT) && (tokenSet_11_.member(LA(2))))&&( withinNew )) {
				if (0==inputState.guessing)
				{
					mdstmt.IsNewSlot  = true;
				}
			}
			else if (((LA(1)==IDENT) && (tokenSet_11_.member(LA(2))))&&( withinAbstract )) {
				if (0==inputState.guessing)
				{
					mdstmt.IsAbstract = true;
				}
			}
			else if (((LA(1)==IDENT) && (tokenSet_11_.member(LA(2))))&&( withinFinal )) {
				if (0==inputState.guessing)
				{
					mdstmt.IsFinal    = true;
				}
			}
			else if (((LA(1)==IDENT) && (tokenSet_11_.member(LA(2))))&&( withinStatic )) {
				if (0==inputState.guessing)
				{
					mdstmt.IsStatic   = true;
				}
			}
			else if ((LA(1)==IDENT) && (tokenSet_11_.member(LA(2)))) {
			}
		else
		{
			throw new NoViableAltException(LT(1), getFilename());
		}
		break; }
	}
Пример #12
0
	public MethodDefinitionStatement  method_def_statement() //throws RecognitionException, TokenStreamException
{
		MethodDefinitionStatement mdstmt;
		
		
			  mdstmt = new MethodDefinitionStatement( currentAccessLevel ); 
			  String qn = null; TypeReference retType = null; 
			
		
		match(DEF);
		modifier(mdstmt);
		qn=qualified_name();
		if (0==inputState.guessing)
		{
			
				    if (qn.StartsWith("self."))
				    {
				      mdstmt.IsStatic = true;
				      mdstmt.Name = qn.Substring( "self.".Length );
				    }
				    else
				    {
					  mdstmt.Name = qn;
				    }
					PushScope(mdstmt, ScopeType.Method); 
				
		}
		{
			switch ( LA(1) )
			{
			case LPAREN:
			{
				match(LPAREN);
				{
					switch ( LA(1) )
					{
					case IDENT:
					case STATICIDENT:
					case INSTIDENT:
					case STAR:
					case BAND:
					{
						methodParams(mdstmt);
						break;
					}
					case RPAREN:
					{
						break;
					}
					default:
					{
						throw new NoViableAltException(LT(1), getFilename());
					}
					 }
				}
				match(RPAREN);
				{
					switch ( LA(1) )
					{
					case COLON:
					{
						retType=type();
						break;
					}
					case EOF:
					case STATEMENT_END:
					case SEMI:
					{
						break;
					}
					default:
					{
						throw new NoViableAltException(LT(1), getFilename());
					}
					 }
				}
				break;
			}
			case EOF:
			case STATEMENT_END:
			case SEMI:
			{
				break;
			}
			default:
			{
				throw new NoViableAltException(LT(1), getFilename());
			}
			 }
		}
		statement_term();
		if (0==inputState.guessing)
		{
			mdstmt.ReturnType = retType;
		}
		suite(mdstmt.Statements);
		match(END);
		if (0==inputState.guessing)
		{
			PopScope();
		}
		return mdstmt;
	}
Пример #13
0
	public void methodParams(
		MethodDefinitionStatement mdstmt
	) //throws RecognitionException, TokenStreamException
{
		
		ParameterVarIdentifier param = null;
		
		param=methodParam();
		if (0==inputState.guessing)
		{
			mdstmt.AddFormalParameter( param );
		}
		{    // ( ... )*
			for (;;)
			{
				if ((LA(1)==COMMA))
				{
					match(COMMA);
					param=methodParam();
					if (0==inputState.guessing)
					{
						mdstmt.AddFormalParameter( param );
					}
				}
				else
				{
					goto _loop63_breakloop;
				}
				
			}
_loop63_breakloop:			;
		}    // ( ... )*
	}
Пример #14
0
		public override bool VisitMethodDefinitionStatement(MethodDefinitionStatement methodDef)
		{
			nodeStack.Push( CurrentNode.Nodes.Add("Method " + methodDef.Name + "[ret " + methodDef.ReturnType + "]" ));
			CurrentNode.Tag = methodDef;

			CurrentNode.EnsureVisible();

			base.VisitMethodDefinitionStatement(methodDef);

			nodeStack.Pop();

			return true;
		}