private Expression expression3() throws RequiredTokenException 
	{
		enterRule(NonTerminal.EXPRESSION3);
		Expression expression = null;
		Token startToken = reader.token();
		if(accept(Token.Kind.NOT))
		{
			expression = new LogicalNot(
				startToken.getLineNumber(),
				startToken.getCharPos(),
				expression3());
		}
		else if(accept(Token.Kind.OPEN_PAREN))
		{
			expression = expression0();
			require(Token.Kind.CLOSE_PAREN);
		}
		else if(firstSetSatisfied(NonTerminal.DESIGNATOR))
			expression = designator(false);
		else if(firstSetSatisfied(NonTerminal.CALL_EXPRESSION))
			try 
			{
				expression = call_expression();
			} catch (UnresolvableSymbolException e) 
			{
				expression = new Error(
					e.UnresolvedToken.getLineNumber(),
					e.UnresolvedToken.getCharPos(),
					String.format("Unable to resolve symbol \"%s\".", e.UnresolvedToken.getLexeme()));
			}
		else if(firstSetSatisfied(NonTerminal.LITERAL))
			expression = literal();
		else
			expression = new Error(
				startToken.getLineNumber(),
				startToken.getCharPos(),
				String.format("First set unsatisfied by token of kind \"%s\".", startToken.getKind()));
		exitRule();
		return expression;
	}