Ejercicios de PEGjs

Ejercicio: Llamadas a función en PL0.1

En el PEGjs en pl0.pegjs de la rama clase09052016 se añaden así llamadas a funciones:

factor = NUMBER
       / id:ID LEFTPAR a:assign? r:(COMMA assign)* RIGHTPAR

El problema con esta regla es que acepta entradas como esta con una coma inicial:

  while (a < 10) do a = fact(,a+1,b);

Obviamente el problema es fácil de arreglar usando dos reglas:

       / ID LEFTPAR RIGHTPAR
       / ID LEFTPAR assign (COMMA assign)* RIGHTPAR

¿Sabría como resolver el problema usando una sola regla?

Puede editar el texto que sigue y pulsar Submit para comprobar si su solución coincide con la del profesor. Si cree tener la solución puede comentarla en este párrafo (signo de + a la derecha del párrafo, es necesario estar registrado en GitBook).

Exercise
factor = NUMBER / id:ID LEFTPAR a:assign? r:(COMMA assign)* RIGHTPAR /* llamada a función*/ { let c = a? [a] : []; c= c.concat(r.map(([_, t]) => t)); return { type: 'CALL', name: id, children: c } } / ID / LEFTPAR t:assign RIGHTPAR { return t; }
Correct
Match Failed

Ejercicio: Acción Semántica para las Declaraciones de funciones en PL0.1

En el PEGjs en pl0.pegjs de la rama clase09052016 se añaden así las declaraciones de funciones:

functionDeclaration = FUNCTION id:ID LEFTPAR !COMMA p1:ID? r:(COMMA ID)* RIGHTPAR block SC
                        {
                        }

Complete el código que falta. Aplane los bloques de manera que cuando se le de como entrada un programa como este:

const A = 4, 
      B = 30;
var b, n;
function fact(n);
  var t;
  function tutu(a,b,c);
    return 4;
  { 
    if n <= 1 then return 1 
    else return n*fact(n-1);
  };
{
  n = 9;
  b = fact(n);
}

Produzca un árbol de salida similar a este:

{ type: 'BLOCK',
  constants: [ [ 'A', 4 ], [ 'B', 30 ] ],
  variables: [ 'b', 'n' ],
  functions: 
   [ { name: 'fact',
       params: [ 'n' ],
       type: 'BLOCK',
       constants: [],
       variables: [ 't' ],
       functions: 
        [ { name: 'tutu',
            params: [ 'a', 'b', 'c' ],
            type: 'BLOCK',
            constants: [],
            variables: [],
            functions: [],
            main: { type: 'RETURN', children: [ { type: 'NUM', value: 4 } ] } } ],
       main: 
        { type: 'COMPOUND',
          children: 
           [ { type: 'IFELSE',
               c: 
                { type: '<=',
                  left: { type: 'ID', value: 'n' },
                  right: { type: 'NUM', value: 1 } },
               st: { type: 'RETURN', children: [ { type: 'NUM', value: 1 } ] },
               sf: 
                { type: 'RETURN',
                  children: 
                   [ { type: '*',
                       left: { type: 'ID', value: 'n' },
                       right: 
                        { type: 'CALL',
                          name: 'fact',
                          arguments: 
                           [ { type: '-',
                               left: { type: 'ID', value: 'n' },
                               right: { type: 'NUM', value: 1 } } ] } } ] } } ] } } ],
  main: 
   { type: 'COMPOUND',
     children: 
      [ { type: '=',
          left: { type: 'ID', value: 'n' },
          right: { type: 'NUM', value: 9 } },
        { type: '=',
          left: { type: 'ID', value: 'b' },
          right: 
           { type: 'CALL',
             name: 'fact',
             arguments: [ { type: 'ID', value: 'n' } ] } } ] } }

Si cree tener la solución puede comentarla en este párrafo (signo de + o #nº a la derecha del párrafo, es necesario estar registrado en GitBook).

results matching ""

    No results matching ""