return(NULL);
}
- pos = lex_getpos();
+ if((expr->landexpr = parse_logical_and_expression())) {
+ return(expr);
+ }
- /* attempt to parse `logical-OR-expression ||' prefix */
+ pos = lex_getpos();
expr->lorexpr = parse_logical_or_expression();
expr->op = lex_gettoken();
+ expr->landexpr = parse_logical_and_expression();
- if(!expr->lorexpr || !expr->op || expr->op->type != TOKEN_LOR) {
- /* doesn't look like a prefix... */
-
- if(expr->lorexpr) {
- free(expr->lorexpr);
- expr->lorexpr = NULL;
- }
- expr->op = NULL;
-
- lex_setpos(pos);
+ if(expr->lorexpr && expr->landexpr && expr->op && expr->op->type == TOKEN_LOR) {
+ return(expr);
}
- if(!(expr->landexpr = parse_logical_and_expression())) {
- if(expr->lorexpr) {
- free(expr->lorexpr);
- expr->lorexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ logical_or_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct logical_and_expression *parse_logical_and_expression(void)
return(NULL);
}
- pos = lex_getpos();
+ if((expr->iorexpr = parse_inclusive_or_expression())) {
+ return(expr);
+ }
- /* same logic as in parse_logical_or_expression() */
+ pos = lex_getpos();
expr->landexpr = parse_logical_and_expression();
expr->op = lex_gettoken();
+ expr->iorexpr = parse_inclusive_or_expression();
- if(!expr->landexpr || !expr->op || expr->op->type != TOKEN_LAND) {
- /* wasn't a prefix after all */
-
- if(expr->landexpr) {
- free(expr->landexpr);
- expr->landexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->landexpr && expr->iorexpr && expr->op && expr->op->type == TOKEN_LAND) {
+ return(expr);
}
- if(!(expr->iorexpr = parse_inclusive_or_expression())) {
- if(expr->landexpr) {
- free(expr->landexpr);
- expr->landexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
+ lex_setpos(pos);
+ logical_and_expression_free(expr);
- lex_setpos(pos);
- }
-
- return(expr);
+ return(NULL);
}
struct inclusive_or_expression *parse_inclusive_or_expression(void)
return(NULL);
}
+ if((expr->xorexpr = parse_exclusive_or_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->iorexpr = parse_inclusive_or_expression();
expr->op = lex_gettoken();
+ expr->xorexpr = parse_exclusive_or_expression();
- if(!expr->iorexpr || !expr->op || expr->op->type != TOKEN_OR) {
- if(expr->iorexpr) {
- free(expr->iorexpr);
- expr->iorexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->iorexpr && expr->xorexpr && expr->op && expr->op->type && TOKEN_OR) {
+ return(expr);
}
- if(!(expr->xorexpr = parse_exclusive_or_expression())) {
- if(expr->iorexpr) {
- free(expr->iorexpr);
- expr->iorexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
+ lex_setpos(pos);
+ inclusive_or_expression_free(expr);
- lex_setpos(pos);
- }
-
- return(expr);
+ return(NULL);
}
struct exclusive_or_expression *parse_exclusive_or_expression(void)
return(NULL);
}
+ if((expr->andexpr = parse_and_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->xorexpr = parse_exclusive_or_expression();
expr->op = lex_gettoken();
+ expr->andexpr = parse_and_expression();
- if(!expr->xorexpr || !expr->op || expr->op->type != TOKEN_XOR) {
- if(expr->xorexpr) {
- free(expr->xorexpr);
- expr->xorexpr = NULL;
- }
-
- expr->op = NULL;
-
- lex_setpos(pos);
+ if(expr->xorexpr && expr->andexpr && expr->op && expr->op->type == TOKEN_XOR) {
+ return(expr);
}
- if(!(expr->andexpr = parse_and_expression())) {
- if(expr->xorexpr) {
- free(expr->xorexpr);
- expr->xorexpr = NULL;
- }
-
- expr->op = NULL;
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ exclusive_or_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct and_expression *parse_and_expression(void)
return(NULL);
}
+ if((expr->eqexpr = parse_equality_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->andexpr = parse_and_expression();
expr->op = lex_gettoken();
+ expr->eqexpr = parse_equality_expression();
- if(!expr->andexpr || !expr->op || expr->op->type != TOKEN_AND) {
- if(expr->andexpr) {
- free(expr->andexpr);
- expr->andexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->andexpr && expr->eqexpr && expr->op && expr->op->type == TOKEN_AND) {
+ return(expr);
}
- if(!(expr->eqexpr = parse_equality_expression())) {
- if(expr->andexpr) {
- free(expr->andexpr);
- expr->andexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ and_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct equality_expression *parse_equality_expression(void)
return(NULL);
}
+ if((expr->relexpr = parse_relational_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->eqexpr = parse_equality_expression();
expr->op = lex_gettoken();
+ expr->relexpr = parse_relational_expression();
- if(!expr->eqexpr || !expr->op || (expr->op->type != TOKEN_EQ &&
- expr->op->type != TOKEN_NEQ)) {
- if(expr->eqexpr) {
- free(expr->eqexpr);
- expr->eqexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->eqexpr && expr->relexpr && expr->op && (expr->op->type == TOKEN_EQ ||
+ expr->op->type == TOKEN_NEQ)) {
+ return(expr);
}
- if(!(expr->relexpr = parse_relational_expression())) {
- if(expr->eqexpr) {
- free(expr->eqexpr);
- expr->eqexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ equality_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct relational_expression *parse_relational_expression(void)
return(NULL);
}
+ if((expr->sexpr = parse_shift_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->relexpr = parse_relational_expression();
expr->op = lex_gettoken();
+ expr->sexpr = parse_shift_expression();
- if(!expr->relexpr || !expr->op || (expr->op->type != TOKEN_LT &&
- expr->op->type != TOKEN_GT &&
- expr->op->type != TOKEN_LE &&
- expr->op->type != TOKEN_GE)) {
- if(expr->relexpr) {
- free(expr->relexpr);
- expr->relexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->relexpr && expr->sexpr && expr->op && (expr->op->type == TOKEN_GT ||
+ expr->op->type == TOKEN_LT ||
+ expr->op->type == TOKEN_GE ||
+ expr->op->type == TOKEN_LE)) {
+ return(expr);
}
- if(!(expr->sexpr = parse_shift_expression())) {
- if(expr->relexpr) {
- free(expr->relexpr);
- expr->relexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ relational_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct shift_expression *parse_shift_expression(void)
return(NULL);
}
+ if((expr->addexpr = parse_additive_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->sexpr = parse_shift_expression();
expr->op = lex_gettoken();
+ expr->addexpr = parse_additive_expression();
- if(!expr->sexpr || !expr->op || (expr->op->type != TOKEN_SHL &&
- expr->op->type != TOKEN_SHR)) {
- if(expr->sexpr) {
- free(expr->sexpr);
- expr->sexpr = NULL;
- }
-
- expr->op = NULL;
-
- lex_setpos(pos);
+ if(expr->sexpr && expr->addexpr && expr->op && (expr->op->type == TOKEN_SHL ||
+ expr->op->type == TOKEN_SHR)) {
+ return(expr);
}
- if(!(expr->addexpr = parse_additive_expression())) {
- if(expr->sexpr) {
- free(expr->sexpr);
- expr->sexpr = NULL;
- }
-
- expr->op = NULL;
- free(expr);
- expr = NULL;
-
- lex_setpos(pos);
- }
+ lex_setpos(pos);
+ shift_expression_free(expr);
- return(expr);
+ return(NULL);
}
struct additive_expression *parse_additive_expression(void)
return(NULL);
}
+ if((expr->mulexpr = parse_multiplicative_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
+
expr->addexpr = parse_additive_expression();
expr->op = lex_gettoken();
+ expr->mulexpr = parse_multiplicative_expression();
- if(!expr->addexpr || !expr->op || (expr->op->type != TOKEN_ADD &&
- expr->op->type != TOKEN_SUB)) {
- if(expr->addexpr) {
- free(expr->addexpr);
- expr->addexpr = NULL;
- }
-
- expr->op = NULL;
- lex_setpos(pos);
+ if(expr->mulexpr && expr->addexpr && expr->op && (expr->op->type == TOKEN_ADD ||
+ expr->op->type == TOKEN_SUB)) {
+ return(expr);
}
- if(!(expr->mulexpr = parse_multiplicative_expression())) {
- if(expr->addexpr) {
- free(expr->addexpr);
- expr->addexpr = NULL;
- }
-
- free(expr);
- expr = NULL;
+ lex_setpos(pos);
+ additive_expression_free(expr);
- lex_setpos(pos);
- }
-
- return(expr);
+ return(NULL);
}
struct multiplicative_expression *parse_multiplicative_expression(void)
return(NULL);
}
+ if((expr->castexpr = parse_cast_expression())) {
+ return(expr);
+ }
+
pos = lex_getpos();
expr->mulexpr = parse_multiplicative_expression();
expr->op = lex_gettoken();
+ expr->castexpr = parse_cast_expression();
- if(!expr->mulexpr || !expr->op || (expr->op->type != TOKEN_MUL &&
- expr->op->type != TOKEN_DIV &&
- expr->op->type != TOKEN_MOD)) {
- if(expr->mulexpr) {
- free(expr->mulexpr);
- expr->mulexpr = NULL;
- }
-
- expr->op = NULL;
-
- lex_setpos(pos);
+ if(expr->mulexpr && expr->castexpr && expr->op && (expr->op->type == TOKEN_MUL ||
+ expr->op->type == TOKEN_DIV ||
+ expr->op->type == TOKEN_MOD)) {
+ return(expr);
}
- if(!(expr->castexpr = parse_cast_expression())) {
- if(expr->mulexpr) {
- free(expr->mulexpr);
- expr->mulexpr = NULL;
- }
-
- expr->op = NULL;
- free(expr);
- expr = NULL;
+ lex_setpos(pos);
+ multiplicative_expression_free(expr);
- lex_setpos(pos);
- }
-
- return(expr);
+ return(NULL);
}