How to build Som
Source files
Source code of Som-system comprises of
compile.h     define constants
icname.h      encoding of all s-code
parse.h        function prototypes
token.h        definition of tokens
interp.h        for interpreter
a1.c             main
token.c        tokeniser, generated from
lexgen
lex.c            lexical
analyser
parse.c        parser, generated from pgen
stmt.c          functions that
support parsing
gencode.c   code generator
icode.c        functions that support
outputing code
symtab.c     symbol table functions
list.c            list
construction functions: car, cdr, cons, list.
interp.c        the s-code interpreter
and run-time data structure
How to compile
Som-system
Include all the above files in the project.  It has been tested
with lcc compiler under lcc-win32 IDE.   There are four
sub-directories:
doc        documents
lex          tokeniser generator
parser     parser generator
test         examples and executables
token.c, token.h    are generated by lexgen in "lex"
directory.  lexgen takes a text file that specifies lexical to
token-name binding, such as  "* tkSTAR"  and produces a
lexical analyser (token.c) that recognised them.  
    lexgen <
tok-som.txt > token.c     (token.h is
implicit)
parse.c, parse.h   are generated by pgen in "parser"
directory.  pgen takes a text file that specifies LL(1) grammar of
Som-language, such as,
    top -> tkTO
fundef | ex #
    ex1
->  tkIF ex0 ex exelse $doif(); | ...
and produces a parser.  The action routines in the grammar such as
"$doif();" are the C functions reside in the "stmt.c" file.  pgen
takes "parse.txt" and produces a C parser,
    pgen <
parse.txt > parse.c      (parse.h is
implicit)
It is not necessary to regenerate token.c  and parse.c 
except when you want to change the lexicon and the grammar to modify
Som-language for your application.
Examples in "test"
directory
bubble.txt        bubble sort 
20..1  to 1..20
array.txt           fill in an array
0..9 and print it
hanoi.txt           solve tower
of hanoi for 3 disks
matmul.txt        multiply two 4 by 4
matrices
perm.txt          permute the number
0,1,2,3
queen.txt         solve all solutions (92
boards) of 8-queen
quick.txt         quick sort 20..1 to
1..20
sieve.txt           find all prime
numbers less than 1000 (168 primes)
Two files "bubble.lst" and "bubble.obj"  show the listing file and
the object file (which can be converted to a target machine code). 
Sample session
Som can be used in 3 modes:  interactive, batch (produce listing
and object files), and mixed.  When start the system loads
"lib.a1" which contain very small set of useful functions: print,
printc, space, nl, loadfile
interactive
This mode is suitable to try out a program.
C:som-v1\test>som
>print 2 + 3 nl
5
>to sq x = x * x
>print sq 5 nl
25
>
to define a function, the whole function must be completed in one line.
batch mode
This mode is used to run a program.  It will produce a listing
file and an object file.
C:som-v1\test>som
bubble.txt
20 19 18 17 16 15 14 13 12 11 10
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20
C:som-v1\test>
It will produce "bubble.lst" and "bubble.obj".
mixed mode  
This mode is used to debug a program.  It will execute the program
immediately (not producing any output file) and start the interactive
mode.  A user can interrogate global variables and executes all
functions in the program.
C:som-v1\test>som
-i bubble.txt
20 19 18 17 16 15 14 13 12 11 10
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20
>print data[2] nl
3
>
To show a help message:
C:som-v1\test>som
-?
som         
for
interactive mode
som file    
for batch mode, output .lst and .obj
som -i file  for load file
and then interact
som
-?       for this help
C:som-v1\test>
5 December 2004
Long live King Bhumipol
P. Chongstitvatana