@@ 373,9 373,9 @@ expression
/*| expression ',' assignment_expression*/
;
-/*constant_expression*/
- /*: conditional_expression*/
- /*;*/
+constant_expression
+ : conditional_expression
+ ;
declaration
/*: declaration_specifiers ';'*/
@@ 661,10 661,11 @@ statement
labelled_statement
: identifier ':' statement
{ $$ = ast_stmt_create_labelled(lexloc(), $1, $3); }
+ | CASE constant_expression ':' statement
+ { $$ = ast_stmt_create_nop(lexloc()); }
+ | DEFAULT ':' statement
+ { $$ = ast_stmt_create_nop(lexloc()); }
;
- /*| CASE constant_expression ':' statement*/
- /*| DEFAULT ':' statement*/
- /*;*/
compound_statement
: '{' block '}' { $$ = $2; }
@@ 735,7 736,8 @@ selection_statement
);
$$ = ast_stmt_create_sel(lexloc(), false, $3, $5, _else);
}
- // | SWITCH '(' expression ')' statement
+ | SWITCH '(' expression ')' statement
+ { $$ = ast_stmt_create_nop(lexloc()); }
;
for_some
@@ 431,10 431,8 @@ struct tknameresult {
char *pos;
};
-typedef struct tknameresult (*nameparser)(char *);
-
-nameparser
-choose_nameparser(char *pos);
+struct tknameresult
+parse_name(char *pos);
struct stringresult
parse_action(char *input);
@@ 442,12 440,16 @@ parse_action(char *input);
struct tokenresult
parse_token(char *pos)
{
- struct tknameresult nameres = choose_nameparser(pos)(pos);
- struct stringresult actionres = parse_action(skiplinespace(nameres.pos));
- return (struct tokenresult){
- token_create(nameres.isliteral, nameres.name, actionres.s),
- actionres.pos,
- };
+ struct tknameresult nameres;
+ struct stringresult actionres;
+ struct tokenresult res;
+
+ nameres = parse_name(pos);
+ actionres = parse_action(skiplinespace(nameres.pos));
+
+ res.tk = token_create(nameres.isliteral, nameres.name, actionres.s);
+ res.pos = actionres.pos;
+ return res;
}
struct tknameresult
@@ 459,75 461,95 @@ parse_token_literal(char *input);
struct tknameresult
parse_token_pattern(char *pos);
-nameparser
-choose_nameparser(char *pos)
+struct tknameresult
+parse_name(char *pos)
{
switch (*pos) {
case '{':
- return &parse_token_id;
+ return parse_token_id(pos);
case '"':
- return &parse_token_literal;
+ return parse_token_literal(pos);
default:
- return &parse_token_pattern;
+ return parse_token_pattern(pos);
}
}
struct tknameresult
parse_token_id(char *pos)
{
- char *id = parse_id(++pos); /* skip '{' */
+ char *id;
+ struct tknameresult res;
+
+ id = parse_id(++pos); /* skip '{' */
pos += strlen(id);
if (*pos != '}') {
fprintf(stderr, "token id must end in '}' but has '%.*s\n'", 5,
pos);
exit(1);
}
- return (struct tknameresult){false, id, pos + 1}; /* '}' */
+
+ res.isliteral = false;
+ res.name = id;
+ res.pos = pos + 1; /* '}' */
+ return res;
}
struct tknameresult
parse_token_literal(char *input)
{
+ char *pos;
+ struct tknameresult res;
+
input++; /* skip '"' */
- char *pos = input;
+ pos = input;
for (pos++; *pos != '"'; pos++) {}
- return (struct tknameresult){
- true,
- substr(input, pos - input),
- pos + 1,
- };
+
+ res.isliteral = true;
+ res.name = substr(input, pos - input);
+ res.pos = pos + 1;
+ return res;
}
struct tknameresult
parse_token_pattern(char *pos)
{
- char *id = parse_id(pos);
- return (struct tknameresult){true, id, pos + strlen(id)};
+ char *id;
+ struct tknameresult res;
+
+ id = parse_id(pos);
+
+ res.isliteral = true;
+ res.name = id;
+ res.pos = pos + strlen(id);
+ return res;
}
struct stringresult
parse_action(char *input)
{
+ char *pos;
+ struct stringresult res;
+
if (*input != '{') {
fprintf(stderr, "action must begin with '{' but has '%.*s\n",
10, input);
exit(1);
}
input++; /* skip '{' */
- char *pos = input;
+ pos = input;
for (; *pos != '}'; pos++) {}
- return (struct stringresult){
- substr(input, pos - input),
- pos + 1,
- };
+ res.s = substr(input, pos - input);
+ res.pos = pos + 1;
+ return res;
}
char *
parse_toeof(char *input)
{
- char *s = input;
- while (*s != '\0') {
+ char *s;
+
+ for (s = input; *s != '\0'; 0) {
s++;
}
return substr(input, s - input);