if(!expr->lorexpr || !expr->op || expr->op->type != TOKEN_LOR) {
/* doesn't look like a prefix... */
- lex_setpos(pos);
-
if(expr->lorexpr) {
free(expr->lorexpr);
expr->lorexpr = NULL;
}
expr->op = NULL;
+
+ lex_setpos(pos);
}
if(!(expr->landexpr = parse_logical_and_expression())) {
free(expr);
expr = NULL;
+
+ lex_setpos(pos);
}
return(expr);
}
struct logical_and_expression *parse_logical_and_expression(void)
+{
+ struct logical_and_expression *expr;
+ int pos;
+
+ expr = logical_and_expression_new();
+
+ if(!expr) {
+ return(NULL);
+ }
+
+ pos = lex_getpos();
+
+ /* same logic as in parse_logical_or_expression() */
+
+ expr->landexpr = parse_logical_and_expression();
+ expr->op = lex_gettoken();
+
+ 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->iorexpr = parse_inclusive_or_expression())) {
+ if(expr->landexpr) {
+ free(expr->landexpr);
+ expr->landexpr = NULL;
+ }
+
+ free(expr);
+ expr = NULL;
+
+ lex_setpos(pos);
+ }
+
+ return(expr);
+}
+
+struct inclusive_or_expression *parse_inclusive_or_expression(void)
+{
+ struct inclusive_or_expression *expr;
+ int pos;
+
+ expr = inclusive_or_expression_new();
+
+ if(!expr) {
+ return(NULL);
+ }
+
+ pos = lex_getpos();
+
+ expr->iorexpr = parse_inclusive_or_expression();
+ expr->op = lex_gettoken();
+
+ 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->xorexpr = parse_exclusive_or_expression())) {
+ if(expr->iorexpr) {
+ free(expr->iorexpr);
+ expr->iorexpr = NULL;
+ }
+
+ free(expr);
+ expr = NULL;
+
+ lex_setpos(pos);
+ }
+
+ return(expr);
+}
+
+struct exclusive_or_expression *parse_exclusive_or_expression(void)
+{
+ struct exclusive_or_expression *expr;
+ int pos;
+
+ expr = exclusive_or_expression_new();
+
+ if(!expr) {
+ return(NULL);
+ }
+
+ pos = lex_getpos();
+
+ expr->xorexpr = parse_exclusive_or_expression();
+ expr->op = lex_gettoken();
+
+ 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->andexpr = parse_and_expression())) {
+ if(expr->xorexpr) {
+ free(expr->xorexpr);
+ expr->xorexpr = NULL;
+ }
+
+ expr->op = NULL;
+ free(expr);
+ expr = NULL;
+
+ lex_setpos(pos);
+ }
+
+ return(expr);
+}
+
+struct and_expression *parse_and_expression(void)
+{
+ struct and_expression *expr;
+ int pos;
+
+ expr = and_expression_new();
+
+ if(!expr) {
+ return(NULL);
+ }
+
+ pos = lex_getpos();
+
+ expr->andexpr = parse_and_expression();
+ expr->op = lex_gettoken();
+
+ 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->eqexpr = parse_equality_expression())) {
+ if(expr->andexpr) {
+ free(expr->andexpr);
+ expr->andexpr = NULL;
+ }
+
+ free(expr);
+ expr = NULL;
+
+ lex_setpos(pos);
+ }
+
+ return(expr);
+}
+
+struct equality_expression *parse_equality_expression(void)
{
return(NULL);
}
struct logical_or_expression *parse_logical_or_expression(void);
struct logical_and_expression *parse_logical_and_expression(void);
+struct inclusive_or_expression *parse_inclusive_or_expression(void);
+struct exclusive_or_expression *parse_exclusive_or_expression(void);
+struct and_expression *parse_and_expression(void);
+struct equality_expression *parse_equality_expression(void);
struct unary_expression *parse_unary_expression(void);
struct conditional_expression *parse_conditional_expression(void);