~/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)
[~/Dropbox/src/javascript/PLgrado/jison]$ pegjs --help Usage: pegjs [options] [--] [<input_file>] [<output_file>] Generates a parser from the PEG grammar specified in the <input_file> and writes it to the <output_file>. If the <output_file> is omitted, its name is generated by changing the <input_file> extension to ".js". If both <input_file> and <output_file> are omitted, standard input and output are used. Options: -e, --export-var <variable> name of the variable where the parser object will be stored (default: "module.exports") --cache make generated parser cache results --track-line-and-column make generated parser track line and column -v, --version print version information and exit -h, --help print help and exit
Le indicamos que el parser se guarde en calculator
:
[~/Dropbox/src/javascript/PLgrado/pegjs/examples(master)]$ rake web ../bin/pegjs -e calculator arithmetics.pegjs
[~/srcPLgrado/pegjs/examples(master)]$ head -5 arithmetics.js calculator = (function() { /* * Generated by PEG.js 0.7.0. * * http://pegjs.majda.cz/
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); }); });
[~/Dropbox/src/javascript/PLgrado/pegjs/examples(master)]$ cat arithmetics.pegjs /* * Classic example grammar, which recognizes simple arithmetic expressions like * "2*(3+4)". The parser generated from this grammar then computes their value. */ start = additive additive = left:multiplicative PLUS right:additive { return left + right; } / left:multiplicative MINUS right:additive { return left - right; } / multiplicative multiplicative = left:primary MULT right:multiplicative { return left * right; } / left:primary DIV right:multiplicative { return left / right; } / primary primary = integer / LEFTPAR additive:additive RIGHTPAR { return additive; } integer "integer" = NUMBER _ = $[ \t\n\r]* PLUS = _"+"_ MINUS = _"-"_ MULT = _"*"_ DIV = _"/"_ LEFTPAR = _"("_ RIGHTPAR = _")"_ NUMBER = _ digits:$[0-9]+ _ { return parseInt(digits, 10); }
[~/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>
Casiano Rodríguez León