Exemplo n.º 1
0
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'
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
            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
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
 def sexp():
     return op_('(') + atom + many(atom|sexp) + op_(')')
Exemplo n.º 7
0
        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)