Advertisement
Hppavilion1

PLY issue

Dec 28th, 2015
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.56 KB | None | 0 0
  1. import ply.yacc as yacc
  2. from lex_rule import tokens
  3.  
  4. from rule_AST import *
  5.  
  6.  
  7. precedence = [
  8.     ('left', 'IMPLIES'),
  9.     ('left', 'XOR', 'XNOR'),
  10.     ('left', 'OR', 'NOR'),
  11.     ('left', 'AND', 'NAND'),
  12.     ('nonassoc', 'IN', 'NIN', 'CONTAINS', 'NCONTAINS', 'SUBSET', 'SUPSET', 'NSUBS', 'NSUPS', 'SSUBS', 'SSUPS', 'NSSUBS',
  13.      'NSSUPS'),
  14.     ('nonassoc', 'EQ', 'NEQ', 'GT', 'LT', 'GTE', 'LTE'),
  15.     ('left', 'UNION', 'INTERSECTION', 'SETSDIFF', 'SETDIFF'),
  16.     ('left', 'PLUS', 'MINUS', 'PLUSMINUS'),
  17.     ('left', 'MUL', 'DIV', 'MOD'),
  18.     ('right', 'NOT'),
  19.     # ('left', 'CONJ'),
  20.     ('right', 'UPLUS', 'UMINUS', 'UPM'),
  21.     ('right', 'EXP'),
  22.     ('left', 'IMAG', 'COIMAG', 'DUAL'),
  23.     ('left', 'INDEX'),
  24.     ('left', 'FUNC')
  25. ]
  26.  
  27.  
  28. def p_op_binop(p):
  29.     """op : expression PLUS expression
  30.          | expression MINUS expression
  31.          | expression PLUSMINUS expression
  32.          | expression MUL expression
  33.          | expression DIV expression
  34.          | expression MOD expression
  35.          | expression EXP expression
  36.          | expression EQ expression
  37.          | expression NEQ expression
  38.          | expression GT expression
  39.          | expression LT expression
  40.          | expression GTE expression
  41.          | expression LTE expression
  42.          | expression AND expression
  43.          | expression OR expression
  44.          | expression XOR expression
  45.          | expression NAND expression
  46.          | expression NOR expression
  47.          | expression XNOR expression
  48.          | expression IMPLIES expression
  49.          | expression UNION expression
  50.          | expression INTERSECTION expression
  51.          | expression SETSDIFF expression
  52.          | expression SETDIFF expression
  53.          | expression IN expression
  54.          | expression CONTAINS expression
  55.          | expression SUBSET expression
  56.          | expression SUPSET expression
  57.          | expression FUNC expression
  58.          """
  59.  
  60.     p[0] = BinOp_In_Exp(p[2], p[1], p[3])
  61.  
  62.  
  63. def p_op_notmember(p):
  64.     """op : expression SET_NOT IN expression %prec NIN
  65.          | expression SET_NOT CONTAINS expression %prec NCONTAINS"""
  66.  
  67.     p[0] = BinOp_In_Exp('not '+p[3], p[1], p[4])
  68.  
  69.  
  70. def p_op_notset(p):
  71.     """op : expression SET_NOT SUBSET expression %prec NSUBS
  72.          | expression SET_NOT SUPSET expression %prec NSUPS"""
  73.  
  74.     p[0] = BinOp_In_Exp('not '+p[3], p[1], p[4])
  75.  
  76.  
  77. def p_op_strictset(p):
  78.     """op : expression STRICT SUBSET expression %prec SSUBS
  79.          | expression STRICT SUPSET expression %prec SSUPS"""
  80.  
  81.     p[0] = BinOp_In_Exp('strict '+p[3], p[1], p[4])
  82.  
  83.  
  84. def p_op_notstrictset(p):
  85.     """op : expression SET_NOT STRICT SUBSET expression %prec NSSUBS
  86.          | expression SET_NOT STRICT SUPSET expression %prec NSSUPS"""
  87.  
  88.     p[0] = BinOp_In_Exp('not strict '+p[4], p[1], p[5])
  89.  
  90.  
  91. def p_op_binop_postcircum(p):
  92.     """op : expression OBRACK expression CBRACK %prec INDEX"""
  93.  
  94.     p[0] = BinOp_PostCircum_Exp(p[2], p[4], p[1], p[3])
  95.  
  96.  
  97. def p_op_unop_pre(p):
  98.     """op : MINUS expression %prec UMINUS
  99.          | PLUS expression %prec UPLUS
  100.          | PLUSMINUS expression %prec UPM
  101.          | NOT expression"""
  102.  
  103.     p[0] = UnOp_Pre_Exp(p[1], p[2])
  104.  
  105.  
  106. def p_op_unop_post(p):
  107.     """op : expression IMAG
  108.          | expression COIMAG
  109.          | expression DUAL"""
  110.           # | expression MUL %prec CONJ"""
  111.  
  112.     p[0] = UnOp_Post_Exp(p[2], p[1])
  113.  
  114.  
  115. def p_list_start(p):
  116.     """list : expression SEP"""
  117.  
  118.     p[0] = [p[1]]
  119.  
  120.  
  121. def p_list_concat(p):
  122.     """list : list expression SEP"""
  123.  
  124.     p[0] = p[1]+[p[2]]
  125.  
  126.  
  127. def p_list_end(p):
  128.     """list : list expression"""
  129.  
  130.     p[0] = p[1]+[p[2]]
  131.  
  132.  
  133. def p_apply(p):
  134.     """apply : scalar OPAREN expression CPAREN
  135.             | scalar OPAREN list CPAREN
  136.             | expression OPAREN expression CPAREN
  137.             | expression OPAREN list CPAREN"""
  138.  
  139.     if type(p[3]) == list:
  140.         p[0] = ApplyExp(p[1], *p[3])
  141.     else:
  142.         p[0] = ApplyExp(p[1], p[3])
  143.  
  144.  
  145. def p_num(p):
  146.     """num : NUM"""
  147.     p[0] = NumExp(p[1])
  148.  
  149.  
  150. def p_string(p):
  151.     """string : STRING"""
  152.     p[0] = StringExp(p[1])
  153.  
  154.  
  155. def p_name(p):
  156.     """name : NAME"""
  157.     p[0] = NameExp(p[1])
  158.  
  159.  
  160. def p_scalar(p):
  161.     """scalar : num
  162.              | string
  163.              | name"""
  164.  
  165.     p[0] = p[1]
  166.  
  167.  
  168. def p_value_litset(p):
  169.     """value : OBRACE list CBRACE"""
  170.  
  171.     p[0] = LiteralSetExp({v for v in p[2]})
  172.  
  173.  
  174. def p_value_emptyset(p):
  175.     """value : OBRACE CBRACE"""
  176.  
  177.     p[0] = LiteralSetExp(set())
  178.  
  179.  
  180. def p_value_setbuild(p):
  181.     """value : OBRACE expression COLON name IN expression
  182.             | OBRACE expression COLON expression CONTAINS name"""
  183.  
  184.     if p[5] == 'in':
  185.         p[0] = BuildSetExp(p[2], p[4], p[6])
  186.  
  187.     elif p[5] == 'contains':
  188.         p[0] = BuildSetExp(p[2], p[6], p[4])
  189.  
  190.  
  191. def p_value_litlist(p):
  192.     """value : OBRACK list CBRACK"""
  193.  
  194.     p[0] = LiteralListExp(p[2])
  195.  
  196.  
  197. def p_value_emptylist(p):
  198.     """value : OBRACK CBRACK"""
  199.  
  200.     p[0] = LiteralListExp([])
  201.  
  202.  
  203. def p_group(p):
  204.     """group : OPAREN expression CPAREN"""
  205.  
  206.     p[0] = p[2]
  207.  
  208.  
  209. def p_expression_main(p):
  210.     """expression : scalar
  211.                  | group
  212.                  | op
  213.                  | apply
  214.                  | value"""
  215.  
  216.     p[0] = p[1]
  217.  
  218.  
  219. def p_error(p):  # Gets called with p=None
  220.     print('Syntax Error: '+repr(p))
  221.  
  222. parser = yacc.yacc(tabmodule='tm')
  223.  
  224. if __name__ == '__main__':
  225.     while True:
  226.         inp = input('Expression: ')  # I enter "[]"
  227.         if inp == '/EXIT':
  228.             break
  229.         else:
  230.             out = parser.parse(inp)
  231.             print(repr(out))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement