def test_simple_sequence(self): pars = self.token_parse_text("this is 1 first test 2 3 4") p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) p_words = pars.Production("words", Repeat(Terminal(typ=self.lxtok.WORD))) root = pars.run() self.assertIsNotNone(root) self.assertEqual( self.get_flat(root), [ "---root---", "words", ("this", "WORD"), ("is", "WORD"), "number", ("1", "UINT"), "words", ("first", "WORD"), ("test", "WORD"), "number", ("2", "UINT"), "number", ("3", "UINT"), "number", ("4", "UINT"), ], )
def test_opt_minus_number(self): pars = self.token_parse_text("1 - 2 3 4") p_minus = pars.Production("minus", Terminal(typ=self.lxtok.MINUS)) p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) p_opt_minus_number = pars.Production( "opt_minus_number", And([Optional(p_minus), pars.Call(p_number)])) root = pars.run() self.assertIsNotNone(root) self.assertEqual( self.get_flat(root), [ "---root---", "number", ("1", "UINT"), "opt_minus_number", "minus", ("-", "MINUS"), "number", ("2", "UINT"), "number", ("3", "UINT"), "number", ("4", "UINT"), ], )
def test_no_number(self): pars = self.token_parse_text("1a") p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) self.assertRaises(NoSolution, pars.run)
def test_number(self): pars = self.token_parse_text("1") p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) root = pars.run() self.assertIsNotNone(root)
def test_opt_repeat_minus_or_plus_number(self): pars = self.token_parse_text("1 - 2 3 + - 4 5") p_minus = pars.Production("minus", Terminal(typ=self.lxtok.MINUS)) p_plus = pars.Production("plus", Terminal(typ=self.lxtok.PLUS)) p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) p_opt_minus_number = pars.Production( "opt_repeat_minus_plus_number", And([ Optional(Repeat(Or([p_minus, p_plus]), name="opt_sign")), pars.Call(p_number), ]), ) root = pars.run() self.assertIsNotNone(root) self.assertEqual( self.get_flat(root), [ "---root---", "number", ("1", "UINT"), "opt_repeat_minus_plus_number", "*opt_sign", "minus", ("-", "MINUS"), "number", ("2", "UINT"), "number", ("3", "UINT"), "opt_repeat_minus_plus_number", "*opt_sign", "plus", ("+", "PLUS"), "minus", ("-", "MINUS"), "number", ("4", "UINT"), "number", ("5", "UINT"), ], )
def test_many_number(self): pars = self.token_parse_text("1 2 3 4") p_number = pars.Production( "number", Or([Terminal(str(x)) for x in range(0, 10)])) root = pars.run() self.assertIsNotNone(root) for e in root.get_tail(): self.assertEqual(e.get_head(), "number")
lexx = Lexer(alltokens, debug=not True, debugtime=False) inp_text = """1 0 - + 7 8 seven - 1 4 + 5 + 6 six""" # inp_text = """+ 1 0 - + 7 seven """ stream = lexx.tokenize(inp_text, ) lxtok = LexerTokens(lexx.tokens) stream = list(Sanitizer().whitespace(stream, keep=[])) pars = Parser() pars.set_input(stream) # p_assign = pars.Production("assignment", Terminal(":==")) p_minus = pars.Production("minus", Terminal("-")) p_plus = pars.Production("plus", Terminal(typ=lxtok.PLUS)) p_zahl_ohne_null_5 = pars.Production( "zahl_ohne_null", Or([Terminal(str(x)) for x in range(1, 5)]), alias="lower_5") p_zahl_ohne_null_10 = pars.Production( "zahl_ohne_null", Or([Terminal(str(x)) for x in range(5, 10)]), alias="higher_or_equal_5", ) p_zahl = pars.Production( "zahl",
) from pylexem.utils import RuleBuilder, Sanitizer from pyparsesynt.parser import Parser, LexerTokens from pyparsesynt.writer import Writer from pyparsesynt.token import Token, TokenStream from pyparsesynt.rule import Production, Call, Terminal, And, Or, Not, Optional, Repeat tokens = RuleBuilder().add_all().build() alltokens = Tokens().extend(tokens) lexx = Lexer(alltokens, debug=not True, debugtime=True) inp_text = """ todo """ stream = lexx.tokenize(inp_text) lxtok = LexerTokens(lexx.tokens) stream = Sanitizer().whitespace(stream) pars = Parser() pars.set_input(stream) p_assign = pars.Production("assignment", Terminal(":==")) print() Writer().write(pars.rules)