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