[~/jison/examples/html_calc_example(develop)]$ cat calculator.jison /* description: Parses end executes mathematical expressions. */ /* lexical grammar */ %lex %% \s+ /* skip whitespace */ [0-9]+("."[0-9]+)?\b return 'NUMBER' "*" return '*' "/" return '/' "-" return '-' "+" return '+' "^" return '^' "!" return '!' "%" return '%' "(" return '(' ")" return ')' "PI" return 'PI' "E" return 'E' <<EOF>> return 'EOF' . return 'INVALID' /lex /* operator associations and precedence */ %left '+' '-' %left '*' '/' %left '^' %right '!' %right '%' %left UMINUS %start expressions %% /* language grammar */ expressions : e EOF { typeof console !== 'undefined' ? console.log($1) : print($1); return $1; } ; e : e '+' e {$$ = $1+$3;} | e '-' e {$$ = $1-$3;} | e '*' e {$$ = $1*$3;} | e '/' e {$$ = $1/$3;} | e '^' e {$$ = Math.pow($1, $3);} | e '!' {{ $$ = (function fact (n) { return n==0 ? 1 : fact(n-1) * n })($1); }} | e '%' {$$ = $1/100;} | '-' e %prec UMINUS {$$ = -$2;} | '(' e ')' {$$ = $2;} | NUMBER {$$ = Number(yytext);} | E {$$ = Math.E;} | PI {$$ = Math.PI;} ;
[~/jison/examples/html_calc_example(develop)]$ cat main.js $(document).ready(function () { $("button").click(function () { try { var result = calculator.parse($("input").val()) $("span").html(result); } catch (e) { $("span").html(String(e)); } }); });
[~/jison/examples/html_calc_example(develop)]$ cat calculator.html <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8"> <title>Calc</title> <link rel="stylesheet" href="global.css" type="text/css" media="screen" charset="utf-8" /> </head> <body> <h1>Calculator demo</h1> <div id="content"> <script src="jquery/jquery.js"></script> <script src="calculator.js"></script> <script src="main.js"></script> <p> <input type="text" value="PI*4^2 + 5" /> <button>equals</button> <span></span> <!-- Output goes here! --> </p> </div> </body> </html>
[~/jisoncalc(clase)]$ cat Rakefile task :default => %w{calcugly.js} do sh "jsbeautify calcugly.js > calculator.js" sh "rm -f calcugly.js" end file "calcugly.js" => %w{calculator.jison} do sh "jison calculator.jison calculator.l -o calculator.js; mv calculator.js calcugly.js" end task :testf do sh "open -a firefox test/test.html" end task :tests do sh "open -a safari test/test.html" end
[~/jison/examples/html_calc_example(develop)]$ cat global.css html * { font-size: large; /* The !important ensures that nothing can override what you've set in this style (unless it is also important). */ font-family: Arial; } .thumb { height: 75px; border: 1px solid #000; margin: 10px 5px 0 0; } h1 { text-align: center; font-size: x-large; } th, td { vertical-align: top; text-align: left; } /* #finaltable * { color: white; background-color: black; } */ /* #finaltable table { border-collapse:collapse; } */ /* #finaltable table, td { border:1px solid white; } */ #finaltable:hover td { background-color: blue; } tr:nth-child(odd) { background-color:#eee; } tr:nth-child(even) { background-color:#00FF66; } input { text-align: right; border: none; } /* Align input to the right */ textarea { border: outset; border-color: white; } table { border: inset; border-color: white; } .hidden { display: none; } .unhidden { display: block; } table.center { margin-left:auto; margin-right:auto; } #result { border-color: red; } tr.error { background-color: red; } pre.output { background-color: white; } span.repeated { background-color: red } span.header { background-color: blue } span.comments { background-color: orange } span.blanks { background-color: green } span.nameEqualValue { background-color: cyan } span.error { background-color: red } body { background-color:#b0c4de; /* blue */ }
$ cat test/assert.js var output = document.getElementById('output'); function assert( outcome, description) { var li = document.createElement('li'); li.className = outcome ? 'pass' : 'fail'; li.appendChild(document.createTextNode(description)); output.appendChild(li); };
~/jisoncalc(clase)]$ cat test/test.css .pass:before { content: 'PASS: '; color: blue; font-weight: bold; } .fail:before { content: 'FAIL: '; color: red; font-weight: bold; }
[~/jisoncalc(clase)]$ cat test/test.html <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>Testing Our Simple Calculator</title> <link rel="stylesheet" href="test.css" /> <script type="text/javascript" src="../calculator.js"></script> </head> <body> <h1>Testing Our Simple Calculator </h1> <ul id="output"></ul> <script type="text/javascript" src="______.js"></script> <script type="text/javascript"> var r = __________.parse("a = 4*8"); assert(_______________, "a is 4*8"); assert(_____________, "32 == 4*8"); r = calculator.parse("a = 4;\nb=a+1;\nc=b*2"); assert(____________, "4 is the first computed result "); assert(______________, "a is 4"); assert(______________, "b is 5"); assert(______________, "c is 10"); </script> See the NetTuts+ tutorial at <a href="http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/">Quick and Easy JavaScript Testing</a> </body> </html>
a = 2*3
a = 2; b = a +1
PI
y e
.
a = c
a = 4;;; b = 5
)
Casiano Rodríguez León