public Exp factor()
{
Op op;
int posStart;
switch (lexer.Peek().Type)
{
case TokenType.OP_PLUS: posStart = lexer.Get().Start; op = Op.Add; break;
case TokenType.OP_MINUS: posStart = lexer.Get().Start; op = Op.Sub; break;
case TokenType.OP_TILDE: posStart = lexer.Get().Start; op = Op.Complement; break;
default: return power();
}
var e = factor();
if (e == null)
Unexpected();
return new UnaryExp(op, e, filename, posStart, e.End);
}