Last active
March 25, 2017 10:18
-
-
Save ponyatov/4cc85a3a38e7e512b4e72f9996b210ea to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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): | |
# 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