constructs = {
1 : {
1 : {
1 : print
}
}
}
def parse( code ) :
def parse_expr( index) :
while index < size and code [ index] == 0 :
index += 1 # skip 0s
try :
call = [ ]
while True :
key1, key2, key3, pos = code [ index: ( next_index := index + 4 ) ]
if next_index < size and code [ next_index] == 0 :
raise ValueError # escape the token
if not call:
call.append ( constructs[ key1] [ key2] [ key3] )
if pos == -1 :
return call, next_index
obj, index = parse_expr( next_index)
call.append ( obj)
except ( ValueError , KeyError ) :
return code [ index] , index + 1
size = len ( code )
index = 0
result = [ ]
while index < size:
obj, index = parse_expr( index)
result.append ( obj)
return result
print ( parse( [ 1 , 1 , 1 , 1 , 'Hello world' , 1 , 1 , 1 , 2 , 'etc' , 1 , 1 , 1 , -1 ] ) )
print ( parse( [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 'Hello world' , 1 , 1 , 1 , -1 , 1 , 1 , 1 , 2 , 'etc' , 1 , 1 , 1 , -1 ] ) )
print ( parse( [ 1 , 1 , 1 , 1 , 'a' , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 'b' , 1 , 1 , 1 , -1 , 1 , 1 , 1 , -1 , 1 , 1 , 1 , 1 , 'c' , 1 , 1 , 1 , -1 ] ) )
Y29uc3RydWN0cyA9IHsKICAgIDE6IHsKICAgICAgICAxOiB7CiAgICAgICAgICAgIDE6IHByaW50CiAgICAgICAgfQogICAgfQp9CgpkZWYgcGFyc2UoY29kZSk6CiAgICBkZWYgcGFyc2VfZXhwcihpbmRleCk6CiAgICAgICAgd2hpbGUgaW5kZXggPCBzaXplIGFuZCBjb2RlW2luZGV4XSA9PSAwOgogICAgICAgICAgICBpbmRleCArPSAxICAjIHNraXAgMHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhbGwgPSBbXQogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAga2V5MSwga2V5Miwga2V5MywgcG9zID0gY29kZVtpbmRleDogKG5leHRfaW5kZXggOj0gaW5kZXggKyA0KV0KICAgICAgICAgICAgICAgIGlmIG5leHRfaW5kZXggPCBzaXplIGFuZCBjb2RlW25leHRfaW5kZXhdID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciAgIyBlc2NhcGUgdGhlIHRva2VuCiAgICAgICAgICAgICAgICBpZiBub3QgY2FsbDoKICAgICAgICAgICAgICAgICAgICBjYWxsLmFwcGVuZChjb25zdHJ1Y3RzW2tleTFdW2tleTJdW2tleTNdKQogICAgICAgICAgICAgICAgaWYgcG9zID09IC0xOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsLCBuZXh0X2luZGV4CiAgICAgICAgICAgICAgICBvYmosIGluZGV4ID0gcGFyc2VfZXhwcihuZXh0X2luZGV4KQogICAgICAgICAgICAgICAgY2FsbC5hcHBlbmQob2JqKQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gY29kZVtpbmRleF0sIGluZGV4ICsgMQogICAgc2l6ZSA9IGxlbihjb2RlKQogICAgaW5kZXggPSAwCiAgICByZXN1bHQgPSBbXQogICAgd2hpbGUgaW5kZXggPCBzaXplOgogICAgICAgIG9iaiwgaW5kZXggPSBwYXJzZV9leHByKGluZGV4KQogICAgICAgIHJlc3VsdC5hcHBlbmQob2JqKQogICAgcmV0dXJuIHJlc3VsdAoKcHJpbnQocGFyc2UoWzEsIDEsIDEsIDEsICdIZWxsbyB3b3JsZCcsIDEsIDEsIDEsIDIsICdldGMnLCAxLCAxLCAxLCAtMV0pKQpwcmludChwYXJzZShbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgJ0hlbGxvIHdvcmxkJywgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIDIsICdldGMnLCAxLCAxLCAxLCAtMV0pKQpwcmludChwYXJzZShbMSwgMSwgMSwgMSwgJ2EnLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAnYicsIDEsIDEsIDEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgJ2MnLCAxLCAxLCAxLCAtMV0pKQ==