public Object doSemantic(Rule rule, List inputTokens, List ranges)	{
		this.ranges = ranges;
		
		String nonterminal = rule.getNonterminal();
		
		Class [] types = new Class [inputTokens.size()];
		for (int i = 0; i < types.length; i++)
			types[i] = Object.class;
		
		Method m = null;
		try	{
			m = getClass().getMethod(nonterminal, types);
		}
		catch (Exception e)	{
			//System.err.println("WARNING: method not implemented: "+nonterminal+", input is "+inputTokens);
			return fallback(rule, inputTokens, ranges);
		}
		
		Object [] args = new Object[inputTokens.size()];
		inputTokens.toArray(args);

		if (m != null)	{		
			try	{
				m.setAccessible(true);	// problem with anonymous inner classes
				Object o = m.invoke(this, args);
				return o;
			}
			catch (IllegalAccessException e)	{
				e.printStackTrace();
			}
			catch (IllegalArgumentException e)	{
				e.printStackTrace();
			}
			catch (InvocationTargetException e)	{
				e.printStackTrace();
				throw new RuntimeException("ERROR in ReflectSemantic : "+e.getTargetException().toString());
			}
		}
		return null;
	}