Inspired by a September
14,
2006 Salon article
"Why Johnny Can't Code" by
David Brin (
http://www.salon.com/tech/feature/2006/
09/
14/basic/index.html),
I thought that a fully working BASIC interpreter might be an interesting,
if not questionable, PLY example. Uh, okay, so maybe it
's just a bad idea,
but
in any case, here it
is.
In this example, you
'll find a rough implementation of 1964 Dartmouth BASIC
as described
in the manual at:
http://www.bitsavers.org/pdf/dartmouth/BASIC_Oct64.pdf
See also:
http://en.wikipedia.org/wiki/Dartmouth_BASIC
This dialect
is downright primitive---there are no string variables
and no facilities
for interactive input. Moreover, subroutines
and functions
are brain-dead even more than they usually are
for BASIC. Of course,
the GOTO statement
is provided.
Nevertheless, there are a few interesting aspects of this example:
- It illustrates a fully working interpreter including lexing, parsing,
and interpretation of instructions.
- The parser shows how to catch
and report various kinds of parsing
errors
in a more graceful way.
- The example both parses files (supplied on command line)
and
interactive input entered line by line.
- It shows how you might represent parsed information.
In this case,
each BASIC statement
is encoded into a Python tuple containing the
statement type
and parameters. These tuples are then stored
in
a dictionary indexed by program line numbers.
- Even though it
's just BASIC, the parser contains more than 80
rules
and 150 parsing states. Thus, it
's a little more meaty than
the calculator example.
To use the example, run it
as follows:
% python basic.py hello.bas
HELLO WORLD
%
or use it interactively:
% python basic.py
[BASIC]
10 PRINT
"HELLO WORLD"
[BASIC]
20 END
[BASIC] RUN
HELLO WORLD
[BASIC]
The following files are defined:
basic.py - High level script that controls everything
basiclex.py - BASIC tokenizer
basparse.py - BASIC parser
basinterp.py - BASIC interpreter that runs parsed programs.
In addition, a number of sample BASIC programs (.bas suffix) are
provided. These were taken out of the Dartmouth manual.
Disclaimer: I haven
't spent a ton of time testing this and it's likely that
I
've skimped here and there on a few finer details (e.g., strictly enforcing
variable naming rules). However, the interpreter seems to be able to run
the examples
in the BASIC manual.
Have fun!
-Dave