11from rpython .rlib .parsing .lexer import *
22# Unused, but needed for some obscure reason
33from rpython .rlib .parsing .makepackrat import BacktrackException , Status
4- from rpython .rlib .parsing .regex import *
54from rpython .rlib .parsing .parsing import *
65from rpython .translator .c .test .test_genc import compile
76
8-
9- class TestTranslateLexer (object ):
10- def get_lexer (self , rexs , names , ignore = None ):
11- return Lexer (rexs , names , ignore )
12-
13- def test_translate_simple (self ):
14- digits = RangeExpression ("0" , "9" )
15- lower = RangeExpression ("a" , "z" )
16- upper = RangeExpression ("A" , "Z" )
17- keywords = StringExpression ("if" ) | StringExpression ("else" ) | StringExpression ("def" ) | StringExpression ("class" )
18- underscore = StringExpression ("_" )
19- atoms = lower + (upper | lower | digits | underscore ).kleene ()
20- vars = underscore | (upper + (upper | lower | underscore | digits ).kleene ())
21- integers = StringExpression ("0" ) | (RangeExpression ("1" , "9" ) + digits .kleene ())
22- white = StringExpression (" " )
23- l1 = self .get_lexer ([keywords , atoms , vars , integers , white ], ["KEYWORD" , "ATOM" , "VAR" , "INT" , "WHITE" ])
24- l2 = self .get_lexer ([keywords , atoms , vars , integers , white ], ["KEYWORD" , "ATOM" , "VAR" , "INT" , "WHITE" ], ["WHITE" ])
25- def lex (s , ignore = False ):
26- if ignore :
27- tokens = l2 .tokenize (s )
28- else :
29- tokens = l1 .tokenize (s )
30- return "-%-" .join ([t .name for t in tokens ])
31- res = lex ("if A a 12341 0 else" ).split ("-%-" )
32- assert res == ("KEYWORD WHITE VAR WHITE ATOM WHITE INT WHITE "
33- "INT WHITE KEYWORD" ).split ()
34- res = lex ("if A a 12341 0 else" , True ).split ("-%-" )
35- assert res == "KEYWORD VAR ATOM INT INT KEYWORD" .split ()
36- func = compile (lex , [str , bool ])
37- res = lex ("if A a 12341 0 else" , False ).split ("-%-" )
38- assert res == ("KEYWORD WHITE VAR WHITE ATOM WHITE INT WHITE "
39- "INT WHITE KEYWORD" ).split ()
40- res = lex ("if A a 12341 0 else" , True ).split ("-%-" )
41- assert res == "KEYWORD VAR ATOM INT INT KEYWORD" .split ()
42-
43-
447def test_translate_parser ():
458 r0 = Rule ("expression" , [["additive" , "EOF" ]])
469 r1 = Rule ("additive" , [["multitive" , "+" , "additive" ], ["multitive" ]])
@@ -53,9 +16,11 @@ def test_translate_parser():
5316 data = [Token (c , i , SourcePos (i , 0 , i ))
5417 for i , c in enumerate (list ("2*(3+4)" ) + ["EOF" ])]
5518 print tree
19+
5620 def parse (choose ):
5721 tree = p .parse (data , lazy = False )
5822 return tree .symbol + " " + "-%-" .join ([c .symbol for c in tree .children ])
23+
5924 func = compile (parse , [bool ])
6025 res1 = parse (True )
6126 res2 = func (True )
@@ -78,9 +43,11 @@ def test_translate_compiled_parser():
7843 for i , c in enumerate (list ("2*(3+4)" ) + ["EOF" ])]
7944 print tree
8045 p = kls ()
46+
8147 def parse (choose ):
8248 tree = p .parse (data )
8349 return tree .symbol + " " + "-%-" .join ([c .symbol for c in tree .children ])
50+
8451 func = compile (parse , [bool ])
8552 res1 = parse (True )
8653 res2 = func (True )
@@ -97,12 +64,14 @@ def test_translate_ast_visitor():
9764primary: "(" <additive> ")" | <DECIMAL>;
9865""" )
9966 parse = make_parse_function (regexs , rules )
67+
10068 def f ():
10169 tree = parse ("(0 +! 10) *! (999 +! 10) +! 1" )
10270 tree = ToAST ().visit_additive (tree )
10371 assert len (tree ) == 1
10472 tree = tree [0 ]
10573 return tree .symbol + " " + "-&-" .join ([c .symbol for c in tree .children ])
74+
10675 res1 = f ()
10776 func = compile (f , [])
10877 res2 = func ()
@@ -130,27 +99,34 @@ class parser(PackratParser):
13099 simple:
131100 ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9');
132101 """
102+
133103 print parser ._code
104+
134105 def parse (s ):
135106 p = parser (s )
136107 return p .expr ()
108+
137109 res = parse ("5-5-5" )
138110 assert res == '((5 - 5) - 5)'
139111 func = compile (parse , [str ])
140112 res = func ("5-5-5" )
141113 assert res == '((5 - 5) - 5)'
142114
115+
143116def test_translate_pypackrat_regex ():
144117 from rpython .rlib .parsing .pypackrat import PackratParser
145118 class parser (PackratParser ):
146119 """
147120 num:
148121 `([1-9][0-9]*)|0`;
149122 """
123+
150124 print parser ._code
125+
151126 def parse (s ):
152127 p = parser (s )
153128 return p .num ()
129+
154130 res = parse ("1234" )
155131 assert res == '1234'
156132 func = compile (parse , [str ])
0 commit comments