Last active
December 31, 2015 23:59
-
-
Save dtlanghoff/8063645 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
-++/|+(5)++(3)(1)(1)<x+(2)x>$->#(2)<x(1)>s(1)<i+si>+||#(5)<x->x<y+$xz(100)<k-zk>y>><x$xa(0)<b+ab>>|-$->#(10)<x#x>x(0)<y+x$yz(0)<y+yz>>$->->#(30)<x+x(1)><x%$->#(10)<a*a$=?->#<F?=F*(2)(4)<B*+FBB>[-(20)(15)](100000)>[|->#||(1)<x+(1)x><x+(1)x><x|(1)<x+(1)x>><r$rp(0)<q+pq>>]<i+(100)i><x>x(100)>A(0)<I+AI>>M(1)<b+Mb>x>C(0)<m+mC><x*(113)x>|||*|||(1)<x(1)><x+|(1)<x(1)>x><x*||(1)<x(1)><x+|(1)<x(1)>x>x>|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x><x+|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x>x><x+|*|||(1)<x(1)><x+|(1)<x(1)>x><x*||(1)<x(1)><x+|(1)<x(1)>x>x>|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x><x+|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x>x>x><x+||*|||(1)<x(1)><x+|(1)<x(1)>x><x*||(1)<x(1)><x+|(1)<x(1)>x>x>|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x><x+|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x>x><x+|*|||(1)<x(1)><x+|(1)<x(1)>x><x*||(1)<x(1)><x+|(1)<x(1)>x>x>|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x><x+|||(1)<x(1)><x+|(1)<x(1)>x><x+||(1)<x(1)><x+||(1)<x(1)><x+|(1)<x(1)>x>x>x>x>x>x>||#(80)<r=?r<e>e(80)>><s$sA(0)<i+ai>> |
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
#!/usr/bin/env python | |
import sys | |
tokens = ('INTEGER', 'NAME', 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', 'LT', 'GT', 'EQ', 'HASH', 'QUESTION', 'LBRACE', 'RBRACE', 'PIPE', 'DOLLAR', 'LPAREN', 'RPAREN') | |
t_INTEGER = r'(0|[1-9][0-9]*)' | |
t_NAME = r'[A-Za-z]' | |
t_PLUS = r'\+' | |
t_MINUS = r'-' | |
t_TIMES = r'\*' | |
t_DIVIDE = r'/' | |
t_MOD = r'%' | |
t_LT = r'<' | |
t_GT = r'>' | |
t_EQ = r'=' | |
t_HASH = r'\#' | |
t_QUESTION = r'\?' | |
t_LBRACE = r'\[' | |
t_RBRACE = r'\]' | |
t_PIPE = r'\|' | |
t_DOLLAR = r'\$' | |
t_LPAREN = r'\(' | |
t_RPAREN = r'\)' | |
t_ignore = '\n ' | |
def t_error(t): | |
sys.stderr.write('Illegal character \'%s\' at %s\n' % (t.value[0], t.lexpos)) | |
t.lexer.skip(1) | |
import ply.lex as lex | |
lex.lex() | |
def p_expression_binop(p): | |
'expression : binop expression expression' | |
op = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div', '%': 'mod'} | |
p[0] = '%s(%s, %s)' % (op[p[1]], p[2], p[3]) | |
def p_binop(p): | |
'''binop : PLUS | |
| MINUS | |
| TIMES | |
| DIVIDE | |
| MOD''' | |
p[0] = p[1] | |
def p_boolean(p): | |
'''boolean : GT expression expression | |
| EQ expression expression''' | |
if p[1] == '>': p[0] = 'gt(%s, %s)' % (p[2], p[3]) | |
if p[1] == '=': p[0] = 'eq(%s, %s)' % (p[2], p[3]) | |
def p_expression_boolean(p): | |
'expression : boolean' | |
p[0] = p[1] | |
def p_expression_range(p): | |
'expression : HASH expression' | |
p[0] = 'xrange((%s) + 1)' % p[2] | |
def p_expression_integer(p): | |
'expression : LPAREN INTEGER RPAREN' | |
p[0] = p[2] | |
def p_expression_name(p): | |
'expression : NAME' | |
p[0] = p[1] | |
def p_expression_flow(p): | |
'expression : QUESTION boolean expression expression' | |
p[0] = '(%s) if (%s) else (%s)' % (p[3], p[2], p[4]) | |
def p_function(p): | |
'function : LT NAME expression GT' | |
p[0] = '(lambda %s: %s)' % (p[2], p[3]) | |
def p_expression_application(p): | |
'expression : function LBRACE expression RBRACE' | |
p[0] = '%s(%s)' % (p[1], p[3]) | |
def p_expression_pipe(p): | |
'expression : PIPE expression function' | |
p[0] = '%s(%s)' % (p[3], p[2]) | |
def p_expression_map(p): | |
'expression : MINUS GT expression function' | |
p[0] = 'map(%s, %s)' % (p[4], p[3]) | |
def p_expression_filter(p): | |
'expression : EQ QUESTION expression function' | |
p[0] = 'filter(%s, %s)' % (p[4], p[3]) | |
def p_expression_reduce(p): | |
'expression : DOLLAR expression NAME expression function' | |
l, acc, v, f = p[2:6] | |
p[0] = 'reduce(lambda %s, %s, %s, %s)' % (acc, f[7:-1], l, v) | |
def p_error(p): | |
if p: | |
sys.stderr.write('Syntax error: %s\n' % p) | |
else: | |
sys.stderr.write('Syntax error at EOF\n') | |
import ply.yacc as yacc | |
yacc.yacc() | |
with open(sys.argv[1]) as f: | |
program = f.read() | |
print('#!/usr/bin/env python\n\nfrom operator import add, sub, mul, div, mod, eq, gt\n\nprint %s' % yacc.parse(program)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment