README revision 4479
15081Sgblack@eecs.umich.eduInspired by a September 14, 2006 Salon article "Why Johnny Can't Code" by
25081Sgblack@eecs.umich.eduDavid Brin (http://www.salon.com/tech/feature/2006/09/14/basic/index.html),
35081Sgblack@eecs.umich.eduI thought that a fully working BASIC interpreter might be an interesting,
45081Sgblack@eecs.umich.eduif not questionable, PLY example.  Uh, okay, so maybe it's just a bad idea,
55081Sgblack@eecs.umich.edubut in any case, here it is.
65081Sgblack@eecs.umich.edu
75081Sgblack@eecs.umich.eduIn this example, you'll find a rough implementation of 1964 Dartmouth BASIC
85081Sgblack@eecs.umich.eduas described in the manual at:
95081Sgblack@eecs.umich.edu
105081Sgblack@eecs.umich.edu   http://www.bitsavers.org/pdf/dartmouth/BASIC_Oct64.pdf
115081Sgblack@eecs.umich.edu
125081Sgblack@eecs.umich.eduSee also:
135081Sgblack@eecs.umich.edu
145081Sgblack@eecs.umich.edu  http://en.wikipedia.org/wiki/Dartmouth_BASIC
155081Sgblack@eecs.umich.edu
165081Sgblack@eecs.umich.eduThis dialect is downright primitive---there are no string variables
175081Sgblack@eecs.umich.eduand no facilities for interactive input. Moreover, subroutines and functions
185081Sgblack@eecs.umich.eduare brain-dead even more than they usually are for BASIC. Of course,
195081Sgblack@eecs.umich.eduthe GOTO statement is provided.
205081Sgblack@eecs.umich.edu
215081Sgblack@eecs.umich.eduNevertheless, there are a few interesting aspects of this example:
225081Sgblack@eecs.umich.edu
235081Sgblack@eecs.umich.edu  - It illustrates a fully working interpreter including lexing, parsing,
245081Sgblack@eecs.umich.edu    and interpretation of instructions.
255081Sgblack@eecs.umich.edu 
265081Sgblack@eecs.umich.edu  - The parser shows how to catch and report various kinds of parsing
275081Sgblack@eecs.umich.edu    errors in a more graceful way.
285081Sgblack@eecs.umich.edu
295081Sgblack@eecs.umich.edu  - The example both parses files (supplied on command line) and
305081Sgblack@eecs.umich.edu    interactive input entered line by line.
315081Sgblack@eecs.umich.edu
325081Sgblack@eecs.umich.edu  - It shows how you might represent parsed information.  In this case,
335081Sgblack@eecs.umich.edu    each BASIC statement is encoded into a Python tuple containing the
345081Sgblack@eecs.umich.edu    statement type and parameters.  These tuples are then stored in
355081Sgblack@eecs.umich.edu    a dictionary indexed by program line numbers.
365081Sgblack@eecs.umich.edu
375081Sgblack@eecs.umich.edu  - Even though it's just BASIC, the parser contains more than 80
385081Sgblack@eecs.umich.edu    rules and 150 parsing states. Thus, it's a little more meaty than
395081Sgblack@eecs.umich.edu    the calculator example.
405081Sgblack@eecs.umich.edu
415081Sgblack@eecs.umich.eduTo use the example, run it as follows:
425081Sgblack@eecs.umich.edu
435081Sgblack@eecs.umich.edu   % python basic.py hello.bas
445081Sgblack@eecs.umich.edu   HELLO WORLD
455081Sgblack@eecs.umich.edu   %
465081Sgblack@eecs.umich.edu
475081Sgblack@eecs.umich.eduor use it interactively:
485081Sgblack@eecs.umich.edu
495081Sgblack@eecs.umich.edu   % python basic.py
505081Sgblack@eecs.umich.edu   [BASIC] 10 PRINT "HELLO WORLD"
515081Sgblack@eecs.umich.edu   [BASIC] 20 END
525081Sgblack@eecs.umich.edu   [BASIC] RUN
535081Sgblack@eecs.umich.edu   HELLO WORLD
545081Sgblack@eecs.umich.edu   [BASIC]
555081Sgblack@eecs.umich.edu
565081Sgblack@eecs.umich.eduThe following files are defined:
576557Sgblack@eecs.umich.edu
586557Sgblack@eecs.umich.edu   basic.py         - High level script that controls everything
596557Sgblack@eecs.umich.edu   basiclex.py      - BASIC tokenizer
606557Sgblack@eecs.umich.edu   basparse.py      - BASIC parser
616557Sgblack@eecs.umich.edu   basinterp.py     - BASIC interpreter that runs parsed programs.
626557Sgblack@eecs.umich.edu
636557Sgblack@eecs.umich.eduIn addition, a number of sample BASIC programs (.bas suffix) are
646557Sgblack@eecs.umich.eduprovided.  These were taken out of the Dartmouth manual.
656557Sgblack@eecs.umich.edu
666557Sgblack@eecs.umich.eduDisclaimer: I haven't spent a ton of time testing this and it's likely that
676557Sgblack@eecs.umich.eduI've skimped here and there on a few finer details (e.g., strictly enforcing
686557Sgblack@eecs.umich.eduvariable naming rules).  However, the interpreter seems to be able to run
696557Sgblack@eecs.umich.eduthe examples in the BASIC manual.
706557Sgblack@eecs.umich.edu
715081Sgblack@eecs.umich.eduHave fun!
726518Sgblack@eecs.umich.edu
736557Sgblack@eecs.umich.edu-Dave
745081Sgblack@eecs.umich.edu
755081Sgblack@eecs.umich.edu
766518Sgblack@eecs.umich.edu
776519Sgblack@eecs.umich.edu
786557Sgblack@eecs.umich.edu
795081Sgblack@eecs.umich.edu
805081Sgblack@eecs.umich.edu