| 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 |
| |
| |
| |
| |
| |
| |