13 |
13 |
14 |
14 |
15 !PPScriptingTest methodsFor:'examples'! |
15 !PPScriptingTest methodsFor:'examples'! |
16 |
16 |
17 expressionInterpreter |
17 expressionInterpreter |
18 "Same as #expressionInterpreter but with semantic actions." |
18 "Same as #expressionInterpreter but with semantic actions." |
19 |
19 |
20 | mul prim add dec | |
20 | mul prim add dec | |
21 add := PPUnresolvedParser new. |
21 add := PPUnresolvedParser new. |
22 mul := PPUnresolvedParser new. |
22 mul := PPUnresolvedParser new. |
23 prim := PPUnresolvedParser new. |
23 prim := PPUnresolvedParser new. |
24 dec := ($0 to: $9) asParser ==> [ :token | token codePoint - $0 codePoint ]. |
24 dec := ($0 - $9) ==> [ :token | token codePoint - $0 codePoint ]. |
25 add def: ((mul , $+ asParser , add) ==> [ :nodes | (nodes at: 1) + (nodes at: 3) ]) |
25 add def: ((mul , $+ asParser , add) ==> [ :nodes | (nodes at: 1) + (nodes at: 3) ]) |
26 / mul. |
26 / mul. |
27 mul def: ((prim , $* asParser , mul) ==> [ :nodes | (nodes at: 1) * (nodes at: 3) ]) |
27 mul def: ((prim , $* asParser , mul) ==> [ :nodes | (nodes at: 1) * (nodes at: 3) ]) |
28 / prim. |
28 / prim. |
29 prim def: (($( asParser , add , $) asParser) ==> [ :nodes | nodes at: 2 ]) |
29 prim def: (($( asParser , add , $) asParser) ==> [ :nodes | nodes at: 2 ]) |
30 / dec. |
30 / dec. |
31 ^ add end |
31 ^ add end |
32 ! |
32 ! |
33 |
33 |
34 expressionParser |
34 expressionParser |
35 "Simple demo of scripting an expression parser." |
35 "Simple demo of scripting an expression parser." |
36 |
36 |
37 | mul prim add dec | |
37 | mul prim add dec | |
38 add := PPUnresolvedParser new. |
38 add := PPUnresolvedParser new. |
39 mul := PPUnresolvedParser new. |
39 mul := PPUnresolvedParser new. |
40 prim := PPUnresolvedParser new. |
40 prim := PPUnresolvedParser new. |
41 dec := ($0 to: $9) asParser. |
41 dec := ($0 - $9). |
42 add def: (mul , $+ asParser , add) |
42 add def: (mul , $+ asParser , add) |
43 / mul. |
43 / mul. |
44 mul def: (prim , $* asParser , mul) |
44 mul def: (prim , $* asParser , mul) |
45 / prim. |
45 / prim. |
46 prim def: ($( asParser , add , $) asParser) |
46 prim def: ($( asParser , add , $) asParser) |
47 / dec. |
47 / dec. |
48 ^ add end |
48 ^ add end |
49 ! |
49 ! |
50 |
50 |
51 straightLineParser |
51 straightLineParser |
52 | goal stm stmList id char dec exp expList mulExp primExp nonzero num lower upper | |
52 | goal stm stmList id char dec exp expList mulExp primExp nonzero num lower upper | |
53 goal := PPUnresolvedParser new. |
53 goal := PPUnresolvedParser new. |
54 stmList := PPUnresolvedParser new. |
54 stmList := PPUnresolvedParser new. |
55 stm := PPUnresolvedParser new. |
55 stm := PPUnresolvedParser new. |
56 exp := PPUnresolvedParser new. |
56 exp := PPUnresolvedParser new. |
57 expList := PPUnresolvedParser new. |
57 expList := PPUnresolvedParser new. |
58 mulExp := PPUnresolvedParser new. |
58 mulExp := PPUnresolvedParser new. |
59 primExp := PPUnresolvedParser new. |
59 primExp := PPUnresolvedParser new. |
60 |
60 |
61 lower := ($a to: $z) asParser. |
61 lower := $a - $z. |
62 upper := ($A to: $Z) asParser. |
62 upper := $A - $Z. |
63 char := lower / upper. |
63 char := lower / upper. |
64 nonzero := ($1 to: $9) asParser. |
64 nonzero := $1 - $9. |
65 dec := ($0 to: $9) asParser. |
65 dec := $0 - $9. |
66 id := char, ( char / dec ) star. |
66 id := char, ( char / dec ) star. |
67 num := $0 asParser / ( nonzero, dec star). |
67 num := $0 asParser / ( nonzero, dec star). |
68 |
68 |
69 goal def: stmList end. |
69 goal def: stmList end. |
70 stmList def: stm , ( $; asParser, stm ) star. |
70 stmList def: stm , ( $; asParser, stm ) star. |
71 stm def: ( id, ':=' asParser, exp ) |
71 stm def: ( id, ':=' asParser, exp ) |
72 / ( 'print' asParser, $( asParser, expList, $) asParser ). |
72 / ( 'print' asParser, $( asParser, expList, $) asParser ). |
73 exp def: mulExp, ( ( $+ asParser / $- asParser ), mulExp ) star. |
73 exp def: mulExp, ( ( $+ asParser / $- asParser ), mulExp ) star. |
74 expList def: exp, ( $, asParser, exp ) star. |
74 expList def: exp, ( $, asParser, exp ) star. |
75 mulExp def: primExp, ( ( $* asParser / $/ asParser ), primExp ) star. |
75 mulExp def: primExp, ( ( $* asParser / $/ asParser ), primExp ) star. |
76 primExp def: id |
76 primExp def: id |
77 / num |
77 / num |
78 / ( $( asParser, stmList, $, asParser, exp, $) asParser ). |
78 / ( $( asParser, stmList, $, asParser, exp, $) asParser ). |
79 ^ goal |
79 ^ goal |
80 ! ! |
80 ! ! |
81 |
81 |
82 !PPScriptingTest methodsFor:'tests'! |
82 !PPScriptingTest methodsFor:'tests'! |
83 |
83 |
84 testExpressionInterpreter |
84 testExpressionInterpreter |