Arithmetic evaluation: Difference between revisions

m
Line 1,346:
.
subr init0
aastop$[] = [ ]
aleastleft[] = [ ]
ariastright[] = [ ]
err = 0
.
Line 1,359:
.
proc ast_print nd . .
write "AST: " & nd
for i to len aastop$[]
write " ( "
write aastop$[i] & " "
write aleastleft[i] & " "
write ariastright[i]
write " )"
.
print " Start: " & nd
.
func node .
aastop$[] &= ""
aleastleft[] &= 0
ariastright[] &= 0
return len aastop$[]
.
#
Line 1,381:
if tok$ = "n"
nd = node
aastop$[nd] = "n"
aleastleft[nd] = tokv
ntok
elif tok$ = "("
Line 1,399:
while tok$ = "*" or tok$ = "/"
nd = node
aleastleft[nd] = ndx
aastop$[nd] = tok$
ntok
ariastright[nd] = parse_factor
ndx = nd
.
Line 1,411:
while tok$ = "+" or tok$ = "-"
nd = node
aleastleft[nd] = ndx
aastop$[nd] = tok$
ntok
ariastright[nd] = parse_term
ndx = nd
.
Line 1,424:
.
func eval nd .
if aastop$[nd] = "n"
return aleastleft[nd]
.
le = eval aleastleft[nd]
ri = eval ariastright[nd]
a$ = aastop$[nd]
if a$ = "+"
return le + ri
Line 1,454:
4 * 6
4.2 * ((5.3+8)*3 + 4)
2.5 * 2 + 2 * 3.14
</syntaxhighlight>
 
1,995

edits