code: def p_var_decl_at(p):
      
      p[0] = None
  
      if len(p[2]) != 1:
          syntax_error(p.lineno(1),
                       'Only one variable at a time can be declared this way')
          return
  
      idlist = p[2][0]
  
      entry = SYMBOL_TABLE.declare_variable(idlist[0], idlist[1], p[3])
      if entry is None:
          return
  
      if p[5].token == 'CONST':
          tmp = p[5].expr
          if tmp.token == 'UNARY' and tmp.operator == 'ADDRESS':  # Must be an ID
              if tmp.operand.token == 'VAR':
                  entry.make_alias(tmp.operand)
              elif tmp.operand.token == 'ARRAYACCESS':
                  if tmp.operand.offset is None:
                      syntax_error(p.lineno(4), 'Address is not constant. Only constant subscripts are allowed')
                      return
  
                  entry.make_alias(tmp.operand)
                  entry.offset = tmp.operand.offset
              else:
                  syntax_error(p.lineno(4), 'Only address of identifiers are allowed')
                  return
  
      elif not is_number(p[5]):
          syntax_error(p.lineno(4), 'Address must be a numeric constant expression')
          return
      else:
          entry.addr = str(make_typecast(_TYPE(gl.STR_INDEX_TYPE), p[5], p.lineno(4)).value)
          entry.accessed = True
          if entry.scope == SCOPE.local:
              SYMBOL_TABLE.make_static(entry.name)
docs: var_decl : DIM idlist typedef AT expr