analyzer/tests/PPAnalyzerTest.st
changeset 402 1d7503124bc8
parent 380 8fe3cb4e607f
child 425 0a5c4929af56
equal deleted inserted replaced
401:538267cab6ec 402:1d7503124bc8
     1 "{ Encoding: utf8 }"
       
     2 
       
     3 "{ Package: 'stx:goodies/petitparser/analyzer/tests' }"
     1 "{ Package: 'stx:goodies/petitparser/analyzer/tests' }"
     4 
     2 
     5 PPAbstractParserTest subclass:#PPAnalyzerTest
     3 PPAbstractParserTest subclass:#PPAnalyzerTest
     6 	instanceVariableNames:''
     4 	instanceVariableNames:''
     7 	classVariableNames:''
     5 	classVariableNames:''
    17 ! !
    15 ! !
    18 
    16 
    19 !PPAnalyzerTest methodsFor:'accessing'!
    17 !PPAnalyzerTest methodsFor:'accessing'!
    20 
    18 
    21 grammarA
    19 grammarA
    22 	"Güting, Erwig, Übersetzerbau, Springer (p.63)"
    20 	"Güting, Erwig, Übersetzerbau, Springer (p.63)"
    23 
    21 
    24 	| grammar |
    22 	| grammar |
    25 	grammar := Dictionary new.
    23 	grammar := Dictionary new.
    26 	
    24 	
    27 	" terminals "
    25 	" terminals "
    63 	"A highly recrusive grammar."
    61 	"A highly recrusive grammar."
    64 
    62 
    65 	| grammar |
    63 	| grammar |
    66 	grammar := PPUnresolvedParser new.
    64 	grammar := PPUnresolvedParser new.
    67 	grammar def: (grammar , $+ asParser , grammar) / $1 asParser.
    65 	grammar def: (grammar , $+ asParser , grammar) / $1 asParser.
       
    66 	^grammar
       
    67 !
       
    68 
       
    69 grammarD
       
    70 	"A highly ambiguous grammar from: Saichaitanya Jampana. Exploring the problem of ambiguity in context-free grammars. Master's thesis, Oklahoma State University, July 2005."
       
    71 
       
    72 	| grammar |
       
    73 	grammar := Dictionary new.
       
    74 	#(S A a B b)			do: [ :each | grammar at: each put: (PPUnresolvedParser named: each) ].
       
    75 
       
    76 	(grammar at: #a)		def: $a asParser.
       
    77 	(grammar at: #b)		def: $b asParser.
       
    78 		
       
    79 	(grammar at: #S)		def: (grammar at: #A) , (grammar at: #B) / (grammar at: #a).
       
    80 	(grammar at: #A)		def: (grammar at: #S) , (grammar at: #B) / (grammar at: #b).
       
    81 	(grammar at: #B)		def: (grammar at: #B) , (grammar at: #A) / (grammar at: #a).
       
    82 		
    68 	^ grammar
    83 	^ grammar
    69 !
       
    70 
       
    71 grammarD
       
    72         "A highly ambiguous grammar from: Saichaitanya Jampana. Exploring the problem of ambiguity in context-free grammars. Master’s thesis, Oklahoma State University, July 2005."
       
    73 
       
    74         | grammar |
       
    75         grammar := Dictionary new.
       
    76         #(S A a B b)                    do: [ :each | grammar at: each put: (PPUnresolvedParser named: each) ].
       
    77 
       
    78         (grammar at: #a)                def: $a asParser.
       
    79         (grammar at: #b)                def: $b asParser.
       
    80 
       
    81         (grammar at: #S)                def: (grammar at: #A) , (grammar at: #B) / (grammar at: #a).
       
    82         (grammar at: #A)                def: (grammar at: #S) , (grammar at: #B) / (grammar at: #b).
       
    83         (grammar at: #B)                def: (grammar at: #B) , (grammar at: #A) / (grammar at: #a).
       
    84 
       
    85         ^ grammar
       
    86 !
    84 !
    87 
    85 
    88 grammarE
    86 grammarE
    89 	"The most stupid parser, it just references itself and never consumes anything. All algorithms should survive such an attack."
    87 	"The most stupid parser, it just references itself and never consumes anything. All algorithms should survive such an attack."
    90 
    88 
    96 
    94 
    97 !PPAnalyzerTest methodsFor:'testing'!
    95 !PPAnalyzerTest methodsFor:'testing'!
    98 
    96 
    99 testAllNamedParsers
    97 testAllNamedParsers
   100 	| p1 p2 p3 |
    98 	| p1 p2 p3 |
   101 	p1 := (#digit asParser name: 'a').
    99 	p1 := #digit asParser name: 'a'.
   102 	p2 := (#digit asParser name: 'b') star.
   100 	p2 := (#digit asParser name: 'b') star.
   103 	p3 := (#digit asParser name: 'c') token end.
   101 	p3 := (#digit asParser name: 'c') token end.
   104 	self assert: p1 allNamedParsers size = 1.
   102 	self assert: p1 allNamedParsers size equals: 1.
   105 	self assert: p1 allNamedParsers first name = 'a'.
   103 	self assert: p1 allNamedParsers first name equals: 'a'.
   106 	self assert: p2 allNamedParsers size = 1.
   104 	self assert: p2 allNamedParsers size equals: 1.
   107 	self assert: p2 allNamedParsers first name = 'b'.
   105 	self assert: p2 allNamedParsers first name equals: 'b'.
   108 	self assert: p3 allNamedParsers size = 1.
   106 	self assert: p3 allNamedParsers size equals: 1.
   109 	self assert: p3 allNamedParsers first name = 'c'
   107 	self assert: p3 allNamedParsers first name equals: 'c'
   110 !
   108 !
   111 
   109 
   112 testAllParsers
   110 testAllParsers
   113 	| p1 p2 p3 |
   111 	| p1 p2 p3 |
   114 	p1 := #lowercase asParser.
   112 	p1 := #lowercase asParser.
   115 	p2 := p1 ==> #asUppercase.
   113 	p2 := p1 ==> #asUppercase.
   116 	p3 := PPUnresolvedParser new.
   114 	p3 := PPUnresolvedParser new.
   117 	p3 def: p2 / p3.
   115 	p3 def: p2 / p3.
   118 	self assert: p1 allParsers size = 1.
   116 	self assert: p1 allParsers size equals: 1.
   119 	self assert: p2 allParsers size = 2.
   117 	self assert: p2 allParsers size equals: 2.
   120 	self assert: p3 allParsers size = 3
   118 	self assert: p3 allParsers size equals: 3
   121 !
   119 !
   122 
   120 
   123 testInnerChildren
   121 testInnerChildren
   124 	| p1 p2 p3 |
   122 	| p1 p2 p3 |
   125 	p1 := (#digit asParser name: 'a').
   123 	p1 := #digit asParser name: 'a'.
   126 	p2 := (#digit asParser star name: 'b').
   124 	p2 := #digit asParser star name: 'b'.
   127 	p3 := (#digit asParser name: 'c') token star end.
   125 	p3 := (#digit asParser name: 'c') token star end.
   128 	self assert: p1 innerChildren isEmpty.
   126 	self assert: p1 innerChildren isEmpty.
   129 	self assert: p2 innerChildren size = 1.
   127 	self assert: p2 innerChildren size equals: 1.
   130 	self assert: (p2 innerChildren allSatisfy: [ :each | each name isNil ]).
   128 	self assert: (p2 innerChildren allSatisfy: [ :each | each name isNil ]).
   131 	self assert: p3 innerChildren size = 2.
   129 	self assert: p3 innerChildren size equals: 2.
   132 	self assert: (p3 innerChildren allSatisfy: [ :each | each name isNil ])
   130 	self assert: (p3 innerChildren allSatisfy: [ :each | each name isNil ])
   133 !
   131 !
   134 
   132 
   135 testIsNullable
   133 testIsNullable
   136 	self assert: $a asParser star isNullable.
   134 	self assert: $a asParser star isNullable.
   161 	self deny: ($a asParser not) isTerminal
   159 	self deny: ($a asParser not) isTerminal
   162 !
   160 !
   163 
   161 
   164 testNamedChildren
   162 testNamedChildren
   165 	| p1 p2 p3 p4 |
   163 	| p1 p2 p3 p4 |
   166 	p1 := (#digit asParser name: 'a').
   164 	p1 := #digit asParser name: 'a'.
   167 	p2 := (#digit asParser name: 'b') star.
   165 	p2 := (#digit asParser name: 'b') star.
   168 	p3 := (#digit asParser name: 'c') token end.
   166 	p3 := (#digit asParser name: 'c') token end.
   169 	p4 := ((#digit asParser name: 'c') token name: 'd') end.
   167 	p4 := ((#digit asParser name: 'c') token name: 'd') end.
   170 	self assert: p1 namedChildren isEmpty.
   168 	self assert: p1 namedChildren isEmpty.
   171 	self assert: p2 namedChildren size = 1.
   169 	self assert: p2 namedChildren size equals: 1.
   172 	self assert: p2 namedChildren first name = 'b'.
   170 	self assert: p2 namedChildren first name equals: 'b'.
   173 	self assert: p3 namedChildren size = 1.
   171 	self assert: p3 namedChildren size equals: 1.
   174 	self assert: p3 namedChildren first name = 'c'.
   172 	self assert: p3 namedChildren first name equals: 'c'.
   175 	self assert: p4 namedChildren size = 1.
   173 	self assert: p4 namedChildren size equals: 1.
   176 	self assert: p4 namedChildren first name = 'd'
   174 	self assert: p4 namedChildren first name equals: 'd'
   177 ! !
   175 ! !
   178 
   176 
   179 !PPAnalyzerTest methodsFor:'testing-cycleset'!
   177 !PPAnalyzerTest methodsFor:'testing-cycleset'!
   180 
   178 
   181 testCycleSetGrammarA
   179 testCycleSetGrammarA
   188 
   186 
   189 testCycleSetGrammarC
   187 testCycleSetGrammarC
   190 	| grammar cycleSet |
   188 	| grammar cycleSet |
   191 	grammar := self grammarC.
   189 	grammar := self grammarC.
   192 	cycleSet := grammar cycleSet.
   190 	cycleSet := grammar cycleSet.
   193 	self assert: (cycleSet size = 2).
   191 	self assert: cycleSet size equals: 2.
   194 	self assert: (cycleSet includes: grammar)
   192 	self assert: (cycleSet includes: grammar)
   195 !
   193 !
   196 
   194 
   197 testCycleSetGrammarD
   195 testCycleSetGrammarD
   198 	| grammar cycleSet |
   196 	| grammar cycleSet |
   199 	grammar := self grammarD.
   197 	grammar := self grammarD.
   200 	
       
   201 	cycleSet := (grammar at: #S) cycleSet.
   198 	cycleSet := (grammar at: #S) cycleSet.
   202 	self assert: (cycleSet size = 4).
   199 	self assert: cycleSet size equals: 4.
   203 	self assert: (cycleSet includes: (grammar at: #A)).
   200 	self assert: (cycleSet includes: (grammar at: #A)).
   204 	self assert: (cycleSet includes: (grammar at: #S)).
   201 	self assert: (cycleSet includes: (grammar at: #S)).
   205 	
       
   206 	cycleSet := (grammar at: #A) cycleSet.
   202 	cycleSet := (grammar at: #A) cycleSet.
   207 	self assert: (cycleSet size = 4).
   203 	self assert: cycleSet size equals: 4.
   208 	self assert: (cycleSet includes: (grammar at: #A)).
   204 	self assert: (cycleSet includes: (grammar at: #A)).
   209 	self assert: (cycleSet includes: (grammar at: #S)).
   205 	self assert: (cycleSet includes: (grammar at: #S)).
   210 
       
   211 	cycleSet := (grammar at: #B) cycleSet.
   206 	cycleSet := (grammar at: #B) cycleSet.
   212 	self assert: (cycleSet size = 2).
   207 	self assert: cycleSet size equals: 2.
   213 	self assert: (cycleSet includes: (grammar at: #B))
   208 	self assert: (cycleSet includes: (grammar at: #B))
   214 !
   209 !
   215 
   210 
   216 testCycleSetGrammarE
   211 testCycleSetGrammarE
   217 	| grammar cycleSet |
   212 	| grammar cycleSet |
   218 	grammar := self grammarE.
   213 	grammar := self grammarE.
   219 	cycleSet := grammar cycleSet.
   214 	cycleSet := grammar cycleSet.
   220 	self assert: (cycleSet size = 1).
   215 	self assert: cycleSet size equals: 1.
   221 	self assert: (cycleSet includes: grammar)
   216 	self assert: (cycleSet includes: grammar)
   222 !
   217 !
   223 
   218 
   224 testCycleSetInChoice
   219 testCycleSetInChoice
   225 	| parser cycleSet |
   220 	| parser cycleSet |
   226 	parser := PPUnresolvedParser new.
   221 	parser := PPUnresolvedParser new.
   227 	parser def: parser / $a asParser.
   222 	parser def: parser / $a asParser.
   228 	cycleSet := parser cycleSet.
   223 	cycleSet := parser cycleSet.
   229 	self assert: (cycleSet size = 1).
   224 	self assert: cycleSet size equals: 1.
   230 	self assert: (cycleSet includes: parser).
   225 	self assert: (cycleSet includes: parser).
   231 	
       
   232 	parser := PPUnresolvedParser new.
   226 	parser := PPUnresolvedParser new.
   233 	parser def: $a asParser / parser.
   227 	parser def: $a asParser / parser.
   234 	cycleSet := parser cycleSet.
   228 	cycleSet := parser cycleSet.
   235 	self assert: (cycleSet size = 1).
   229 	self assert: cycleSet size equals: 1.
   236 	self assert: (cycleSet includes: parser).
   230 	self assert: (cycleSet includes: parser)
   237 !
   231 !
   238 
   232 
   239 testCycleSetInSequence
   233 testCycleSetInSequence
   240 	| parser cycleSet |
   234 	| parser cycleSet |
   241 	parser := PPUnresolvedParser new.
   235 	parser := PPUnresolvedParser new.
   242 	parser def: parser , $a asParser.
   236 	parser def: parser , $a asParser.
   243 	cycleSet := parser cycleSet.
   237 	cycleSet := parser cycleSet.
   244 	self assert: (cycleSet size = 1).
   238 	self assert: cycleSet size equals: 1.
   245 	self assert: (cycleSet includes: parser).
   239 	self assert: (cycleSet includes: parser).
   246 	
       
   247 	parser := PPUnresolvedParser new.
   240 	parser := PPUnresolvedParser new.
   248 	parser def: nil asParser , parser.
   241 	parser def: nil asParser , parser.
   249 	cycleSet := parser cycleSet.
   242 	cycleSet := parser cycleSet.
   250 	self assert: (cycleSet size = 1).
   243 	self assert: cycleSet size equals: 1.
   251 	self assert: (cycleSet includes: parser).
   244 	self assert: (cycleSet includes: parser).
   252 	
       
   253 	parser := PPUnresolvedParser new.
   245 	parser := PPUnresolvedParser new.
   254 	parser def: $a asParser , parser.
   246 	parser def: $a asParser , parser.
   255 	cycleSet := parser cycleSet.
   247 	cycleSet := parser cycleSet.
   256 	self assert: cycleSet isEmpty
   248 	self assert: cycleSet isEmpty
   257 ! !
   249 ! !