Guest User

Untitled

a guest
Apr 18th, 2011
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. from lepl import *
  2. from operator import add, sub, mul, truediv
  3.  
  4. # ast nodes
  5. class Op(List):
  6. def __float__(self):
  7. return self._op(float(self[0]), float(self[1]))
  8.  
  9. class Add(Op): _op = add
  10.  
  11. class Sub(Op): _op = sub
  12.  
  13. class Mul(Op): _op = mul
  14.  
  15. class Div(Op): _op = truediv
  16.  
  17. class Assign(List):
  18. pass
  19.  
  20. class Eq(List):
  21. pass
  22.  
  23. class NEq(List):
  24. pass
  25.  
  26. class cGE(List):pass
  27. class cGT(List):pass
  28. class cLT(List):pass
  29. class cLE(List):pass
  30. class AND(List):pass
  31. class OR(List):pass
  32.  
  33. # tokens
  34. value = Token(UnsignedReal())
  35. symbol = Token('[^0-9a-zA-Z \t\r\n]')
  36.  
  37. number = Optional(symbol('-')) + value >> float
  38. group2, group3 = Delayed(), Delayed()
  39.  
  40. # first layer, most tightly grouped, is parens and numbers
  41. parens = ~symbol('(') & group3 & ~symbol(')')
  42. group1 = parens | number
  43.  
  44. # second layer, next most tightly grouped, is multiplication
  45. mul_ = group1 & ~symbol('*') & group2 > Mul
  46. div_ = group1 & ~symbol('/') & group2 > Div
  47. group2 += mul_ | div_ | group1
  48.  
  49. # third layer, least tightly grouped, is addition
  50. add_ = group2 & ~symbol('+') & group3 > Add
  51. sub_ = group2 & ~symbol('-') & group3 > Sub
  52. group3 += add_ | sub_ | group2
  53.  
  54. #comparison symbols
  55. NEQ=symbol("!") & symbol("=")
  56. EQ= symbol("=") & symbol("=")
  57. GT= symbol(">")
  58. GE= symbol(">") & symbol("=")
  59. LT= symbol("<")
  60. LE= symbol("<") & symbol("&")
  61.  
  62. #syntactical symbols
  63. lparens = symbol('(')
  64. rparens = symbol(')')
  65. ifsym = symbol('~')
  66. lcurly = symbol('{')
  67. rcurly = symbol('}')
  68.  
  69.  
  70. #more syntax symbols
  71. SPACES = ~Star(Space())
  72. identifier = Token("[a-zA-Z_]+") #>variable_control
  73. EOL = symbol(';')
  74.  
  75.  
  76. #handles argument, karg lists
  77. comma = ~symbol(',')
  78. none = Token('None') >> (lambda x: None)
  79. bool = (Token('T') | Token('F')) >> (lambda x: x == 'T')
  80. ident = Token("[a-zA-Z]+\|[a-zA-Z]+[0-9]")[:]
  81. allchars = Token(r"[a-zA-Z0-9]")[:]#\.,<>/\?;:'\]\[\{\}\|=\+-\(\)\*&\^%\$#@!~\\t\\r\\n ]")
  82.  
  83. str_ = symbol('"') & allchars & symbol('"') | symbol("'") & allchars & symbol("'") > str
  84. item = str_ | number | none | bool | ident
  85. #with Separator(~Regexp(r'\s*')):
  86. value2 = Delayed()
  87. list_ = ~symbol('[') & value2[:, comma] & ~symbol(']') > list
  88. tuple_ = ~symbol('(') & value2[:, comma] & ~symbol(')') > tuple
  89. value2 += list_ | tuple_ | item
  90. arg = value2 >> 'arg'
  91. #karg = ((ident & ~symbol('=') & value2) > tuple) >> 'karg'
  92. arg_expr = (arg)[:, comma] & ~symbol(Eos()) > Node
  93.  
  94.  
  95. #recursion needed
  96. expr = Delayed()
  97.  
  98. #boolean expressions
  99. bool_expr = Or(
  100. expr & ~symbol('&') & expr > AND,
  101. expr & ~symbol('?') & expr > OR
  102. )
  103.  
  104. #handles other compares
  105. ot_expr = Or(
  106. bool_expr,
  107. expr & ~GT & expr > cGT,
  108. expr & ~GE & expr > cGE,
  109. expr & ~LT & expr > cLT,
  110. expr & ~LE & expr > cLE
  111. )
  112. #handles equality expressions
  113. eq_expr = Or(
  114. ot_expr,
  115. expr & ~EQ & expr > Eq,
  116. expr & ~NEQ & expr > NEq
  117. )
  118.  
  119. #renames all the sub_expr types to be cond
  120. cond = eq_expr
  121.  
  122. #function calls: func(a, b=10)
  123. funccall = ident & ~lparens / arg_expr / ~rparens
  124.  
  125. #finally define expr
  126. expr += number | identifier | str_ | funccall | group3 | eq_expr
  127.  
  128. #assignment statement
  129. assgn_stmt = identifier & ~symbol('=') & expr & ~EOL > Assign
  130.  
  131.  
  132. stmt = assgn_stmt
  133.  
  134. ##########################################
  135. #test code
  136. ##########################################
  137. #ast = group3.parse('1+2*(3-4)+5/6+7')[0]
  138. #print(ast)
  139. #stmt.config.auto_memoize()
  140. #ast= stmt.parse("a=1+2*(3-4)+5/6+7;")[0]
  141. #print(ast)
  142. #ast = stmt.parse("a=b<10;")[0]
  143. #print(ast)
  144. arg_expr.config.no_full_first_match()
  145.  
  146. ast = arg_expr.parse_all("1,2")
  147. print(list(ast))
  148. for i in ast:
  149. print i
Advertisement
Add Comment
Please, Sign In to add comment