Guest User

Untitled

a guest
Jul 16th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.34 KB | None | 0 0
  1. #! /usr/bin/env python26
  2. # coding: utf-8
  3. class SSexpr:
  4.     """
  5.        A Simple Simplified Sexprs Reader.
  6.    Author
  7.        ee.zsy
  8.    Date
  9.        Mar, 2012
  10.    Type
  11.        type SSexpr = Symbol of string | Block of SSexpr list ;
  12.        function parse : string - > SSexpr .
  13.    Syntax
  14.        SSexpr -> {' '} + Symbol | String | Block + {' '};
  15.        Block  -> '(' + {SSexpr} + ')' .
  16.    Usage    
  17.        >>> parse(r'(1 2 "3\" 4"( 1 2 3))')
  18.        ['1', '2', '3" 4', ['1', '2', '3']]
  19.    Implementation
  20.        Notice that Python evaluates expressions from left to right.
  21.    """
  22.     ############ Interface #############
  23.     def read(s):
  24.         try:return s.exp()
  25.         except RuntimeError as e:raise SyntaxError(e)
  26.     @classmethod
  27.     def parse(c,code):
  28.         return c(code).read()
  29.     ######### Implementation ###########
  30.     w = " \n\t"
  31.     e = " \n\t,()[]"
  32.     b = (lambda i:lambda s,x:i(x).pop())(set(')]').difference)
  33.     m = 'Brackets or Parentheses do not match.'
  34.     a = dict(zip('\"\'nt\\','\"\'\n\t\\'))
  35.     f = 'Escape character is not recognized.'
  36.     def __init__(s,code):
  37.         s.s, s.p, s.d = code, 0 ,0
  38.     def c(s):
  39.         x, s.d = s.d, 0; return x
  40.     def r(s,t):
  41.         s.d = 1;return t
  42.     def peek(s):
  43.         return s.s[s.p] if s.p<len(s.s) else None
  44.     def eat(s):
  45.         s.p += 1; return s.s[s.p-1]
  46.     def exp(s):
  47.         c = s.peek()
  48.         if c is None:return None  
  49.         elif c in s.w:return s.eat() and s.exp()
  50.         elif c == '(':return s.eat() and s.blk(')')
  51.         elif c == '[':return s.eat() and s.blk(']')
  52.         elif c == '"':return s.eat() and s.str()
  53.         elif c == ',':return s.eat() and [str,s.exp][s.c()]()
  54.         else:return s.sym()
  55.     def sym(s):
  56.         c = s.peek()
  57.         if c is None or c in s.e:return s.r('')
  58.         else:return s.eat() and c+s.sym()
  59.     def str(s):
  60.         c = s.peek()
  61.         if c is None:raise EOFError
  62.         elif c =='\\':return s.eat() and s.esc(s.eat())+s.str()
  63.         elif c == '"':return s.eat() and s.r('')
  64.         else:return s.eat() and c+s.str()
  65.     def esc(s,c):
  66.         if c in s.a:return s.a[c]
  67.         else:raise SyntaxError(s.f)
  68.     def blk(s,end):
  69.         c = s.peek()
  70.         if c is None:raise EOFError
  71.         elif c == s.b(end):raise SyntaxError(s.m)
  72.         elif c in s.w:return s.eat() and s.blk(end)
  73.         elif c == end:return s.eat() and s.r(tuple())
  74.         elif c == ',' and s.c():return s.eat() and s.blk(end)
  75.         else:return tuple([s.exp()])+s.blk(end)
  76.        
  77. if 1:
  78.     assert SSexpr("""123 12""").read() == '123'
  79.     assert SSexpr("""(1 2 3 4(1 2 3))""").read() == ('1', '2', '3', '4', ('1', '2', '3'))
  80.     assert SSexpr("""(1 2 "3 4"( 1 2 3))""").read() == ('1', '2', '3 4', ('1', '2', '3'))
  81.     assert SSexpr.parse(r"""(1 2 "3\" 4"( 1 2 3))""") == ('1', '2', '3" 4', ('1', '2', '3'))
  82.     assert SSexpr.parse(r"""[]""") == tuple()
  83.     assert SSexpr.parse(r"""[,]""") == ('',)
  84.     assert SSexpr.parse(r"""[1,2,]""") == ('1', '2')
  85.     assert SSexpr.parse(r"""[,1,2]""") == ('', '1', '2')
  86.     assert SSexpr.parse(r"""[,,1,2]""") == ('', '', '1', '2')
  87.     assert SSexpr.parse(r"""[1,2,,]""") == ('1', '2', '')
  88.  
  89. if __name__ == '__main__':
  90.     print SSexpr("""(hello world)""").read()
  91.     print SSexpr("""[hello,world]""").read()
  92.     while 1:
  93.         print SSexpr(raw_input()).read()
Add Comment
Please, Sign In to add comment