- REAL { t.real = $1; parse_token(REAL, t); }
- | INTEGER { t.integer = $1; parse_token(INTEGER, t); }
- | STRING { t.string = $1; parse_token(STRING, t); }
- | IDENTIFIER { t.identifier = $1; parse_token(IDENTIFIER, t); }
- | BOOL { t.bool = $1; parse_token(BOOL, t); }
- | '(' { t.character = $1; parse_token($1, t); }
- | ')' { t.character = $1; parse_token($1, t); }
- | '{' { t.character = $1; parse_token($1, t); }
- | '}' { t.character = $1; parse_token($1, t); }
- | '=' { t.character = $1; parse_token($1, t); }
- | ',' { t.character = $1; parse_token($1, t); }
+ REAL { t.type = TOKEN_REAL; t.data.real = $1; }
+ | INTEGER { t.type = TOKEN_INTEGER; t.data.integer = $1; }
+ | STRING { t.type = TOKEN_STRING; t.data.string = $1; }
+ | IDENTIFIER { t.type = TOKEN_IDENTIFIER; t.data.identifier = $1; }
+ | BOOL { t.type = TOKEN_BOOL; t.data.bool = $1; }
+ | list { t.type = TOKEN_LIST; t.data.list = $1; }
+ | '{' { t.type = $1; t.data.character = $1; }
+ | '}' { t.type = $1; t.data.character = $1; }
+ | ',' { t.type = $1; t.data.character = $1; }
+ ;
+
+list:
+ '(' listtokens ')' { $$ = $2; }
+ ;
+
+listtokens:
+ listtokens listtoken { ParseToken *nt = g_new(ParseToken, 1);
+ nt->type = t.type;
+ nt->data = t.data;
+ $$ = g_list_append($1, nt);
+ }
+ | listtoken { ParseToken *nt = g_new(ParseToken, 1);
+ nt->type = t.type;
+ nt->data = t.data;
+ $$ = g_list_append(NULL, nt);
+ }
+ ;
+
+listtoken:
+ REAL { t.type = TOKEN_REAL; t.data.real = $1; }
+ | INTEGER { t.type = TOKEN_INTEGER; t.data.integer = $1; }
+ | STRING { t.type = TOKEN_STRING; t.data.string = $1; }
+ | IDENTIFIER { t.type = TOKEN_IDENTIFIER; t.data.identifier = $1; }
+ | BOOL { t.type = TOKEN_BOOL; t.data.bool = $1; }
+ | list { t.type = TOKEN_LIST; t.data.list = $1; }
+ | '{' { t.type = $1; t.data.character = $1; }
+ | '}' { t.type = $1; t.data.character = $1; }
+ | ',' { t.type = $1; t.data.character = $1; }