Skip to content

Instantly share code, notes, and snippets.

@dtlanghoff
Last active December 31, 2015 23:59
Show Gist options
  • Save dtlanghoff/8063645 to your computer and use it in GitHub Desktop.
Save dtlanghoff/8063645 to your computer and use it in GitHub Desktop.
-++/|+(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>>
#!/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