[~/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