Esempio n. 1
0
def p_array_index(p):
    '''array_index : LBRACK expression RBRACK'''
    var = symtable.get_var(p[-1])
    if not var:
        errors.append("Line {}: Undefined variable '{}'".format(p.lineno(1), p[-1]))
        raise SyntaxError
    elif not var['dim']:
        errors.append("Line {}: Variable '{}' is not an array".format(p.lineno(1), p[-1]))
        raise SyntaxError
    
    exp_res = codegen.opdos.pop()
    if exp_res['type'] != int:
        errors.append("Line {}: Index must be integer".format(p.lineno(1)))
        raise SyntaxError
    
    liminf = 0
    limsup = var['dim']-1
    codegen.gen_quad(dir.verifica, exp_res['dir'], liminf, limsup)
    basedir = symtable.add_constant(var['dir'])
    pointer = symtable.newpointer()
    codegen.gen_quad(dir.suma, basedir['dir'], exp_res['dir'], pointer)
    res = {'dir':pointer, 'type':int, 'dim':None}
    #codegen.opdos.append(res)
    p[0] = res
Esempio n. 2
0
def p_varcte_constant_true(p):
    '''varcte : TRUE'''
    p[0] = symtable.add_constant(1)
Esempio n. 3
0
def p_varcte_constant_false(p):
    '''varcte : FALSE'''
    p[0] = symtable.add_constant(0)
Esempio n. 4
0
def p_varcte_constant(p):
    '''varcte : INT 
              | FLOAT
              | STRING'''
    p[0] = symtable.add_constant(p[1])