int logical_and_expression(void) { if( inclusive_or_expression() ) { } else if( logical_and_expression() ) { match(AND_OP); inclusive_or_expression(); } }
// Parse a logical-and expression. // // logical-and-expression: // inclusive-or-expression // logical-and-expression '&&' inclusive-or-expression // Expr& Parser::logical_and_expression() { Expr* e1 = &inclusive_or_expression(); while (true) { if (Token tok = match_if(tk::amp_amp_tok)) { Expr& e2 = inclusive_or_expression(); e1 = &on_logical_and_expression(tok, *e1, e2); } else { break; } } return *e1; }
int inclusive_or_expression(void) { if( exclusive_or_expression() ) { } else if( inclusive_or_expression() ) { match(PIPE); exclusive_or_expression(); } }
struct Symbol* inclusive_or_expression(struct InclusiveOrExpression* node) { if (node->type == 0) return exclusive_or_expression(node->exclusiveOrExpression); struct Symbol* symbol1 = load_symbol(inclusive_or_expression(node->inclusiveOrExpression)); struct Symbol* symbol2 = load_symbol(exclusive_or_expression(node->exclusiveOrExpression)); return inclusive_or_symbol(symbol1, symbol2, node->type); }
struct Symbol* logical_and_expression(struct LogicalAndExpression* node) { if (node->type == 0) return inclusive_or_expression(node->inclusiveOrExpression); struct Symbol* symbol1 = load_symbol(logical_and_expression(node->logicalAndExpression)); struct Symbol* symbol2 = load_symbol(inclusive_or_expression(node->inclusiveOrExpression)); struct Symbol* symbol3 = test_calculable2(&symbol1, &symbol2, 'a'); if (symbol3) return symbol3; symbol3 = new_symbol("0", 0, 2, 16, 0, 2, 0); symbol3 = equality_symbol(symbol1, symbol3, 2, 1); ADDSTRING(" br i1 "); code_gen_symbol('%', symbol3); struct Symbol* label1 = new_symbol("", 0, 0, 0, 0, 0, 0); ADDSTRING(", label "); code_gen_symbol('%', label1); ADDSTRING(", label "); char *ch = g_ptr; ADDSTRING(" "); ADDSTRING("\n; <label>:"); code_gen_symbol(0, label1); ADDSTRING("\n"); symbol1 = equality_symbol(symbol2, symbol3, 2, 1); ADDSTRING(" br label "); struct Symbol* label2 = new_symbol("", 0, 0, 0, 0, 0, 0); code_gen_symbol('%', label2); ADDSTRING("\n; <label>:"); code_gen_symbol(0, label2); ADDSTRING("\n"); ADDSTRING(" "); symbol2 = new_symbol("", 0, 2, 2, 0, 0, 0); code_gen_symbol('%', symbol2); ADDSTRING(" = phi i1 [ false, %0 ], [ "); code_gen_symbol('%', symbol1); ADDSTRING(", "); code_gen_symbol('%', label2); ADDSTRING(" ]\n"); push_buffer(ch); code_gen_symbol('%', label2); *g_ptr = ' '; pop_buffer(); return symbol2; }
static struct block *logical_and_expression(struct block *block) { struct block *right; block = inclusive_or_expression(block); if (peek().token == LOGICAL_AND) { consume(LOGICAL_AND); right = cfg_block_init(); block = eval_logical_and(block, right, logical_and_expression(right)); } return block; }