コード例 #1
0
ファイル: parser.c プロジェクト: LeonardoSegovia/GitHubFacu
/* <listaSentencias> → <sentencia> {<sentencia>} */
void lista_sentencias(void) {
	
	sentencia();
	while(1) {
		switch(prox_token()) {
			case ID: case LEER: case ESCRIBIR:
				sentencia();
				break;
			default:
				return;
		}
	}
}
コード例 #2
0
ファイル: parser.c プロジェクト: nanorarias/compilador-micro
void lista_sentencias(void) {
	// <listaSentencias> -> <sentencia> {<sentencia>}
	sentencia();
	while (true) {
        switch (next_token()) {
            case ID:
            case LEER:
            case ESCRIBIR:
                sentencia();
                break;
            default:
                return;
        }
	}
}
コード例 #3
0
ファイル: compiler.c プロジェクト: vroman/edivc
/*
 * void sentencia(void)
 * Analiza un bloque de sentencias
 */
void sentencia(void)
{

  int im1, im2, im3, im4;
  int dir, from, to, step;

  while (pieza >= p_return)
  {
    test_buffer(&mem, &imem_max, imem);
    switch (pieza)
    {
    case p_return:
      inicio_sentencia();
      lexico();
      if (pieza == p_abrir)
      {
        lexico();
        if (pieza != p_cerrar)
        {
          expresion();
          if (pieza != p_cerrar)
            error(3, 18); /* esperando ')' */
          g1(lrtf);
        }
        else
        {
          g1(lret);
        }
        lexico();
      }
      else
      {
        g1(lret);
      }
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      final_sentencia();
      grabar_sentencia();
      break;
    case p_if:
      telseif[itelseif++] = 0;
      inicio_sentencia();
      lexico();
      if (!free_sintax)
        if (pieza != p_abrir)
          error(3, 22); /* esperando '(' */
      if (pieza == p_abrir)
        lexico();
      condicion();
      if (!free_sintax)
        if (pieza != p_cerrar)
          error(3, 18); /* esperando ')' */
      if (pieza == p_cerrar)
        lexico();
      g2(ljpf, 0);
      im1 = imem - 1;
      final_sentencia();
      grabar_sentencia();
    if1:
      sentencia();
      if (pieza == p_else)
      {
        inicio_sentencia();
        lexico();
        g2(ljmp, 0);
        mem[im1] = imem;
        im1 = imem - 1;
        final_sentencia();
        grabar_sentencia();
        sentencia();
      }
      else if (pieza == p_elseif)
      {
        if (itelseif == 0)
          error(0, 73); /* elseif fuera de bloque if */
        inicio_sentencia();
        g2(ljmp, 0);
        telseif[itelseif++] = imem - 1;
        mem[im1] = imem;
        lexico();
        if (!free_sintax)
          if (pieza != p_abrir)
            error(3, 22); /* esperando '(' */
        if (pieza == p_abrir)
          lexico();
        condicion();
        if (!free_sintax)
          if (pieza != p_cerrar)
            error(3, 18); /* esperando ')' */
        if (pieza == p_cerrar)
          lexico();
        g2(ljpf, 0);
        im1 = imem - 1;
        final_sentencia();
        grabar_sentencia();
        goto if1;
      }
      mem[im1] = imem;
      if (pieza != p_end)
        error(0, 57);
      lexico(); /* esperando END */
      while (telseif[--itelseif] != 0)
        mem[telseif[itelseif]] = imem;
      break;
    case p_loop:
      tbreak[itbreak++] = 0;
      tcont[itcont++] = 0;
      lexico();
      im1 = imem;
      sentencia();
      if (pieza != p_end)
        error(0, 57); /* esperando END */
      inicio_sentencia();
      lexico();
      g2(ljmp, im1);
      while (tbreak[--itbreak] != 0)
        mem[tbreak[itbreak]] = imem;
      while (tcont[--itcont] != 0)
        mem[tcont[itcont]] = im1;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_while:
      inicio_sentencia();
      tbreak[itbreak++] = 0;
      tcont[itcont++] = 0;
      im1 = imem;
      lexico();
      if (!free_sintax)
        if (pieza != p_abrir)
          error(3, 22); /* esperando '(' */
      if (pieza == p_abrir)
        lexico();
      condicion();
      if (!free_sintax)
        if (pieza != p_cerrar)
          error(3, 18); /* esperando ')' */
      if (pieza == p_cerrar)
        lexico();
      g2(ljpf, 0);
      im2 = imem - 1;
      final_sentencia();
      grabar_sentencia();
      sentencia();
      if (pieza != p_end)
        error(0, 57);
      inicio_sentencia(); /* esperando END */
      lexico();
      g2(ljmp, im1);
      mem[im2] = imem;
      while (tbreak[--itbreak] != 0)
        mem[tbreak[itbreak]] = imem;
      while (tcont[--itcont] != 0)
        mem[tcont[itcont]] = im1;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_repeat:
      tbreak[itbreak++] = 0;
      tcont[itcont++] = 0;
      lexico();
      im1 = imem;
      sentencia();
      if (pieza != p_until)
        error(0, 58); /* esperando UNTIL */
      inicio_sentencia();
      lexico();
      if (!free_sintax)
        if (pieza != p_abrir)
          error(3, 22); /* esperando '(' */
      if (pieza == p_abrir)
        lexico();
      condicion();
      if (!free_sintax)
        if (pieza != p_cerrar)
          error(3, 18); /* esperando ')' */
      if (pieza == p_cerrar)
        lexico();
      g2(ljpf, im1);
      while (tbreak[--itbreak] != 0)
        mem[tbreak[itbreak]] = imem;
      while (tcont[--itcont] != 0)
        mem[tcont[itcont]] = im1;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_from:
      inicio_sentencia();
      tbreak[itbreak++] = 0;
      tcont[itcont++] = 0;
      lexico();
      if (pieza != p_id)
        error(0, 59); /* esperando una variable */

      if (o->tipo == tvglo)
      {
        dir = o->vglo.offset;
        g2(lcar, dir);
      }
      else if (o->tipo == tvloc && (!o->bloque || o->bloque == bloque_actual))
      {
        dir = -o->vloc.offset;
        g2(lcar, -dir);
        g1(laid);
      }
      else
        error(0, 59); /* esperando una variable */

      lexico();
      if (pieza != p_asig)
        error(3, 7);
      lexico(); /* esperando '=' */
      from = constante();
      if (pieza != p_to)
        error(1, 60);
      lexico(); /* esperando TO */
      to = constante();
      if (from == to)
        error(4, 61); /* sentencia FROM incorrecta */
      if (pieza == p_step)
      {
        lexico();
        step = constante();
        if (from < to && step <= 0)
          error(4, 62); /* el valor step no es válido */
        if (from > to && step >= 0)
          error(4, 62);
      }
      else
      {
        if (from < to)
          step = 1;
        else
          step = -1;
      }
      g2(lcar, from); /* Asignación del from */
      g1(lasi);
      g1(lasp);

      im1 = imem; /* Inicio del bucle */

      if (dir >= 0)
      { /* Comparación de la condición de permanencia */
        g2(lcar, dir);
      }
      else
      {
        g2(lcar, -dir);
        g1(laid);
      }
      g1(lptr);
      g2(lcar, to);
      if (step > 0)
        g1(lmei);
      else
        g1(lmai);
      g2(ljpf, 0);
      im2 = imem - 1;

      final_sentencia();
      grabar_sentencia();
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();

      sentencia();
      if (pieza != p_end)
        error(0, 57);
      inicio_sentencia(); /* esperando END */
      lexico();

      im3 = imem; /* Posición del continue */

      if (dir >= 0)
      { /* Incremento y vuelta al inicio del bucle */
        g2(lcar, dir);
      }
      else
      {
        g2(lcar, -dir);
        g1(laid);
      }
      g2(lcar, step);
      g1(lada);
      g1(lasp);
      g2(ljmp, im1);
      mem[im2] = imem;

      while (tbreak[--itbreak] != 0)
        mem[tbreak[itbreak]] = imem;
      while (tcont[--itcont] != 0)
        mem[tcont[itcont]] = im3;
      final_sentencia();
      grabar_sentencia();

      break;

    case p_for:
      inicio_sentencia();
      tbreak[itbreak++] = 0;
      tcont[itcont++] = 0;
      lexico();
      if (pieza != p_abrir)
        error(3, 22);
      lexico(); /* esperando '(' */
      if (pieza != p_ptocoma)
      {
        expresion();
        g1(lasp);
        while (pieza == p_coma)
        {
          lexico();
          expresion();
          g1(lasp);
        }
      }
      im1 = imem;
      if (pieza != p_ptocoma)
        error(3, 9);
      lexico(); /* esperando ';' */
      if (pieza == p_ptocoma)
      {
        g2(lcar, 1);
      }
      else
        expresion();
      g2(ljpf, 0);
      im2 = imem - 1;
      while (pieza == p_coma)
      {
        lexico();
        expresion();
        g2(ljpf, im2);
        im2 = imem - 1;
      }
      g2(ljmp, 0);
      im3 = imem - 1;
      if (pieza != p_ptocoma)
        error(3, 9);
      lexico(); /* esperando ';' */
      if (pieza != p_cerrar)
      {
        expresion();
        g1(lasp);
        while (pieza == p_coma)
        {
          lexico();
          expresion();
          g1(lasp);
        }
      }
      g2(ljmp, im1);
      if (pieza != p_cerrar)
        error(3, 18);
      lexico(); /* esperando ')' */
      final_sentencia();
      grabar_sentencia();
      mem[im3++] = imem;
      sentencia();
      if (pieza != p_end)
        error(0, 57); /* esperando END */
      inicio_sentencia();
      lexico();
      g2(ljmp, im3);
      do
      {
        im1 = mem[im2];
        mem[im2] = imem;
        im2 = im1;
      } while (im2);
      while (tbreak[--itbreak] != 0)
        mem[tbreak[itbreak]] = imem;
      while (tcont[--itcont] != 0)
        mem[tcont[itcont]] = im3;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_switch:
      inicio_sentencia();
      lexico();
      if (!free_sintax)
        if (pieza != p_abrir)
          error(3, 22); /* esperando '(' */
      if (pieza == p_abrir)
        lexico();
      condicion();
      if (!free_sintax)
        if (pieza != p_cerrar)
          error(3, 18); /* esperando ')' */
      if (pieza == p_cerrar)
        lexico();
      while (pieza == p_ptocoma)
      {
        lexico();
      }
      final_sentencia();
      grabar_sentencia();
      im1 = 0;
      im2 = 0;
      while (pieza != p_end)
      {
        inicio_sentencia();
        if (pieza == p_case)
        {
          im3 = 0;
          do
          {

            lexico();
            if (im1)
              mem[im1] = imem;
            expresion();
            if (pieza != p_rango)
            {
              g2(lcse, 0);
              im1 = imem - 1;
            }
            else
            {
              lexico();
              expresion();
              g2(lcsr, 0);
              im1 = imem - 1;
            }

            if (pieza == p_coma)
            {
              g2(ljmp, im3);
              im3 = imem - 1;
            }

          } while (pieza == p_coma);

          while (im3)
          {
            im4 = mem[im3];
            mem[im3] = imem;
            im3 = im4;
          }
        }
        else if (pieza == p_default)
        {
          lexico();
          if (im1)
            mem[im1] = imem;
          im1 = 0;
        }
        else
          error(0, 63); /* esperando case, default o end */
        if (!free_sintax)
          if (pieza != p_ptocoma)
            error(3, 64); /* esperando ':' */
        while (pieza == p_ptocoma || pieza == p_coma)
          lexico();
        g1(lasp);
        final_sentencia();
        grabar_sentencia();
        sentencia();
        if (pieza != p_end)
          error(0, 57); /* esperando END */
        inicio_sentencia();
        g2(ljmp, im2);
        im2 = imem - 1;
        pasa_ptocoma();
        final_sentencia();
        grabar_sentencia();
      }
      inicio_sentencia();
      if (im1)
        mem[im1] = imem;
      g1(lasp);
      while (im2)
      {
        im1 = mem[im2];
        mem[im2] = imem;
        im2 = im1;
      }
      lexico();
      final_sentencia();
      grabar_sentencia();
      break;
    case p_frame:
      inicio_sentencia();
      lexico();
      if (pieza == p_abrir)
      {
        lexico();
        if (pieza != p_cerrar)
        {
          expresion();
          if (pieza != p_cerrar)
            error(3, 18); /* esperando ')' */
          g1(lfrf);
        }
        else
        {
          g1(lfrm);
        }
        lexico();
      }
      else
      {
        g1(lfrm);
      }
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      final_sentencia();
      grabar_sentencia();
      break;
    case p_debug:
      inicio_sentencia();
      g1(ldbg);
      lexico();
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      final_sentencia();
      grabar_sentencia();
      break;
    case p_break:
      inicio_sentencia();
      if (itbreak == 0)
        error(0, 65);
      lexico(); /* break fuera de un bucle */
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      g2(ljmp, 0);
      tbreak[itbreak++] = imem - 1;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_continue:
      inicio_sentencia();
      if (itcont == 0)
        error(0, 66);
      lexico(); /* continue fuera de un bucle */
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      g2(ljmp, 0);
      tcont[itcont++] = imem - 1;
      final_sentencia();
      grabar_sentencia();
      break;
    case p_clone:
      inicio_sentencia();
      lexico();
      g2(lclo, 0);
      im1 = imem - 1;
      final_sentencia();
      grabar_sentencia();
      sentencia();
      if (pieza != p_end)
        error(0, 57);
      lexico(); /* esperando END */
      mem[im1] = imem;
      break;
    case p_ptocoma:
      lexico();
      break;
    default:
      inicio_sentencia();
      error_25 = 67;
      expresion();
      do
      {
        _exp--;
      } while ((*_exp).tipo == eoper && (*_exp).token == p_string);
      error_25 = 25;
      switch ((*_exp).tipo)
      {
      case ecall:
        break;
      case efext:
        break;
      case eoper:
        switch ((*_exp).token)
        {
        case p_asig:
        case p_inc:
        case p_suma:
        case p_dec:
        case p_resta:
        case p_add_asig:
        case p_sub_asig:
        case p_mul_asig:
        case p_div_asig:
        case p_mod_asig:
        case p_and_asig:
        case p_or_asig:
        case p_xor_asig:
        case p_shr_asig:
        case p_shl_asig:

        case p_asigword:
        case p_incword:
        case p_sumaword:
        case p_decword:
        case p_restaword:
        case p_add_asigword:
        case p_sub_asigword:
        case p_mul_asigword:
        case p_div_asigword:
        case p_mod_asigword:
        case p_and_asigword:
        case p_or_asigword:
        case p_xor_asigword:
        case p_shr_asigword:
        case p_shl_asigword:

        case p_asigchar:
        case p_incchar:
        case p_sumachar:
        case p_decchar:
        case p_restachar:
        case p_add_asigchar:
        case p_sub_asigchar:
        case p_mul_asigchar:
        case p_div_asigchar:
        case p_mod_asigchar:
        case p_and_asigchar:
        case p_or_asigchar:
        case p_xor_asigchar:
        case p_shr_asigchar:
        case p_shl_asigchar:

        case p_strcpy:
        case p_strcat:
        case p_strsub:
          break;
        default:
          error(4, 68);
          break; /* expresion sin sentido */
        }
        break;
      default:
        error(4, 68); /* expresion sin sentido */
      }
      if (!free_sintax)
        if (pieza != p_ptocoma)
          error(3, 9); /* esperando ';' */
      while (pieza == p_ptocoma || pieza == p_coma)
        lexico();
      g1(lasp);
      final_sentencia();
      grabar_sentencia();
      break;
    }
  }
}