First Commit
This commit is contained in:
parent
3a77e4f5ef
commit
9267e4a38b
|
@ -1,2 +1,3 @@
|
||||||
# js-calc
|
# js-calc
|
||||||
|
|
||||||
|
[https://calc.site.tesses.net/](https://calc.site.tesses.net/)
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,138 @@
|
||||||
|
const answer = document.getElementById('answer');
|
||||||
|
function cls()
|
||||||
|
{
|
||||||
|
answer.value = '';
|
||||||
|
}
|
||||||
|
function append(c)
|
||||||
|
{
|
||||||
|
answer.value += c;
|
||||||
|
}
|
||||||
|
function lex()
|
||||||
|
{
|
||||||
|
var lexed = [];
|
||||||
|
var builder = "";
|
||||||
|
var flush = ()=>{
|
||||||
|
if(builder.length > 0)
|
||||||
|
{
|
||||||
|
lexed.push(builder);
|
||||||
|
builder = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var val = answer.value;
|
||||||
|
for(i=0;i<val.length;i++)
|
||||||
|
{
|
||||||
|
switch(val.at(i))
|
||||||
|
{
|
||||||
|
case '.':
|
||||||
|
case '(':
|
||||||
|
case ')':
|
||||||
|
case '^':
|
||||||
|
case '-':
|
||||||
|
case '*':
|
||||||
|
case '/':
|
||||||
|
case '+':
|
||||||
|
{
|
||||||
|
flush();
|
||||||
|
lexed.push(val.at(i));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
builder += val.at(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flush();
|
||||||
|
|
||||||
|
return lexed;
|
||||||
|
}
|
||||||
|
function parse_value(d)
|
||||||
|
{
|
||||||
|
if(d.i < d.lexed.length && d.lexed[d.i] == '(')
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
var v= parse_add(d);
|
||||||
|
d.i++;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = parseInt(d.lexed[d.i++]);
|
||||||
|
if(d.lexed[d.i] == '.')
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
j= parseFloat(`${j}.${d.lexed[d.i++]}`);
|
||||||
|
}
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
function parse_pow(d)
|
||||||
|
{
|
||||||
|
var r = parse_value(d);
|
||||||
|
while(d.i<d.lexed.length && d.lexed[d.i] == "^")
|
||||||
|
{
|
||||||
|
|
||||||
|
d.i++;
|
||||||
|
|
||||||
|
var l = parse_value(d);
|
||||||
|
|
||||||
|
r= Math.pow(r,l);
|
||||||
|
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
function parse_times(d)
|
||||||
|
{
|
||||||
|
var r = parse_pow(d);
|
||||||
|
while(d.i<d.lexed.length && (d.lexed[d.i] == "*" || d.lexed[d.i] == "/"))
|
||||||
|
{
|
||||||
|
if(d.i<d.lexed.length && d.lexed[d.i] == "*")
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
|
||||||
|
var l = parse_pow(d);
|
||||||
|
r *= l;
|
||||||
|
}
|
||||||
|
if(d.i<d.lexed.length && d.lexed[d.i] == "/")
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
|
||||||
|
var l = parse_pow(d);
|
||||||
|
r /= l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
function parse_add(d)
|
||||||
|
{
|
||||||
|
var r = parse_times(d);
|
||||||
|
while(d.i<d.lexed.length && (d.lexed[d.i] == "+" || d.lexed[d.i] == "-"))
|
||||||
|
{
|
||||||
|
if(d.i<d.lexed.length && d.lexed[d.i] == "+")
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
|
||||||
|
var l = parse_times(d);
|
||||||
|
r += l;
|
||||||
|
|
||||||
|
}
|
||||||
|
if(d.i<d.lexed.length && d.lexed[d.i] == "-")
|
||||||
|
{
|
||||||
|
d.i++;
|
||||||
|
var k = r;
|
||||||
|
var l = parse_times(d);
|
||||||
|
|
||||||
|
r -= l;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
function calculate()
|
||||||
|
{
|
||||||
|
var lexed = lex();
|
||||||
|
|
||||||
|
var d = {
|
||||||
|
i: 0,
|
||||||
|
lexed: lexed
|
||||||
|
}
|
||||||
|
|
||||||
|
answer.value = parse_add(d).toString();
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Calculator</title>
|
||||||
|
<link rel="stylesheet" href="./beer.min.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="field border">
|
||||||
|
<input type="text" id="answer" style="text-align: right;">
|
||||||
|
</div>
|
||||||
|
<div class="grid">
|
||||||
|
<div class="s3"><button onclick="append('(')" class="responsive">(</button></div>
|
||||||
|
<div class="s3"><button onclick="append(')')" class="responsive">)</button></div>
|
||||||
|
<div class="s3"><button onclick="append('^')" class="responsive">pow</button></div>
|
||||||
|
<div class="s3"><button onclick="cls()" class="responsive">AC</button></div>
|
||||||
|
<div class="s3"><button onclick="append('7')" class="responsive">7</button></div>
|
||||||
|
<div class="s3"><button onclick="append('8')" class="responsive">8</button></div>
|
||||||
|
<div class="s3"><button onclick="append('9')" class="responsive">9</button></div>
|
||||||
|
<div class="s3"><button onclick="append('/')" class="responsive">/</button></div>
|
||||||
|
<div class="s3"><button onclick="append('4')" class="responsive">4</button></div>
|
||||||
|
<div class="s3"><button onclick="append('5')" class="responsive">5</button></div>
|
||||||
|
<div class="s3"><button onclick="append('6')" class="responsive">6</button></div>
|
||||||
|
<div class="s3"><button onclick="append('*')" class="responsive">*</button></div>
|
||||||
|
<div class="s3"><button onclick="append('1')" class="responsive">1</button></div>
|
||||||
|
<div class="s3"><button onclick="append('2')" class="responsive">2</button></div>
|
||||||
|
<div class="s3"><button onclick="append('3')" class="responsive">3</button></div>
|
||||||
|
<div class="s3"><button onclick="append('-')" class="responsive">-</button></div>
|
||||||
|
<div class="s3"><button onclick="append('0')" class="responsive">0</button></div>
|
||||||
|
<div class="s3"><button onclick="append('.')" class="responsive">.</button></div>
|
||||||
|
<div class="s3"><button onclick="calculate()" class="responsive">=</button></div>
|
||||||
|
<div class="s3"><button onclick="append('+')" class="responsive">+</button></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="./calc.js"></script>
|
||||||
|
|
||||||
|
<a href="https://gitea.site.tesses.net/tesses50/js-calc"></a>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue