|
1 "{ Package: 'stx:goodies/petitparser' }" |
|
2 |
|
3 PPAbstractParserTest subclass:#PPScriptingTest |
|
4 instanceVariableNames:'' |
|
5 classVariableNames:'' |
|
6 poolDictionaries:'' |
|
7 category:'PetitTests-Tests' |
|
8 ! |
|
9 |
|
10 PPScriptingTest comment:'These are some simple demo-scripts of parser combinators for the compiler construction course. |
|
11 http://www.iam.unibe.ch/~scg/Teaching/CC/index.html' |
|
12 ! |
|
13 |
|
14 |
|
15 !PPScriptingTest methodsFor:'examples'! |
|
16 |
|
17 expressionInterpreter |
|
18 "Same as #expressionInterpreter but with semantic actions." |
|
19 |
|
20 | mul prim add dec | |
|
21 add := PPUnresolvedParser new. |
|
22 mul := PPUnresolvedParser new. |
|
23 prim := PPUnresolvedParser new. |
|
24 dec := ($0 to: $9) asParser ==> [ :token | token codePoint - $0 codePoint ]. |
|
25 add def: ((mul , $+ asParser , add) ==> [ :nodes | (nodes at: 1) + (nodes at: 3) ]) |
|
26 / mul. |
|
27 mul def: ((prim , $* asParser , mul) ==> [ :nodes | (nodes at: 1) * (nodes at: 3) ]) |
|
28 / prim. |
|
29 prim def: (($( asParser , add , $) asParser) ==> [ :nodes | nodes at: 2 ]) |
|
30 / dec. |
|
31 ^ add end |
|
32 ! |
|
33 |
|
34 expressionParser |
|
35 "Simple demo of scripting an expression parser." |
|
36 |
|
37 | mul prim add dec | |
|
38 add := PPUnresolvedParser new. |
|
39 mul := PPUnresolvedParser new. |
|
40 prim := PPUnresolvedParser new. |
|
41 dec := ($0 to: $9) asParser. |
|
42 add def: (mul , $+ asParser , add) |
|
43 / mul. |
|
44 mul def: (prim , $* asParser , mul) |
|
45 / prim. |
|
46 prim def: ($( asParser , add , $) asParser) |
|
47 / dec. |
|
48 ^ add end |
|
49 ! |
|
50 |
|
51 straightLineParser |
|
52 | goal stm stmList id char dec exp expList mulExp primExp nonzero num lower upper | |
|
53 goal := PPUnresolvedParser new. |
|
54 stmList := PPUnresolvedParser new. |
|
55 stm := PPUnresolvedParser new. |
|
56 exp := PPUnresolvedParser new. |
|
57 expList := PPUnresolvedParser new. |
|
58 mulExp := PPUnresolvedParser new. |
|
59 primExp := PPUnresolvedParser new. |
|
60 |
|
61 lower := ($a to: $z) asParser. |
|
62 upper := ($A to: $Z) asParser. |
|
63 char := lower / upper. |
|
64 nonzero := ($1 to: $9) asParser. |
|
65 dec := ($0 to: $9) asParser. |
|
66 id := char, ( char / dec ) star. |
|
67 num := $0 asParser / ( nonzero, dec star). |
|
68 |
|
69 goal def: stmList end. |
|
70 stmList def: stm , ( $; asParser, stm ) star. |
|
71 stm def: ( id, ':=' asParser, exp ) |
|
72 / ( 'print' asParser, $( asParser, expList, $) asParser ). |
|
73 exp def: mulExp, ( ( $+ asParser / $- asParser ), mulExp ) star. |
|
74 expList def: exp, ( $, asParser, exp ) star. |
|
75 mulExp def: primExp, ( ( $* asParser / $/ asParser ), primExp ) star. |
|
76 primExp def: id |
|
77 / num |
|
78 / ( $( asParser, stmList, $, asParser, exp, $) asParser ). |
|
79 ^ goal |
|
80 ! ! |
|
81 |
|
82 !PPScriptingTest methodsFor:'tests'! |
|
83 |
|
84 testExpressionInterpreter |
|
85 self |
|
86 assert: self expressionInterpreter |
|
87 parse: '2*(3+4)' |
|
88 to: 14 |
|
89 ! |
|
90 |
|
91 testExpressionParser |
|
92 self |
|
93 assert: self expressionParser |
|
94 parse: '2*(3+4)' |
|
95 to: #($2 $* ($( ($3 $+ $4) $))) |
|
96 ! |
|
97 |
|
98 testSLassign |
|
99 |
|
100 self assert: self straightLineParser |
|
101 parse: 'abc:=1' |
|
102 to: #(#($a #($b $c) ':=' #(#(#($1 #()) #()) #())) #()) |
|
103 ! |
|
104 |
|
105 testSLprint |
|
106 self |
|
107 assert: self straightLineParser |
|
108 parse: 'print(3,4)' |
|
109 to: #(('print' $( ((($3 ()) ()) () (($, ((($4 ()) ()) ())))) $)) ()) |
|
110 ! ! |
|
111 |
|
112 !PPScriptingTest class methodsFor:'documentation'! |
|
113 |
|
114 version |
|
115 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPScriptingTest.st,v 1.4 2014-03-04 14:34:23 cg Exp $' |
|
116 ! |
|
117 |
|
118 version_CVS |
|
119 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPScriptingTest.st,v 1.4 2014-03-04 14:34:23 cg Exp $' |
|
120 ! |
|
121 |
|
122 version_SVN |
|
123 ^ '$Id: PPScriptingTest.st,v 1.4 2014-03-04 14:34:23 cg Exp $' |
|
124 ! ! |
|
125 |