Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,85 +1,85 @@
|
|||
Module CheckAst {
|
||||
class EvalAst {
|
||||
private:
|
||||
Function Ast(&in$) {
|
||||
object Ast=stack, op=stack
|
||||
Do
|
||||
stack Ast {stack .Ast1(&in$)}
|
||||
in$=Trim$(in$)
|
||||
oper$=left$(in$,1)
|
||||
if Instr("+-", oper$)>0 else exit
|
||||
if len(oper$)>0 then stack op {push oper$}
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
stack Ast {stack op} // dump op to end of stack Ast
|
||||
=Ast
|
||||
}
|
||||
Function Ast1(&in$) {
|
||||
object Ast=stack, op=stack
|
||||
Do
|
||||
stack Ast {stack .Ast2(&in$)}
|
||||
in$=Trim$(in$)
|
||||
oper$=left$(in$,1)
|
||||
if Instr("*/", oper$)>0 else exit
|
||||
if len(oper$)>0 then stack op {push oper$}
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
stack Ast {stack op}
|
||||
=Ast
|
||||
}
|
||||
Function Ast2(&in$) {
|
||||
in$=Trim$(in$)
|
||||
if Asc(in$)<>40 then =.GetNumber(&in$) : exit
|
||||
in$=Mid$(in$, 2)
|
||||
=.Ast(&in$)
|
||||
in$=Mid$(in$, 2)
|
||||
}
|
||||
Function GetNumber (&in$) {
|
||||
Def ch$, num$
|
||||
Do
|
||||
ch$=left$(in$,1)
|
||||
if instr("0123456789", ch$)>0 else exit
|
||||
num$+=ch$
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
=stack:=val(num$)
|
||||
}
|
||||
public:
|
||||
value () {
|
||||
=.Ast(![])
|
||||
}
|
||||
}
|
||||
Ast=EvalAst()
|
||||
Expr$ = "1+2 * (3 + (4 * 5 + 6 * 7 * 8) - 9) / 10"
|
||||
// Expr$="1/2+(4-3)/2+1/2"
|
||||
print "Result through eval$:";eval(Expr$)
|
||||
print "Expr :";Expr$
|
||||
mres=Ast(&Expr$)
|
||||
print "RPN :";array(stack(mres))#str$()
|
||||
reg=stack
|
||||
stack mres {
|
||||
while not empty
|
||||
if islet then
|
||||
read op$
|
||||
stack reg {
|
||||
select case op$
|
||||
case "+"
|
||||
push number+number
|
||||
case "-"
|
||||
shift 2:push number-number
|
||||
case "*"
|
||||
push number*number
|
||||
case "/"
|
||||
shift 2:push number/number // shif 2 swap top 2 values
|
||||
end select
|
||||
}
|
||||
else
|
||||
read v
|
||||
stack reg {push v}
|
||||
end if
|
||||
end while
|
||||
}
|
||||
if len(reg)<>1 then Error "Wrong Evaluation"
|
||||
print "Result :";stackitem(reg)
|
||||
class EvalAst {
|
||||
private:
|
||||
Function Ast(&in$) {
|
||||
object Ast=stack, op=stack
|
||||
Do
|
||||
stack Ast {stack .Ast1(&in$)}
|
||||
in$=Trim$(in$)
|
||||
oper$=left$(in$,1)
|
||||
if Instr("+-", oper$)>0 else exit
|
||||
if len(oper$)>0 then stack op {push oper$}
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
stack Ast {stack op} // dump op to end of stack Ast
|
||||
=Ast
|
||||
}
|
||||
Function Ast1(&in$) {
|
||||
object Ast=stack, op=stack
|
||||
Do
|
||||
stack Ast {stack .Ast2(&in$)}
|
||||
in$=Trim$(in$)
|
||||
oper$=left$(in$,1)
|
||||
if Instr("*/", oper$)>0 else exit
|
||||
if len(oper$)>0 then stack op {push oper$}
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
stack Ast {stack op}
|
||||
=Ast
|
||||
}
|
||||
Function Ast2(&in$) {
|
||||
in$=Trim$(in$)
|
||||
if Asc(in$)<>40 then =.GetNumber(&in$) : exit
|
||||
in$=Mid$(in$, 2)
|
||||
=.Ast(&in$)
|
||||
in$=Mid$(in$, 2)
|
||||
}
|
||||
Function GetNumber (&in$) {
|
||||
Def ch$, num$
|
||||
Do
|
||||
ch$=left$(in$,1)
|
||||
if instr("0123456789", ch$)>0 else exit
|
||||
num$+=ch$
|
||||
in$=Mid$(in$, 2)
|
||||
until len(in$)=0
|
||||
=stack:=val(num$)
|
||||
}
|
||||
public:
|
||||
value () {
|
||||
=.Ast(![])
|
||||
}
|
||||
}
|
||||
Ast=EvalAst()
|
||||
Expr$ = "1+2 * (3 + (4 * 5 + 6 * 7 * 8) - 9) / 10"
|
||||
// Expr$="1/2+(4-3)/2+1/2"
|
||||
print "Result through eval$:";eval(Expr$)
|
||||
print "Expr :";Expr$
|
||||
mres=Ast(&Expr$)
|
||||
print "RPN :";array(stack(mres))#str$()
|
||||
reg=stack
|
||||
stack mres {
|
||||
while not empty
|
||||
if islet then
|
||||
read op$
|
||||
stack reg {
|
||||
select case op$
|
||||
case "+"
|
||||
push number+number
|
||||
case "-"
|
||||
shift 2:push number-number
|
||||
case "*"
|
||||
push number*number
|
||||
case "/"
|
||||
shift 2:push number/number // shif 2 swap top 2 values
|
||||
end select
|
||||
}
|
||||
else
|
||||
read v
|
||||
stack reg {push v}
|
||||
end if
|
||||
end while
|
||||
}
|
||||
if len(reg)<>1 then Error "Wrong Evaluation"
|
||||
print "Result :";stackitem(reg)
|
||||
}
|
||||
CheckAst
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue