value = number | name | string makeop = lambda s, f: op(s) >> const(f) add = makeop('+', (ets.add, operator.add)) sub = makeop('-', (ets.sub, operator.sub)) mul = makeop('*', (ets.mul, operator.mul)) div = makeop('/', (ets.div, operator.div)) mul_op = mul | div add_op = add | sub args = fwd() factor = fwd() primary = value call = func + op_('(') + args + op_(')') >> exec_func term = factor + many(mul_op + factor ) >> eval expr = term + many(add_op + term ) >> eval top = expr + skip(eof) args.define( expr + many( op_(',') + expr ) ) factor.define( call | primary | op_('(') + expr + op_(')') ) name_parser_vars(locals()) def parse(seq): 'Sequence(Token) -> object'
return re_esc.sub(sub, s) def make_string(n): return unescape(n[1:-1]) # JSON Grammar null = n('null') >> const(None) true = n('true') >> const(True) false = n('false') >> const(False) number = sometok('number') >> make_number string = sometok('string') >> make_string value = fwd() member = string + op_(':') + value >> tuple object = (op_('{') + maybe(member + many(op_(',') + member)) + op_('}') >> make_object) array = ( op_('[') + maybe(value + many(op_(',') + value)) + op_(']') >> make_array) value.define(null | true | false | object | array | number | string) json_text = object | array json_file = json_text + skip(eof) name_parser_vars(locals()) def parse(seq): 'Sequence(Token) -> object' return json_file.parse(seq)
return PLObject(n) def make_name(n): assert len(n) == 2 return PLName(n[0], n[1]) def make_array(n): return PLArray(n) number = sometok('number') >> make_number string = sometok('string') >> make_string comment = sometok('comment') >> make_comment name = (sometok('name') | sometok('string')) + maybe(comment) >> make_name value = fwd() member = name + op_('=') + value >> make_member section = maybe(comment) + oneplus(member + op_(';')) + maybe(comment) >> make_section object = ( op_('{') + many(section) + op_('}')) >> make_object array = ( op_('(') + many(value + op_(',')) + op_(')')) >> make_array value.define( object | number | name | array) pbxproj_file = value + skip(eof)
return std[m.group('standard')] else: return unichr(int(m.group('unicode'), 16)) return re_esc.sub(sub, s) def make_string(n): return unescape(n[1:-1]) # JSON Grammar null = n('null') >> const(None) true = n('true') >> const(True) false = n('false') >> const(False) number = sometok('number') >> make_number string = sometok('string') >> make_string value = fwd() member = string + op_(':') + value >> tuple object = ( op_('{') + maybe(member + many(op_(',') + member)) + op_('}') >> make_object) array = ( op_('[') + maybe(value + many(op_(',') + value)) + op_(']') >> make_array) value.define( null | true | false | object
def pure_parse(seq): 'Sequence(Token) -> object' #http://pure-lang.googlecode.com/svn/docs/pure-syntax/pure-syntax.pdf&pli=1 # This is some beautiful code... whatever it's fast def make_number(n): if 'L' in n: return long(n) try: return int(n) except ValueError: return float(n) def make_array(n): if n is None: return [] else: return [n[0]] + n[1] def make_name(s): return s def make_funcapp(n): head, tail = n if len(tail) == 0: return head else: return (head, tail) number = sometok('number') >> make_number var = sometok('name') >> make_name atom = var | number pure = forward_decl() funcapp = forward_decl() array = forward_decl() expr = op_('(') + funcapp + op_(')') funcapp.define( var + many(expr|array|atom) >> make_funcapp ) first = (funcapp|array|atom) array.define( op_('[') + first + many(op_(',') + first) + op_(']') >> make_array ) # First order objects #first_order.define( #funcapp | ##array | #atom #) @with_forward_decls def pure(): return (first + skip(finished)) | first primary = pure return primary.parse(tokenize(seq))
def sexp(): return op_('(') + atom + many(atom|sexp) + op_(')')
Spec('op', r'[{};,=\[\]]|(->)|(--)'), Spec('number', r'-?(\.[0-9]+)|([0-9]+(\.[0-9]*)?)'), Spec('string', r'"[^"]*"'), # '\"' escapes are ignored ] useless = ['comment', 'newline', 'space'] t = make_tokenizer(specs) return [x for x in t(str) if x.type not in useless] id = sometoks(['name', 'number', 'string']) make_graph_attr = lambda args: DefAttrs(u'graph', [Attr(*args)]) make_edge = lambda x, xs, attrs: Edge([x] + xs, attrs) node_id = memoize(id) # + maybe(port) a_list = ( id + maybe(op_('=') + id) + skip(maybe(op(','))) >> unarg(Attr)) attr_list = ( many(op_('[') + many(a_list) + op_(']')) >> flatten) attr_stmt = ( (n('graph') | n('node') | n('edge')) + attr_list >> unarg(DefAttrs)) graph_attr = id + op_('=') + id >> make_graph_attr node_stmt = node_id + attr_list >> unarg(Node) # We use a fwd() because of circular definitions like (stmt_list -> stmt -> # subgraph -> stmt_list) subgraph = fwd() edge_rhs = skip(op('->') | op('--')) + (subgraph | node_id)