14479Sbinkertn@umich.edu# An implementation of Dartmouth BASIC (1964)
24479Sbinkertn@umich.edu
34479Sbinkertn@umich.edufrom ply import *
44479Sbinkertn@umich.edu
54479Sbinkertn@umich.edukeywords = (
64479Sbinkertn@umich.edu    'LET','READ','DATA','PRINT','GOTO','IF','THEN','FOR','NEXT','TO','STEP',
74479Sbinkertn@umich.edu    'END','STOP','DEF','GOSUB','DIM','REM','RETURN','RUN','LIST','NEW',
84479Sbinkertn@umich.edu)
94479Sbinkertn@umich.edu
104479Sbinkertn@umich.edutokens = keywords + (
114479Sbinkertn@umich.edu     'EQUALS','PLUS','MINUS','TIMES','DIVIDE','POWER',
124479Sbinkertn@umich.edu     'LPAREN','RPAREN','LT','LE','GT','GE','NE',
134479Sbinkertn@umich.edu     'COMMA','SEMI', 'INTEGER','FLOAT', 'STRING',
144479Sbinkertn@umich.edu     'ID','NEWLINE'
154479Sbinkertn@umich.edu)
164479Sbinkertn@umich.edu
174479Sbinkertn@umich.edut_ignore = ' \t'
184479Sbinkertn@umich.edu
194479Sbinkertn@umich.edudef t_REM(t):
204479Sbinkertn@umich.edu    r'REM .*'
214479Sbinkertn@umich.edu    return t
224479Sbinkertn@umich.edu
234479Sbinkertn@umich.edudef t_ID(t):
244479Sbinkertn@umich.edu    r'[A-Z][A-Z0-9]*'
254479Sbinkertn@umich.edu    if t.value in keywords:
264479Sbinkertn@umich.edu        t.type = t.value
274479Sbinkertn@umich.edu    return t
286498Snate@binkert.org
294479Sbinkertn@umich.edut_EQUALS  = r'='
304479Sbinkertn@umich.edut_PLUS    = r'\+'
314479Sbinkertn@umich.edut_MINUS   = r'-'
324479Sbinkertn@umich.edut_TIMES   = r'\*'
334479Sbinkertn@umich.edut_POWER   = r'\^'
344479Sbinkertn@umich.edut_DIVIDE  = r'/'
354479Sbinkertn@umich.edut_LPAREN  = r'\('
364479Sbinkertn@umich.edut_RPAREN  = r'\)'
374479Sbinkertn@umich.edut_LT      = r'<'
384479Sbinkertn@umich.edut_LE      = r'<='
394479Sbinkertn@umich.edut_GT      = r'>'
404479Sbinkertn@umich.edut_GE      = r'>='
414479Sbinkertn@umich.edut_NE      = r'<>'
424479Sbinkertn@umich.edut_COMMA   = r'\,'
434479Sbinkertn@umich.edut_SEMI    = r';'
446498Snate@binkert.orgt_INTEGER = r'\d+'
454479Sbinkertn@umich.edut_FLOAT   = r'((\d*\.\d+)(E[\+-]?\d+)?|([1-9]\d*E[\+-]?\d+))'
464479Sbinkertn@umich.edut_STRING  = r'\".*?\"'
474479Sbinkertn@umich.edu
484479Sbinkertn@umich.edudef t_NEWLINE(t):
494479Sbinkertn@umich.edu    r'\n'
504479Sbinkertn@umich.edu    t.lexer.lineno += 1
514479Sbinkertn@umich.edu    return t
524479Sbinkertn@umich.edu
534479Sbinkertn@umich.edudef t_error(t):
546498Snate@binkert.org    print("Illegal character %s" % t.value[0])
554479Sbinkertn@umich.edu    t.lexer.skip(1)
564479Sbinkertn@umich.edu
576498Snate@binkert.orglex.lex(debug=0)
584479Sbinkertn@umich.edu
594479Sbinkertn@umich.edu
604479Sbinkertn@umich.edu
614479Sbinkertn@umich.edu
624479Sbinkertn@umich.edu
634479Sbinkertn@umich.edu
644479Sbinkertn@umich.edu
656498Snate@binkert.org
666498Snate@binkert.org
676498Snate@binkert.org
686498Snate@binkert.org
694479Sbinkertn@umich.edu
704479Sbinkertn@umich.edu
714479Sbinkertn@umich.edu
724479Sbinkertn@umich.edu
734479Sbinkertn@umich.edu
744479Sbinkertn@umich.edu
75