Exemplo n.º 1
0
def parser():
    yield T.Value("a")
    a = yield (T.Regexp(r"[a-z]") >> T.Value("b"))
    if a[0] == "a":
        raise GeneratorResult("found a")
    yield T.Value("a")
    raise GeneratorResult(a)
Exemplo n.º 2
0
import trishula as T


def handle(d):
    print(d)
    return int(d["int"])


grammar = T.Namespace(T.Value("47") @ "int") >= handle


def main():
    for example in ('47', '"hi"'):
        result = T.Parser().parse(grammar, example)
        print(vars(result))


main()
Exemplo n.º 3
0
def p_list():
    non_empty = (T.Value("(") >> T.Ref(p_list) >> T.Value(")")) >= (
        lambda x: x[0][1])
    empty = T.Value("()") >= (lambda _: [])
    return empty | non_empty
Exemplo n.º 4
0
def op(string, fn):
    return T.Namespace(((term | parenthesis) @ "left") >> -space >>
                       (T.Value(string) @ "operator") >>
                       (-(-space >> (T.Ref(lambda: grammar) @ "right")))) >= (
                           lambda d: replaceOperator(d, fn))
Exemplo n.º 5
0
import pprint
import unittest as U

sys.path.insert(0, os.path.abspath(".."))

import trishula as T


def realnum(d):
    if "fractional" in d:
        return float(d["integer"] + "." + d["fractional"])
    return float(d["integer"])


term = (
    ((-(T.Value("-")) >= (lambda x: -1.0 if x is not None else 1.0)) >>
     (T.Namespace((T.Regexp("[1-9][0-9]*") @ "integer") >> -(
         T.Value(".") >> (T.Regexp("[0-9]*") @ "fractional"))) >= realnum)) >=
    (lambda x: x[0] * x[1])) | (T.Value("0") >= float)

space = T.Value(" ")


def mark_as_parenthesis(d):
    d["parenthesis"] = True
    return d


parenthesis = (T.Namespace(
    T.Value("(") >> (T.Ref(lambda: grammar) @ "value") >> T.Value(")")) >=
               mark_as_parenthesis)
Exemplo n.º 6
0
def sep_by(content, separator):
    return sep_by1(content, separator) | (T.Value("") >= (lambda _: []))
Exemplo n.º 7
0

def sep_by1(content, separator):
    single = content >= (lambda x: [x])
    another = (separator >> content) >= (lambda x: x[1])
    multi = (content >> +another) >= (lambda x: [x[0], *x[1]])
    return multi | single


def sep_by(content, separator):
    return sep_by1(content, separator) | (T.Value("") >= (lambda _: []))


json_ws = T.Regexp(r"[ \n\r\t]*")

json_quote = T.Value('\\"') >= (lambda: '"')
json_backslash = T.Value("\\\\") >= (lambda: "\\")
json_slash = T.Value("\\/") >= (lambda: "/")
json_backspace = T.Value("\\b") >= (lambda: "\b")
json_lf = T.Value("\\n") >= (lambda: "\n")
json_cr = T.Value("\\r") >= (lambda: "\r")
json_tab = T.Value("\\t") >= (lambda: "\t")
json_unicode = (T.Value("\\u") >> T.Regexp(r"[a-zA-Z0-9]{4}")) >= (
    lambda x: chr(int(x[1], base=16)))
json_char_escaped = (json_quote
                     | json_backslash
                     | json_slash
                     | json_backspace
                     | json_lf
                     | json_cr
                     | json_tab
Exemplo n.º 8
0
def wrap(begin, end, content):
    return (T.Value(begin) >> content >> T.Value(end)) @ m(lambda x: x[0][1])
Exemplo n.º 9
0
import trishula as T

print(dir(T))
print()


def m(f):
    return lambda x: T.Node(x.status, x.index, f(x.value))


p_number = T.Regexp(r"[0-9\.]+") @ m(float)


def wrap(begin, end, content):
    return (T.Value(begin) >> content >> T.Value(end)) @ m(lambda x: x[0][1])


p_list_inner = (p_number | (T.Regexp(r",\s*") >> p_list_inner))

p_list = wrap("[", "]", p_list_inner | (T.Value("") @ mapper(lambda _: [])))

result = T.Parser().parse(grammar, "[3.14]")
print(vars(result))