04 de Mayo de 2016

En la rama clase04052016 del repo pegjs pueden encontrar el codigo explicado y desarrollado en la clase del 04/05. En concreto los ficheros:

  • arithmetics.pegjs

  • En esta clase vimos como añadir las sentencias compuestas.

  • También hicimos énfasis en como es el backtracking en PEGs

Bactracking en los PEGs

  • PEG parsers don't backtrack like other recursive-descent parsers or Prolog do.
  • Rather, when confronted with a choice, a PEG parser will try every option until one succeeds.
  • Once one succeeds, it will commit to it no matter how the rule was invoked.

El siguiente ejemplo ilustra el backtracking en los PEGs:

var PEG = require ("pegjs");
var grammar1 = `
start = "test" / "test ;"
`;
var parser = PEG.buildParser(grammar1);
var input = 'test';
console.log("OK: "+parser.parse(input));
try {
  // This input will not be accepted 
  var input = 'test ;';
  console.log(parser.parse(input));
}
catch (e) {
  console.log(e);
}
var grammar2 = `
start = "test" !" ;" / "test ;"
`;
var parser = PEG.buildParser(grammar2);
var input = 'test ;';
console.log("OK: "+parser.parse(input));

Cuando se ejecuta produce la salida:

[~/srcPLgrado/pegjs/examples(master)]$ node backtracking.js 
OK: test
{ [SyntaxError: Expected end of input but " " found.]
  message: 'Expected end of input but " " found.',
  expected: [ { type: 'end', description: 'end of input' } ],
  found: ' ',
  offset: 4,
  line: 1,
  column: 5,
  name: 'SyntaxError' }
OK: test ;

results matching ""

    No results matching ""