Example #1
0
File: parser.c Project: palmerc/lab
int logical_and_expression(void) {
	if( inclusive_or_expression() ) {
	} else if( logical_and_expression() ) {
		match(AND_OP);
		inclusive_or_expression();
	}
}
Example #2
0
// 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;
}
Example #3
0
File: parser.c Project: palmerc/lab
int inclusive_or_expression(void) {
	if( exclusive_or_expression() ) {
	} else if( inclusive_or_expression() ) {
		match(PIPE);
		exclusive_or_expression();
	}
}
Example #4
0
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);
}
Example #5
0
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;
}
Example #6
0
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;
}