Skip to content

Instantly share code, notes, and snippets.

@ponyatov
Last active March 25, 2017 10:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ponyatov/4cc85a3a38e7e512b4e72f9996b210ea to your computer and use it in GitHub Desktop.
Save ponyatov/4cc85a3a38e7e512b4e72f9996b210ea to your computer and use it in GitHub Desktop.
; Token('SYM', 'nop')
; Token('SYM', 'nop')
04 01 ; Token('DOT', '.')
02 1 ; Token('NUM', '1')
02 2 ; Token('NUM', '2')
02 3 ; Token('NUM', '3')
07 ; Token('MUL', '*')
05 ; Token('ADD', '+')
04 01 ; Token('DOT', '.')
00 ; Token('SYM', 'bye')
# for https://www.youtube.com/watch?v=v6y-57zw3zg
src = '''
nop
nop
.
1 + 2 * 3
.
bye
'''
D = [] # data stack
R = [] # return stack
# parser for RPython/Rply @ https://rply.readthedocs.io/en/latest/
from rply import LexerGenerator
lg = LexerGenerator()
lg.add('NUM','[0-9]+')
lg.add('DOT','\.')
lg.add('ADD','\+')
lg.add('MUL','\*')
lg.add('SYM','[a-zA-Z0-9_\.]+')
lg.ignore('\s+')
lexer = lg.build()
from rply import ParserGenerator
pg = ParserGenerator(['SYM','NUM','DOT','ADD','MUL'],
precedence=(('left',['ADD']),('left',['MUL']),))
@pg.production(' REPL : ')
def p_REPL(p): pass
@pg.production(' REPL : REPL ex ')
def p_REPL_recur(p): print p[1]
@pg.production(' ex : SYM ')
def ex_SYM(p):
cmd = {'nop':'','bye':'00'}
return '%s\t; %s\n'%(cmd[p[0].value],p[0])
@pg.production(' ex : NUM ')
def ex_NUM(p): return '02 %s\t; %s\n'%(p[0].value,p[0])
@pg.production(' ex : DOT ')
def ex_DOT(p): return '04 01\t; %s\n'%(p[0])
@pg.production(' ex : ex ADD ex ')
def ex_ADD(p): return p[0]+p[2]+'05\t; %s\n'%p[1]
@pg.production(' ex : ex MUL ex ')
def ex_MUL(p): return p[0]+p[2]+'07\t; %s\n'%p[1]
@pg.error
def p_error(p): raise BaseException('error %s'%p)
parser = pg.build()
def main(argv):
print
# for i in parser.parse(lexer.lex(src)): print i
parser.parse(lexer.lex(src))
return 0
def target(*args): return main,None
import sys
if __name__ == '__main__':
main(sys.argv)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment