2 # Copyright (C) 2006-2010, Parrot Foundation.
6 .include 'test_more.pir'
9 load_bytecode 'compilers/pge/PGE.pbc'
10 load_bytecode 'dumper.pbc'
11 load_bytecode 'PGE/Dumper.pbc'
13 optable_output_is( 'a', 'term:a', 'Simple term' )
14 optable_output_is( 'a+b', 'infix:+(term:a, term:b)', 'Simple infix' )
15 optable_output_is( 'a-b', 'infix:-(term:a, term:b)', 'Simple infix' )
16 optable_output_is( 'a+b+c', 'infix:+(infix:+(term:a, term:b), term:c)', 'left associativity' )
17 optable_output_is( 'a+b-c', 'infix:-(infix:+(term:a, term:b), term:c)', 'left associativity' )
18 optable_output_is( 'a-b+c', 'infix:+(infix:-(term:a, term:b), term:c)', 'left associativity' )
20 optable_output_is( 'a+b*c', 'infix:+(term:a, infix:*(term:b, term:c))', 'tighter precedence' )
21 optable_output_is( 'a*b+c', 'infix:+(infix:*(term:a, term:b), term:c)', 'tighter precedence' )
23 optable_output_is( 'a/b/c', 'infix:/(infix:/(term:a, term:b), term:c)', 'left associativity' )
24 optable_output_is( 'a*b/c', 'infix:/(infix:*(term:a, term:b), term:c)', 'left associativity' )
25 optable_output_is( 'a/b*c', 'infix:*(infix:/(term:a, term:b), term:c)', 'left associativity' )
27 optable_output_is( 'a=b*c', 'infix:=(term:a, infix:*(term:b, term:c))', 'looser precedence' )
29 optable_output_is( 'a=b=c', 'infix:=(term:a, infix:=(term:b, term:c))', 'right associativity' )
31 optable_output_is( 'a=b,c,d+e', 'infix:=(term:a, infix:,(term:b, term:c, infix:+(term:d, term:e)))', 'list associativity' )
33 optable_output_is( 'a b', 'term:a (pos=1)', 'two terms in sequence' )
34 optable_output_is( 'a = = b', 'term:a (pos=1)', 'two opers in sequence' )
35 optable_output_is( 'a +', 'term:a (pos=1)', 'infix missing rhs' )
37 optable_output_is( 'a++', 'postfix:++(term:a)', 'postfix' )
38 optable_output_is( 'a--', 'postfix:--(term:a)', 'postfix' )
39 optable_output_is( '++a', 'prefix:++(term:a)', 'prefix' )
40 optable_output_is( '--a', 'prefix:--(term:a)', 'prefix' )
42 optable_output_is( '-a', 'prefix:-(term:a)', 'prefix ltm')
43 optable_output_is( '->a', 'term:->a', 'prefix ltm')
45 optable_output_is( 'a*(b+c)', 'infix:*(term:a, circumfix:( )(infix:+(term:b, term:c)))', 'circumfix parens' )
46 optable_output_is( 'a*b+c)+4','infix:+(infix:*(term:a, term:b), term:c) (pos=5)', 'extra close paren' )
47 optable_output_is( ' )a*b+c)+4', 'failed', 'only close paren' )
48 optable_output_is( '(a*b+c', 'failed', 'missing close paren' )
49 optable_output_is( '(a*b+c]', 'failed', 'mismatch close paren' )
51 optable_output_is( 'a+++--b', 'infix:+(postfix:++(term:a), prefix:--(term:b))', 'mixed tokens' )
53 optable_output_is( '=a+4', 'failed', 'missing lhs term' )
55 optable_output_is( 'a(b,c)', 'postcircumfix:( )(term:a, infix:,(term:b, term:c))', 'postcircumfix' )
56 optable_output_is( 'a (b,c)', 'term:a (pos=1)', 'nows on postcircumfix' )
58 optable_output_is( 'a()', 'postcircumfix:( )(term:a, null)', 'nullterm in postcircumfix' )
59 optable_output_is( 'a[]', 'term:a (pos=1)', 'nullterm disallowed' )
61 optable_output_is( '(a=b;c;d)', 'circumfix:( )(infix:;(infix:=(term:a, term:b), term:c, term:d))', 'loose list associativity in circumfix' )
63 optable_output_is( '(a;b);d', 'circumfix:( )(infix:;(term:a, term:b)) (pos=5)', 'top-level stop token' )
65 optable_output_is( 'a,b;c', 'infix:,(term:a, term:b) (pos=3)', 'top-level stop token' )
68 .sub optable_output_is
73 $S0 = test_optable(test)
74 is($S0, output, message)
83 .local string return_string
85 $P0 = get_hll_global ['PGE'], 'OPTable'
88 optable.'newtok'('infix:+', 'precedence'=>'=')
89 optable.'newtok'('infix:-', 'equiv'=>'infix:+')
90 optable.'newtok'('infix:*', 'tighter'=>'infix:+')
91 optable.'newtok'('infix:/', 'equiv'=>'infix:*')
92 optable.'newtok'('infix:**', 'tighter'=>'infix:*')
93 optable.'newtok'('infix:==', 'looser'=>'infix:+')
94 optable.'newtok'('infix:=', 'looser'=>'infix:==', 'assoc'=>'right')
95 optable.'newtok'('infix:,', 'tighter'=>'infix:=', 'assoc'=>'list')
96 optable.'newtok'('infix:;', 'looser'=>'infix:=', 'assoc'=>'list')
98 optable.'newtok'('prefix:++', 'tighter'=>'infix:**')
99 optable.'newtok'('prefix:--', 'equiv'=>'prefix:++')
100 optable.'newtok'('postfix:++', 'equiv'=>'prefix:++')
101 optable.'newtok'('postfix:--', 'equiv'=>'prefix:++')
102 optable.'newtok'('prefix:-', 'equiv'=>'prefix:++')
105 ident = get_global ['PGE';'Match'], 'ident'
106 optable.'newtok'('term:', 'tighter'=>'prefix:++', 'parsed'=>ident)
107 optable.'newtok'('circumfix:( )', 'equiv'=>'term:')
108 optable.'newtok'('circumfix:[ ]', 'equiv'=>'term:')
109 optable.'newtok'('postcircumfix:( )', 'looser'=>'term:', 'nows'=>1, 'nullterm'=>1)
110 optable.'newtok'('postcircumfix:[ ]', 'equiv'=>'postcircumfix:( )', 'nows'=>1)
113 $P0 = compreg 'PGE::Perl6Regex'
114 arrow = $P0("'->' <ident>")
115 optable.'newtok'('term:->', 'equiv'=>'term:', 'parsed'=>arrow, 'skipkey'=>0)
118 match = optable.'parse'(test, 'stop'=>' ;')
119 unless match goto fail
125 if $I0 == $I1 goto succeed
126 return_string .= " (pos="
133 return_string = "failed"
136 .set_return return_string
143 .local string return_string
145 if $S0 == "" goto print_null
147 return_string .= type
148 if type == 'term:' goto print_term
149 if type == 'term:->' goto print_term_arrow
153 if null $P0 goto iter_end
154 unless $P0 goto iter_end
156 unless it goto iter_end
161 unless it goto iter_end
162 return_string .= ', '
169 return_string .= "null"
180 .set_return return_string
189 # vim: expandtab shiftwidth=4 ft=pir: