Index: uspace/app/sbi/src/parse.c
===================================================================
--- uspace/app/sbi/src/parse.c	(revision fa36f294e6a3f5cc4a846e9b33621971e0cc3d07)
+++ uspace/app/sbi/src/parse.c	(revision 94d484ac742127ae8d87a7e0bb630fafe11f65be)
@@ -56,4 +56,5 @@
 
 static stree_fun_arg_t *parse_fun_arg(parse_t *parse);
+static stree_arg_attr_t *parse_arg_attr(parse_t *parse);
 
 /*
@@ -72,4 +73,6 @@
 static stree_exps_t *parse_exps(parse_t *parse);
 
+static stree_except_t *parse_except(parse_t *parse);
+
 void parse_init(parse_t *parse, stree_program_t *prog, struct lex *lex)
 {
@@ -87,10 +90,4 @@
 	stree_symbol_t *symbol;
 
-/*	do {
-		lex_next(parse->lex);
-		printf("Read token: "); lem_print(&parse->lex->current);
-		putchar('\n');
-	} while (parse->lex->current.lclass != lc_eof);
-*/
 	while (lcur_lc(parse) != lc_eof) {
 		switch (lcur_lc(parse)) {
@@ -245,5 +242,10 @@
 		while (b_true) {
 			arg = parse_fun_arg(parse);
-			list_append(&fun->args, arg);
+			if (stree_arg_has_attr(arg, aac_packed)) {
+				fun->varg = arg;
+				break;
+			} else {
+				list_append(&fun->args, arg);
+			}
 
 			if (lcur_lc(parse) == lc_rparen)
@@ -307,4 +309,5 @@
 {
 	stree_fun_arg_t *arg;
+	stree_arg_attr_t *attr;
 
 	arg = stree_fun_arg_new();
@@ -313,5 +316,32 @@
 	arg->type = parse_texpr(parse);
 
+	list_init(&arg->attr);
+
+	/* Parse attributes. */
+	while (lcur_lc(parse) == lc_comma) {
+		lskip(parse);
+		attr = parse_arg_attr(parse);
+		list_append(&arg->attr, attr);
+	}
+
 	return arg;
+}
+
+/** Parse argument attribute. */
+static stree_arg_attr_t *parse_arg_attr(parse_t *parse)
+{
+	stree_arg_attr_t *attr;
+
+	if (lcur_lc(parse) != lc_packed) {
+		printf("Error: Unexpected attribute '");
+		lem_print(lcur(parse));
+		printf("'.\n");
+		exit(1);
+	}
+
+	lskip(parse);
+
+	attr = stree_arg_attr_new(aac_packed);
+	return attr;
 }
 
@@ -378,4 +408,5 @@
 		stat->u.return_s = return_s;
 		break;
+	case lc_do:
 	case lc_with:
 		wef_s = parse_wef(parse);
@@ -485,9 +516,12 @@
 static stree_raise_t *parse_raise(parse_t *parse)
 {
+	stree_raise_t *raise_s;
+
+	raise_s = stree_raise_new();
 	lmatch(parse, lc_raise);
-	(void) parse_expr(parse);
+	raise_s->expr = parse_expr(parse);
 	lmatch(parse, lc_scolon);
 
-	return stree_raise_new();
+	return raise_s;
 }
 
@@ -510,32 +544,34 @@
 {
 	stree_wef_t *wef_s;
-	stree_block_t *block;
+	stree_except_t *except_c;
 
 	wef_s = stree_wef_new();
-	list_init(&wef_s->except_blocks);
-
-	lmatch(parse, lc_with);
-	lmatch(parse, lc_ident);
-	lmatch(parse, lc_colon);
-	(void) parse_texpr(parse);
-	lmatch(parse, lc_assign);
-	(void) parse_expr(parse);
-	lmatch(parse, lc_do);
-	wef_s->with_block = parse_block(parse);
-
-	while (lcur_lc(parse) == lc_except) {
-		lmatch(parse, lc_except);
+	list_init(&wef_s->except_clauses);
+
+	if (lcur_lc(parse) == lc_with) {
+		lmatch(parse, lc_with);
 		lmatch(parse, lc_ident);
 		lmatch(parse, lc_colon);
 		(void) parse_texpr(parse);
+		lmatch(parse, lc_assign);
+		(void) parse_expr(parse);
+	}
+
+	lmatch(parse, lc_do);
+	wef_s->with_block = parse_block(parse);
+
+	while (lcur_lc(parse) == lc_except) {
+		except_c = parse_except(parse);
+		list_append(&wef_s->except_clauses, except_c);
+	}
+
+	if (lcur_lc(parse) == lc_finally) {
+		lmatch(parse, lc_finally);
 		lmatch(parse, lc_do);
-
-		block = parse_block(parse);
-		list_append(&wef_s->except_blocks, block);
-	}
-
-	lmatch(parse, lc_finally);
-	lmatch(parse, lc_do);
-	wef_s->finally_block = parse_block(parse);
+		wef_s->finally_block = parse_block(parse);
+	} else {
+		wef_s->finally_block = NULL;
+	}
+
 	lmatch(parse, lc_end);
 
@@ -556,4 +592,22 @@
 
 	return exps;
+}
+
+/* Parse @c except clause. */
+static stree_except_t *parse_except(parse_t *parse)
+{
+	stree_except_t *except_c;
+
+	except_c = stree_except_new();
+
+	lmatch(parse, lc_except);
+	except_c->evar = parse_ident(parse);
+	lmatch(parse, lc_colon);
+	except_c->etype = parse_texpr(parse);
+	lmatch(parse, lc_do);
+
+	except_c->block = parse_block(parse);
+
+	return except_c;
 }
 
