import gll ws = gll.skipmany(gll.whitespace()) skipped = lambda pat: gll.skip(gll.string(pat)) body = gll.seq(skipped("{"), skipped("}")) argument = gll.seq(gll.regex("\w+", tag="argument"), ws, gll.regex("\w+", tag="type"), gll.skip(gll.regex("[\s,]*"))) arguments_list = gll.seq(skipped("("), gll.many(argument), skipped(")"), tag="arguments") function = gll.seq(skipped("func"), ws, gll.regex("\w+", tag="function_name"), ws, arguments_list, ws, body, ws, tag="function") package_name = gll.seq(skipped("package"), ws, gll.regex("\w+", tag="name"), gll.skipmany(gll.string(" ")), skipped("\n"), tag="package_name") package = gll.seq(package_name, gll.many(function, tag="package_body"), tag="package") parser = gll.all(package)