PPComposedTest.st
changeset 14 d72aa40bcf53
parent 4 90de244a7fa2
child 96 b3a69699d996
equal deleted inserted replaced
13:57c26569b92b 14:d72aa40bcf53
    23 ! !
    23 ! !
    24 
    24 
    25 !PPComposedTest methodsFor:'testing'!
    25 !PPComposedTest methodsFor:'testing'!
    26 
    26 
    27 testDoubledString
    27 testDoubledString
    28 	| parser |
    28         | parser |
    29 	parser := ($' asParser , (($' asParser , $' asParser) / $' asParser negate) star flatten , $' asParser)
    29         parser := ($' asParser , (($' asParser , $' asParser) / $' asParser negate) star flatten , $' asParser) 
    30 		==> [ :nodes | nodes second copyReplaceAll: '''''' with: '''' ].
    30                 ==> [ :nodes | nodes second copyReplaceAll: '''''' with: '''' ].
    31 
    31 
    32 	self assert: parser parse: '''''' to: ''.
    32         self assert: parser parse: '''''' to: ''.
    33 	self assert: parser parse: '''a''' to: 'a'.
    33         self assert: parser parse: '''a''' to: 'a'.
    34 	self assert: parser parse: '''ab''' to: 'ab'.
    34         self assert: parser parse: '''ab''' to: 'ab'.
    35 	self assert: parser parse: '''a''''b''' to: 'a''b'.
    35         self assert: parser parse: '''a''''b''' to: 'a''b'.
    36 	self assert: parser parse: '''a''''''''b''' to: 'a''''b'
    36         self assert: parser parse: '''a''''''''b''' to: 'a''''b'
    37 
    37 
    38     "Modified: / 18-12-2010 / 18:00:16 / Jan Kurs <kurs.jan@post.cz>"
    38     "Modified: / 18-12-2010 / 18:00:16 / Jan Kurs <kurs.jan@post.cz>"
    39 !
    39 !
    40 
    40 
    41 testEvenNumber
    41 testEvenNumber
    42 	"Create a grammar that parses an even number of a's and b's."
    42 	"Create a grammar that parses an even number of a's and b's."
    43 
    43 	
    44 	| a as b bs s |
    44 	| a as b bs s |
    45 	a := $a asParser ==> [ :char | as := as + 1 ].
    45 	a := $a asParser ==> [ :char | as := as + 1 ].
    46 	b := $b asParser ==> [ :char | bs := bs + 1 ].
    46 	b := $b asParser ==> [ :char | bs := bs + 1 ].
    47 	s := (a / b) star >=> [ :stream :cc |
    47 	s := (a / b) star >=> [ :stream :cc |
    48 		as := bs := 0.
    48 		as := bs := 0.
    56 	self assert: s fail: 'ba' end: 2.
    56 	self assert: s fail: 'ba' end: 2.
    57 	self assert: s fail: 'aaa' end: 3.
    57 	self assert: s fail: 'aaa' end: 3.
    58 	self assert: s fail: 'bbb' end: 3.
    58 	self assert: s fail: 'bbb' end: 3.
    59 	self assert: s fail: 'aab' end: 3.
    59 	self assert: s fail: 'aab' end: 3.
    60 	self assert: s fail: 'abb' end: 3.
    60 	self assert: s fail: 'abb' end: 3.
    61 
    61 	
    62 	self assert: s parse: ''.
    62 	self assert: s parse: ''.
    63 	self assert: s parse: 'aa'.
    63 	self assert: s parse: 'aa'.
    64 	self assert: s parse: 'bb'.
    64 	self assert: s parse: 'bb'.
    65 	self assert: s parse: 'aaaa'.
    65 	self assert: s parse: 'aaaa'.
    66 	self assert: s parse: 'aabb'.
    66 	self assert: s parse: 'aabb'.
    94 	self assert: parser fail: 'if C then if C'
    94 	self assert: parser fail: 'if C then if C'
    95 !
    95 !
    96 
    96 
    97 testLeftRecursion
    97 testLeftRecursion
    98 	"S ::= S 'x' S / '1'"
    98 	"S ::= S 'x' S / '1'"
    99 
    99 	
   100 	| parser |
   100 	| parser |
   101 	parser := PPUnresolvedParser new.
   101 	parser := PPUnresolvedParser new.
   102 	parser def: ((parser , $x asParser , parser) / $1 asParser) memoized flatten.
   102 	parser def: ((parser , $x asParser , parser) / $1 asParser) memoized flatten.
   103 
   103 
   104 	self assert: parser parse: '1' to: '1'.
   104 	self assert: parser parse: '1' to: '1'.
   109 	self assert: parser parse: '1x1x1x1x1x1' to: '1x1x1x1x1x1'
   109 	self assert: parser parse: '1x1x1x1x1x1' to: '1x1x1x1x1x1'
   110 !
   110 !
   111 
   111 
   112 testListOfIntegers
   112 testListOfIntegers
   113 	"S ::= S , number | number"
   113 	"S ::= S , number | number"
   114 
   114 	
   115 	| number list parser |
   115 	| number list parser |
   116 	number := #digit asParser plus token trim
   116 	number := #digit asParser plus token trim
   117 		==> [ :node | node value asInteger ].
   117 		==> [ :node | node value asInteger ].
   118 	list := (number separatedBy: $, asParser token trim)
   118 	list := (number separatedBy: $, asParser token trim)
   119 		==> [ :node | node select: [ :each | each isInteger ] ].
   119 		==> [ :node | node select: [ :each | each isInteger ] ].
   134 	self assert: parser parse: '1' to: (1 to: 1) asArray.
   134 	self assert: parser parse: '1' to: (1 to: 1) asArray.
   135 	self assert: parser parse: '1 ,2' to: (1 to: 2) asArray.
   135 	self assert: parser parse: '1 ,2' to: (1 to: 2) asArray.
   136 	self assert: parser parse: '1 ,2 ,3' to: (1 to: 3) asArray.
   136 	self assert: parser parse: '1 ,2 ,3' to: (1 to: 3) asArray.
   137 	self assert: parser parse: '1 ,2 ,3 ,4' to: (1 to: 4) asArray.
   137 	self assert: parser parse: '1 ,2 ,3 ,4' to: (1 to: 4) asArray.
   138 	self assert: parser parse: '1 ,2 ,3 ,4 ,5' to: (1 to: 5) asArray.
   138 	self assert: parser parse: '1 ,2 ,3 ,4 ,5' to: (1 to: 5) asArray.
   139 
   139 	
   140 	self assert: parser fail: ''.
   140 	self assert: parser fail: ''.
   141 	self assert: parser fail: ','.
   141 	self assert: parser fail: ','.
   142 	self assert: parser fail: '1,'.
   142 	self assert: parser fail: '1,'.
   143 	self assert: parser fail: '1,,2'
   143 	self assert: parser fail: '1,,2'
   144 !
   144 !
   147 	"C ::= B I* E"
   147 	"C ::= B I* E"
   148 	"I ::= !!E (C | T)"
   148 	"I ::= !!E (C | T)"
   149 	"B ::= /*"
   149 	"B ::= /*"
   150 	"E ::= */"
   150 	"E ::= */"
   151 	"T ::= ."
   151 	"T ::= ."
   152 
   152 	
   153 	| begin end any inside parser |
   153 	| begin end any inside parser |
   154 	begin := '/*' asParser.
   154 	begin := '/*' asParser.
   155 	end := '*/' asParser.
   155 	end := '*/' asParser.
   156 	any := #any asParser.
   156 	any := #any asParser.
   157 
   157 	
   158 	parser := PPUnresolvedParser new.
   158 	parser := PPUnresolvedParser new.
   159 	inside := end not , (parser / any).
   159 	inside := end not , (parser / any).
   160 	parser def: begin , inside star , end.
   160 	parser def: begin , inside star , end.
   161 
   161 	
   162 	self assert: parser parse: '/*ab*/cd' end: 6.
   162 	self assert: parser parse: '/*ab*/cd' end: 6.
   163 	self assert: parser parse: '/*a/*b*/c*/'.
   163 	self assert: parser parse: '/*a/*b*/c*/'.
   164 	self assert: parser fail: '/*a/*b*/c'
   164 	self assert: parser fail: '/*a/*b*/c'
   165 !
   165 !
   166 
   166 
   167 testPalindrome
   167 testPalindrome
   168 	"S0 ::= a S1 a | b S1 b | ...
   168 	"S0 ::= a S1 a | b S1 b | ...
   169 	 S1 ::= S0 | epsilon"
   169 	 S1 ::= S0 | epsilon"
   170 
   170 	
   171 	| s0 s1 parser |
   171 	| s0 s1 parser |
   172 	s0 := PPUnresolvedParser new.
   172 	s0 := PPUnresolvedParser new.
   173 	s1 := PPUnresolvedParser new.
   173 	s1 := PPUnresolvedParser new.
   174 	s0 def: ($a asParser , s1 , $a asParser)
   174 	s0 def: ($a asParser , s1 , $a asParser)
   175 		/ ($b asParser , s1 , $b asParser)
   175 		/ ($b asParser , s1 , $b asParser)
   176 		/ ($c asParser , s1 , $c asParser).
   176 		/ ($c asParser , s1 , $c asParser).	
   177 	s1 def: s0 / nil asParser.
   177 	s1 def: s0 / nil asParser.
   178 	parser := s0 flatten end.
   178 	parser := s0 flatten end.
   179 
   179 
   180 	self assert: parser parse: 'aa' to: 'aa'.
   180 	self assert: parser parse: 'aa' to: 'aa'.
   181 	self assert: parser parse: 'bb' to: 'bb'.
   181 	self assert: parser parse: 'bb' to: 'bb'.
   182 	self assert: parser parse: 'cc' to: 'cc'.
   182 	self assert: parser parse: 'cc' to: 'cc'.
   183 
   183 	
   184 	self assert: parser parse: 'abba' to: 'abba'.
   184 	self assert: parser parse: 'abba' to: 'abba'.
   185 	self assert: parser parse: 'baab' to: 'baab'.
   185 	self assert: parser parse: 'baab' to: 'baab'.
   186 
   186 
   187 	self assert: parser parse: 'abccba' to: 'abccba'.
   187 	self assert: parser parse: 'abccba' to: 'abccba'.
   188 	self assert: parser parse: 'abaaba' to: 'abaaba'.
   188 	self assert: parser parse: 'abaaba' to: 'abaaba'.
   195 !
   195 !
   196 
   196 
   197 testParseAaaBbb
   197 testParseAaaBbb
   198 	"S0 ::= a S1 b
   198 	"S0 ::= a S1 b
   199 	 S1 ::= S0 | epsilon"
   199 	 S1 ::= S0 | epsilon"
   200 
   200 	
   201 	| s0 s1 parser |
   201 	| s0 s1 parser |
   202 	s0 := PPUnresolvedParser new.
   202 	s0 := PPUnresolvedParser new.
   203 	s1 := PPUnresolvedParser new.
   203 	s1 := PPUnresolvedParser new.
   204 	s0 def: $a asParser , s1 , $b asParser.
   204 	s0 def: $a asParser , s1 , $b asParser.
   205 	s1 def: s0 / nil asParser.
   205 	s1 def: s0 / nil asParser.
   221 	self assert: parser fail: 'aaabb'
   221 	self assert: parser fail: 'aaabb'
   222 !
   222 !
   223 
   223 
   224 testParseAaaaaa
   224 testParseAaaaaa
   225 	"S ::= a a S | epsilon"
   225 	"S ::= a a S | epsilon"
   226 
   226 	
   227 	| s0 s1 parser |
   227 	| s0 s1 parser |
   228 	s0 := PPUnresolvedParser new.
   228 	s0 := PPUnresolvedParser new.
   229 	s1 := $a asParser , $a asParser , s0.
   229 	s1 := $a asParser , $a asParser , s0.
   230 	s0 def: s1 / nil asParser.
   230 	s0 def: s1 / nil asParser.
   231 	parser := s0 flatten.
   231 	parser := s0 flatten.
   241 	self assert: parser parse: 'aaaaaaa' to: 'aaaaaa' end: 6
   241 	self assert: parser parse: 'aaaaaaa' to: 'aaaaaa' end: 6
   242 !
   242 !
   243 
   243 
   244 testParseAbAbAb
   244 testParseAbAbAb
   245 	"S ::= (A B)+"
   245 	"S ::= (A B)+"
   246 
   246 	
   247 	| parser |
   247 	| parser |
   248 	parser := ($a asParser , $b asParser) plus flatten.
   248 	parser := ($a asParser , $b asParser) plus flatten.
   249 
   249 
   250 	self assert: parser parse: 'ab' to: 'ab'.
   250 	self assert: parser parse: 'ab' to: 'ab'.
   251 	self assert: parser parse: 'abab' to: 'abab'.
   251 	self assert: parser parse: 'abab' to: 'abab'.
   254 
   254 
   255 	self assert: parser parse: 'abb' to: 'ab' end: 2.
   255 	self assert: parser parse: 'abb' to: 'ab' end: 2.
   256 	self assert: parser parse: 'ababa' to: 'abab' end: 4.
   256 	self assert: parser parse: 'ababa' to: 'abab' end: 4.
   257 	self assert: parser parse: 'abababb' to: 'ababab' end: 6.
   257 	self assert: parser parse: 'abababb' to: 'ababab' end: 6.
   258 	self assert: parser parse: 'ababababa' to: 'abababab' end: 8.
   258 	self assert: parser parse: 'ababababa' to: 'abababab' end: 8.
   259 
   259 	
   260 	self assert: parser fail: ''.
   260 	self assert: parser fail: ''.
   261 	self assert: parser fail: 'a'.
   261 	self assert: parser fail: 'a'.
   262 	self assert: parser fail: 'bab'
   262 	self assert: parser fail: 'bab'
   263 !
   263 !
   264 
   264 
   283 
   283 
   284 	self assert: parser parse: 'ac' to: 'a' end: 1.
   284 	self assert: parser parse: 'ac' to: 'a' end: 1.
   285 	self assert: parser parse: 'bc' to: 'b' end: 1.
   285 	self assert: parser parse: 'bc' to: 'b' end: 1.
   286 	self assert: parser parse: 'abc' to: 'ab' end: 2.
   286 	self assert: parser parse: 'abc' to: 'ab' end: 2.
   287 	self assert: parser parse: 'bac' to: 'ba' end: 2.
   287 	self assert: parser parse: 'bac' to: 'ba' end: 2.
   288 
   288 	
   289 	self assert: parser fail: ''.
   289 	self assert: parser fail: ''.
   290 	self assert: parser fail: 'c'
   290 	self assert: parser fail: 'c'
   291 !
   291 !
   292 
   292 
   293 testParseAnBnCn
   293 testParseAnBnCn
   294 	"PEGs for a non context- free language:
   294 	"PEGs for a non context- free language: 
   295 
   295 		
   296 		a^n , b^n , c^n
   296 		a^n , b^n , c^n
   297 
   297 		
   298 	S <- &P1 P2
   298 	S <- &P1 P2 
   299 	P1 <- AB 'c'
   299 	P1 <- AB 'c' 
   300 	AB <- 'a' AB 'b' / epsilon
   300 	AB <- 'a' AB 'b' / epsilon
   301 	P2 <- 'a'* BC end
   301 	P2 <- 'a'* BC end
   302 	BC <- 'b' BC 'c' / epsilon"
   302 	BC <- 'b' BC 'c' / epsilon"
   303 
   303 	
   304 	| s p1 ab p2 bc |
   304 	| s p1 ab p2 bc |
   305 	s := PPUnresolvedParser new.
   305 	s := PPUnresolvedParser new.
   306 	p1 := PPUnresolvedParser new.
   306 	p1 := PPUnresolvedParser new.
   307 	ab := PPUnresolvedParser new.
   307 	ab := PPUnresolvedParser new.
   308 	p2 := PPUnresolvedParser new.
   308 	p2 := PPUnresolvedParser new.
   309 	bc := PPUnresolvedParser new.
   309 	bc := PPUnresolvedParser new.
   310 
   310 	
   311 	s def: (p1 and , p2 end) flatten.
   311 	s def: (p1 and , p2 end) flatten.
   312 	p1 def: ab , $c asParser.
   312 	p1 def: ab , $c asParser.
   313 	ab def: ($a asParser , ab , $b asParser) optional.
   313 	ab def: ($a asParser , ab , $b asParser) optional.
   314 	p2 def: $a asParser star , bc.
   314 	p2 def: $a asParser star , bc.
   315 	bc def: ($b asParser , bc , $c asParser) optional.
   315 	bc def: ($b asParser , bc , $c asParser) optional.
   316 
   316 	
   317 	self assert: s parse: 'abc' to: 'abc'.
   317 	self assert: s parse: 'abc' to: 'abc'.
   318 	self assert: s parse: 'aabbcc' to: 'aabbcc'.
   318 	self assert: s parse: 'aabbcc' to: 'aabbcc'.
   319 	self assert: s parse: 'aaabbbccc' to: 'aaabbbccc'.
   319 	self assert: s parse: 'aaabbbccc' to: 'aaabbbccc'.
   320 
   320 
   321 	self assert: s fail: 'bc'.
   321 	self assert: s fail: 'bc'.
   372 
   372 
   373 	self assert: self number parse: '1..' to: '1' end: 1.
   373 	self assert: self number parse: '1..' to: '1' end: 1.
   374 	self assert: self number parse: '12-' to: '12' end: 2.
   374 	self assert: self number parse: '12-' to: '12' end: 2.
   375 	self assert: self number parse: '12.3.' to: '12.3' end: 4.
   375 	self assert: self number parse: '12.3.' to: '12.3' end: 4.
   376 	self assert: self number parse: '12.34.' to: '12.34' end: 5.
   376 	self assert: self number parse: '12.34.' to: '12.34' end: 5.
   377 
   377 	
   378 	self assert: self number parse: '-1' to: '-1'.
   378 	self assert: self number parse: '-1' to: '-1'.
   379 	self assert: self number parse: '-12' to: '-12'.
   379 	self assert: self number parse: '-12' to: '-12'.
   380 	self assert: self number parse: '-12.3' to: '-12.3'.
   380 	self assert: self number parse: '-12.3' to: '-12.3'.
   381 	self assert: self number parse: '-12.34' to: '-12.34'.
   381 	self assert: self number parse: '-12.34' to: '-12.34'.
   382 
   382 	
   383 	self assert: self number fail: ''.
   383 	self assert: self number fail: ''.
   384 	self assert: self number fail: '-'.
   384 	self assert: self number fail: '-'.
   385 	self assert: self number fail: '.'.
   385 	self assert: self number fail: '.'.
   386 	self assert: self number fail: '.1'
   386 	self assert: self number fail: '.1'
   387 !
   387 !
   395 
   395 
   396 	self assert: return parse: '^1' to: #(return '1').
   396 	self assert: return parse: '^1' to: #(return '1').
   397 	self assert: return parse: '^12' to: #(return '12').
   397 	self assert: return parse: '^12' to: #(return '12').
   398 	self assert: return parse: '^ 123' to: #(return '123').
   398 	self assert: return parse: '^ 123' to: #(return '123').
   399 	self assert: return parse: '^  1234' to: #(return '1234').
   399 	self assert: return parse: '^  1234' to: #(return '1234').
   400 
   400 	
   401 	self assert: return fail: '1'.
   401 	self assert: return fail: '1'.
   402 	self assert: return fail: '^'
   402 	self assert: return fail: '^'
   403 ! !
   403 ! !
   404 
   404 
   405 !PPComposedTest class methodsFor:'documentation'!
   405 !PPComposedTest class methodsFor:'documentation'!
   406 
   406 
       
   407 version
       
   408     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPComposedTest.st,v 1.3 2012-05-04 21:59:40 vrany Exp $'
       
   409 !
       
   410 
       
   411 version_CVS
       
   412     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPComposedTest.st,v 1.3 2012-05-04 21:59:40 vrany Exp $'
       
   413 !
       
   414 
   407 version_SVN
   415 version_SVN
   408     ^ '$Id: PPComposedTest.st,v 1.2 2012-01-13 11:22:50 cg Exp $'
   416     ^ '§Id: PPComposedTest.st 4 2010-12-18 17:02:23Z kursjan §'
   409 ! !
   417 ! !