nano-scheme: fixed lexer, added some debug output.
This commit is contained in:
parent
af3ed23c8f
commit
a215e3650a
|
@ -9,7 +9,8 @@
|
|||
# l lambda
|
||||
# r read byte
|
||||
# w write byte
|
||||
# q quote next byte in the source
|
||||
# b quote next byte in the source
|
||||
# q quotes its argument
|
||||
# i byte to int
|
||||
# c cons
|
||||
# n null
|
||||
|
@ -38,11 +39,11 @@
|
|||
# F free cell ptr
|
||||
# I integer int
|
||||
# Y symbol hex
|
||||
# O lexer "(" mark "_"
|
||||
#
|
||||
# Note: hex strings must not contain any spaces.
|
||||
|
||||
h=0
|
||||
s=0
|
||||
|
||||
heap_sbrk() { h=$(($h+1)); }
|
||||
heap_get_type() { eval a=\$t$1; }
|
||||
|
@ -58,34 +59,72 @@ heap_debug() { for heap_debug_i in `seq $h`; do
|
|||
heap_get_cdr $heap_debug_i; printf %s\\n $a
|
||||
done }
|
||||
|
||||
stack_debug() { for stack_debug_i in `seq $s`; do
|
||||
printf "<%s " $stack_debug_i
|
||||
eval a=\$s$stack_debug_i
|
||||
printf "%s>" $a
|
||||
done
|
||||
printf \\n; }
|
||||
|
||||
rlist() {
|
||||
rlist_ptr=$h
|
||||
heap_sbrk; heap_set $h N _
|
||||
rlist_cdr=$h
|
||||
heap_get_type $rlist_ptr
|
||||
while test $a != O; do
|
||||
heap_sbrk; heap_set_pair $h P $rlist_ptr $rlist_cdr
|
||||
eval a=\$s$s
|
||||
while test "$a" != M && test $s -ge 0; do
|
||||
heap_sbrk; heap_set_pair $h P $a $rlist_cdr
|
||||
rlist_cdr=$h
|
||||
rlist_ptr=$(($rlist_ptr-1))
|
||||
heap_get_type $rlist_ptr
|
||||
s=$(($s-1))
|
||||
eval a=\$s$s
|
||||
done
|
||||
a=$rlist_cdr
|
||||
if test $s -lt 0; then
|
||||
printf 'Parse error: unbalanced parenthesis'\\n
|
||||
exit 1
|
||||
fi
|
||||
eval s$s=$rlist_cdr
|
||||
}
|
||||
|
||||
debug_print() {
|
||||
heap_get_type $1
|
||||
if test $a = P; then
|
||||
if $2; then printf %s ' '; else printf %s '('; fi
|
||||
heap_get_val $1
|
||||
debug_print $a false
|
||||
heap_get_cdr $1
|
||||
debug_print $a true
|
||||
if $2; then :; else printf %s ')'; fi
|
||||
elif test $a = N; then
|
||||
if $2; then :; else printf %s '()'; fi
|
||||
elif test $a = Y; then
|
||||
if $2; then printf %s '.'; fi
|
||||
heap_get_val $1
|
||||
printf %s $a | xxd -ps -r
|
||||
if $2; then printf %s ')'; fi
|
||||
else
|
||||
if $2; then printf %s '.'; fi
|
||||
printf %s $a
|
||||
heap_get_val $1
|
||||
printf %s $a
|
||||
heap_get_cdr $1
|
||||
printf %s $a
|
||||
if $2; then printf %s ')'; fi
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
printf '(lxx)' \
|
||||
printf '(w((lxx)r))' \
|
||||
| od -v -A n -t x1 \
|
||||
| sed -e 's/^ //' \
|
||||
| tr ' ' \\n \
|
||||
| (while read c; do
|
||||
echo lex:$c
|
||||
case "$c" in
|
||||
28) heap_sbrk; heap_set $h O _ ;;
|
||||
29) rlist ;;
|
||||
*) heap_sbrk; heap_set $h Y $c ;;
|
||||
28) s=$(($s+1)); eval s$s=M ;;
|
||||
29) stack_debug; rlist; stack_debug ;;
|
||||
*) heap_sbrk; heap_set $h Y $c; s=$(($s+1)); eval s$s=$h ;;
|
||||
esac
|
||||
done
|
||||
heap_debug)
|
||||
heap_debug
|
||||
debug_print $h false)
|
||||
}
|
||||
|
||||
if true; then main; exit $?; fi
|
||||
|
|
Loading…
Reference in New Issue
Block a user