PegJS en los Browser
PegJS en los Browser
Podemos cargar PEG.js usando un cdn como unpkg.com
y usarlo en nuestros scripts:
https://unpkg.com/pegjs@0.10.0/lib/peg.js
o bien podemos producir un parser para la web utilizando las opciones del ejecutable pegjs
:
[~/.../pegjs/examples(master)]$ pegjs --help
Usage: pegjs [options] [--] [<input_file>]
Options:
...
-e, --export-var <variable> name of a global variable into which the
parser object is assigned to when no module
loader is detected
--format <format> format of the generated parser: amd,
commonjs, globals, umd (default: commonjs)
...
De esta forma le indicamos que el parser se guarde en la variable calculator
:
[~/.../pegjs/examples(master)]$ pegjs -e calculator --format globals arithmetics.pegjs
[~/.../pegjs/examples(master)]$ tail -5 arithmetics.js
root.calculator = {
SyntaxError: peg$SyntaxError,
parse: peg$parse
};
})(this);
Ahora, desde el JavaScript que llama al parser accedemos al objeto
mediante la variable calculator
:
[~/srcPLgrado/pegjs/examples(master)]$ cat calc.js
$(document).ready(function() {
$('#eval').click(function() {
try {
var result = calculator.parse($('#input').val());
$('#output').html(result);
} catch (e) {
$('#output').html('<div class="error"><pre>\n' + String(e) + '\n</pre></div>');
}
});
$("#examples").change(function(ev) {
var f = ev.target.files[0];
var r = new FileReader();
r.onload = function(e) {
var contents = e.target.result;
input.innerHTML = contents;
}
r.readAsText(f);
});
});
El PEG describe una calculadora:
[~/srcPLgrado/pegjs/examples(master)]$ cat calculator.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>pegjs</title>
<link rel="stylesheet" href="global.css" type="text/css" media="screen" charset="utf-8" />
</head>
<body>
<h1>pegjs</h1>
<div id="content">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="arithmetics.js"></script>
<script src="calc.js"></script>
<p>
Load an example:
<input type="file" id="examples" />
</p>
<p>
<table>
<tr>
<td>
<textarea id="input" autofocus cols = "40" rows = "4">2+3*4</textarea>
</td>
<td class="output">
<pre>
<span id="output"></span> <!-- Output goes here! -->
</pre>
</td>
<td><button id="eval" type="button">eval</button></td>
</tr>
</table>
</p>
</div>
</body>
</html>
Referencias
-
~/srcPLgrado/pegjs/examples(master)]$ pwd -P /Users/casiano/local/src/javascript/PLgrado/pegjs/examples
-
[~/srcPLgrado/pegjs/examples(master)]$ git remote -v dmajda https://github.com/dmajda/pegjs.git (fetch) dmajda https://github.com/dmajda/pegjs.git (push) origin git@github.com:crguezl/pegjs.git (fetch) origin git@github.com:crguezl/pegjs.git (push)