Construcción de un Repeat Evaluate Print Loop
En la práctica egg-interpreter deberá hacer que el ejecutable egg
funcione como un bucle REPL cuando no se le proporciona un fichero de entrada.
[~/ull-pl1718-campus-virtual/tema3-analisis-sintactico/src/egg/crguezl-egg(private)]$ bin/egg.js
> def(x, array(1,2,array(3,4))) # x = [1,2,[3,4]]
[ 1, 2, [ 3, 4 ] ]
> <-(x,2) # 3d element
[ 3, 4 ]
> <-(x,0) # 1st element
1
> +(2, # No completamos la expresión: espera
> ..*(3, # Sigue incompleta
> ....4)
> ..) # cerramos: evalúa
14
> # Pulsamos CTRL-D
> goodbye!
En este Vídeo Programando un bucle REPL para el lenguaje Egg (opens in a new tab) explicamos como hacerlo
Véase la clase 2023/04/19. Además del bucle repl: Interpretación de los Nodos del AST de Egg. Interpretation of Assignment Expressions. Function Interpretation.
Building a Repeat Evaluate Print Loop. Vídeo Programando un bucle REPL para el lenguaje Egg (opens in a new tab)
The function parBalance(line)
that we introduce in the parse.js
main file checks for parenthesis balance in line
. The parameter line
contains a (potentially incomplete)
egg expression:
'use strict';
const { SPACE } = require("./tokens.js");
const fs = require('fs');
const nearley = require("nearley");
const grammar = require("./grammar.js");
const lex = require('./lex-pl.js');
function parBalance(line) {
let stack = 0;
lex.reset(line);
let tokens = lex.tokens;
// Increment stack each time you see an LP token, decrement it if you see a RP
/* ... fill the code ... */
return stack;
}
Fell free to add and export in file parse.js
any convenience parser-related functions you feel you neeed in the egg-interpreter
module.
See also the docs for readline.createInterface
: