/**
* Contains all specified attribute arguments.
*/
- public Vala.Map<string,Expression> args = new HashMap<string,Expression> (str_hash, str_equal);
+ public Vala.Map<string,string> args = new HashMap<string,string> (str_hash, str_equal);
/**
* Creates a new attribute.
*
* @param arg named argument
*/
- public void add_argument (string key, Expression value) {
+ public void add_argument (string key, string value) {
args.set (key, value);
}
* @return string value
*/
public string? get_string (string name) {
- var lit = args.get (name) as StringLiteral;
- if (lit != null) {
- return lit.eval ();
+ string value = args.get (name);
+
+ if (value == null) {
+ return null;
}
-
- return null;
+
+ /* remove quotes */
+ var noquotes = value.substring (1, (uint) (value.length - 2));
+ /* unescape string */
+ return noquotes.compress ();
}
/**
* @return integer value
*/
public int get_integer (string name) {
- var lit = args.get (name) as IntegerLiteral;
- if (lit != null) {
- return lit.value.to_int ();
+ string value = args.get (name);
+
+ if (value == null) {
+ return 0;
}
-
- return 0;
+
+ return value.to_int ();
}
/**
* @return double value
*/
public double get_double (string name) {
- var arg = args.get (name);
- if (arg is RealLiteral) {
- var lit = (RealLiteral) arg;
- return lit.value.to_double ();
- } else if (arg is IntegerLiteral) {
- var lit = (IntegerLiteral) arg;
- return lit.value.to_int ();
- } else if (arg is UnaryExpression) {
- var unary = (UnaryExpression) arg;
- if (unary.operator == UnaryOperator.MINUS) {
- if (unary.inner is RealLiteral) {
- var lit = (RealLiteral) unary.inner;
- return -lit.value.to_double ();
- } else if (unary.inner is IntegerLiteral) {
- var lit = (IntegerLiteral) unary.inner;
- return -lit.value.to_int ();
- }
- }
+ string value = args.get (name);
+
+ if (value == null) {
+ return 0;
}
-
- return 0;
+
+ return value.to_double ();
}
/**
* @return boolean value
*/
public bool get_bool (string name) {
- var lit = args.get (name) as BooleanLiteral;
- if (lit != null) {
- return lit.value;
- }
-
- return false;
+ return (args.get (name) == "true");
}
}
string separator = "";
foreach (string arg_name in keys) {
- stream.printf ("%s%s = ", separator, arg_name);
- var expr = attr.args.get (arg_name);
- expr.accept (this);
+ stream.printf ("%s%s = %s", separator, arg_name, attr.args.get (arg_name));
separator = ", ";
}
attr = new Attribute ("CCode");
attributes.append (attr);
}
- attr.add_argument ("type", new StringLiteral ("\"%s\"".printf (ctype)));
+ attr.add_argument ("type", "\"%s\"".printf (ctype));
}
public override bool check (SemanticAnalyzer analyzer) {
return new DeleteStatement (expr, get_src (begin));
}
+ string parse_attribute_value () throws ParseError {
+ switch (current ()) {
+ case TokenType.NULL:
+ case TokenType.TRUE:
+ case TokenType.FALSE:
+ case TokenType.INTEGER_LITERAL:
+ case TokenType.REAL_LITERAL:
+ case TokenType.STRING_LITERAL:
+ next ();
+ return get_last_string ();
+ case TokenType.MINUS:
+ next ();
+ switch (current ()) {
+ case TokenType.INTEGER_LITERAL:
+ case TokenType.REAL_LITERAL:
+ next ();
+ return "-" + get_last_string ();
+ default:
+ throw new ParseError.SYNTAX (get_error ("expected number"));
+ }
+ default:
+ throw new ParseError.SYNTAX (get_error ("expected literal"));
+ }
+ }
+
List<Attribute>? parse_attributes () throws ParseError {
if (current () != TokenType.OPEN_BRACKET) {
return null;
do {
id = parse_identifier ();
expect (TokenType.ASSIGN);
- var expr = parse_expression ();
- attr.add_argument (id, expr);
+ attr.add_argument (id, parse_attribute_value ());
} while (accept (TokenType.COMMA));
}
expect (TokenType.CLOSE_PARENS);
return new DeleteStatement (expr, get_src (begin));
}
+ string parse_attribute_value () throws ParseError {
+ switch (current ()) {
+ case TokenType.NULL:
+ case TokenType.TRUE:
+ case TokenType.FALSE:
+ case TokenType.INTEGER_LITERAL:
+ case TokenType.REAL_LITERAL:
+ case TokenType.STRING_LITERAL:
+ next ();
+ return get_last_string ();
+ case TokenType.MINUS:
+ next ();
+ switch (current ()) {
+ case TokenType.INTEGER_LITERAL:
+ case TokenType.REAL_LITERAL:
+ next ();
+ return "-" + get_last_string ();
+ default:
+ throw new ParseError.SYNTAX (get_error ("expected number"));
+ }
+ default:
+ throw new ParseError.SYNTAX (get_error ("expected literal"));
+ }
+ }
+
List<Attribute>? parse_attributes () throws ParseError {
if (current () != TokenType.OPEN_BRACKET) {
return null;
do {
id = parse_identifier ();
expect (TokenType.ASSIGN);
- var expr = parse_expression ();
- attr.add_argument (id, expr);
+ attr.add_argument (id, parse_attribute_value ());
} while (accept (TokenType.COMMA));
}
expect (TokenType.CLOSE_PARENS);