}
public int get_integer (ArgumentType arg) {
- var lit = get_expression (arg) as IntegerLiteral;
- if (lit != null) {
- return int.parse (lit.value);
+ var unary = get_expression (arg) as UnaryExpression;
+ if (unary != null && unary.operator == UnaryOperator.MINUS) {
+ var lit = unary.inner as IntegerLiteral;
+ if (lit != null) {
+ return -int.parse (lit.value);
+ }
+ } else {
+ var lit = get_expression (arg) as IntegerLiteral;
+ if (lit != null) {
+ return int.parse (lit.value);
+ }
}
return 0;
}
Expression? parse_expression () {
+ var begin = this.begin;
var src = get_current_src ();
Expression expr = null;
switch (current) {
case TokenType.FALSE:
expr = new BooleanLiteral (false, src);
break;
+ case TokenType.MINUS:
+ next ();
+ var inner = parse_expression ();
+ if (inner == null) {
+ Report.error (src, "expected expression after `-', got `%s'".printf (current.to_string ()));
+ } else {
+ expr = new UnaryExpression (UnaryOperator.MINUS, inner, get_src (begin));
+ }
+ return expr;
case TokenType.INTEGER_LITERAL:
expr = new IntegerLiteral (get_string (), src);
break;