compiler/tests/PPCLL1Test.st
changeset 452 9f4558b3be66
child 459 4751c407bb40
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/tests/PPCLL1Test.st	Sun May 10 06:28:36 2015 +0100
@@ -0,0 +1,251 @@
+"{ Package: 'stx:goodies/petitparser/compiler/tests' }"
+
+"{ NameSpace: Smalltalk }"
+
+PPAbstractParserTest subclass:#PPCLL1Test
+	instanceVariableNames:'parser result context node compiler id node2 id2 id1 node1 node3
+		arguments configuration'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitCompiler-Tests-Core'
+!
+
+!PPCLL1Test methodsFor:'as yet unclassified'!
+
+assert: p parse: whatever
+    ^ result := super assert: p parse: whatever.
+!
+
+cleanClass
+    | parserClass |
+    parserClass := (Smalltalk at: arguments name ifAbsent: [nil]).
+    parserClass notNil ifTrue:[ 
+        self flag: 'uncomment'.
+"		parserClass removeFromSystem"
+    ].
+!
+
+context	
+    ^ context := PPCProfilingContext new
+!
+
+parse: whatever
+    ^ result := super parse: whatever.
+!
+
+setUp
+    arguments := PPCArguments default
+        profile: true;
+        guards: false;
+        yourself.
+        
+    configuration := PPCLL1Configuration new
+        arguments: arguments;
+        yourself.
+        
+    self cleanClass.
+!
+
+tearDown
+    self cleanClass
+!
+
+testChoiceOrder
+    parser := (
+        'a' asParser token, 'b' asParser token / 
+        'a' asParser token) 
+        compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'ab'.
+    self assert: result first inputValue = 'a'.
+    self assert: result second inputValue = 'b'.
+
+    self assert: parser parse: 'a'.
+    self assert: result inputValue = 'a'.
+
+    self assert: parser fail: '_'.
+    
+!
+
+testChoiceOrder2
+    | p1 p2 |
+    p1 := 'a' asParser token, 'b' asParser token.
+    p2 := 'b' asParser token / 'a' asParser token.
+    
+    parser := p1 / p2	compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'ab'.
+    self assert: result first inputValue = 'a'.
+    self assert: result second inputValue = 'b'.
+
+    self assert: parser parse: 'a'.
+    self assert: result inputValue = 'a'.
+
+    self assert: parser parse: 'b'.
+    self assert: result inputValue = 'b'.
+
+    self assert: parser fail: 'c'.
+    
+!
+
+testChoiceOrder3
+    | p1 p2 a1 a2 |
+    a1 := 'a' asParser token name: 't1'; yourself.
+    a2 := 'a' asParser token name: 't2'; yourself.
+    
+    p1 := a1, 'b' asParser token.
+    p2 := a2.
+    
+    parser := p1 / p2	compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'ab'.
+    self assert: result first inputValue = 'a'.
+    self assert: result second inputValue = 'b'.
+
+    self assert: parser parse: 'a'.
+    self assert: result inputValue = 'a'.
+
+    self assert: parser fail: 'b'.
+    
+!
+
+testChoiceOrder4
+    | p1 p2 a1 a2 |
+    a1 := 'a' asParser token name: 't1'; yourself.
+    a2 := 'a' asParser token name: 't2'; yourself.
+    
+    p1 := a1, 'b' asParser token.
+    p2 := 'b' asParser token / a2.
+    
+    parser := p1 / p2	compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'ab'.
+    self assert: result first inputValue = 'a'.
+    self assert: result second inputValue = 'b'.
+
+    self assert: parser parse: 'a'.
+    self assert: result inputValue = 'a'.
+
+    self assert: parser parse: 'b'.
+    self assert: result inputValue = 'b'.
+
+    self assert: parser fail: 'c'.
+    
+!
+
+testCompileChoice
+    parser := ('foo' asParser / 'bar' asParser) compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'foo' to: 'foo'.
+    self assert: parser parse: 'bar' to: 'bar'.
+    self assert: parser fail: '_'.
+    
+!
+
+testCompileChoice2
+    parser := ('foo' asParser token trim / 'bar' asParser token trim) compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'foo'.
+    self assert: result inputValue = 'foo'.
+    self assert: parser parse: 'bar'.
+    self assert: result inputValue = 'bar'.
+    self assert: parser fail: '_'.
+    
+!
+
+testCompileLiteral
+    parser := 'foo' asParser token compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'foo'.
+    self assert: result inputValue = 'foo'.
+    self assert: parser fail: 'boo'.
+!
+
+testCompileSequence
+    parser := ('foo' asParser token), ('bar' asParser token) 
+        compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'foobar'.
+    self assert: result first inputValue = 'foo'.
+    self assert: result second inputValue = 'bar'.
+!
+
+testCompileTokenComplex2
+    |  a b argumentsWith  |
+    "based on the PPSmalltlakGrammar>>blockArgumentsWith"
+    a := $| asParser smalltalkToken
+        yourself.
+    b := $] asParser smalltalkToken
+        yourself.		
+    argumentsWith := (a / b and ==> [:t | ]) wrapped
+        name: 'argumentsWith'; 
+        yourself.
+
+    parser := argumentsWith compileWithConfiguration: configuration.
+    self assert: parser parse: '|'.
+
+    parser := argumentsWith compileWithConfiguration: configuration.
+    self assert: parser parse: ']'.
+!
+
+testCompileTokenComplex3
+    | choice1 choice2 a1 b1 a2 b2 tricky |
+    a1 := $| asParser token
+        yourself.
+    b1 := $] asParser token
+        yourself.		
+    choice1 := (a1 / b1) wrapped
+        name: 'choice1'; 
+        yourself.
+
+    a2 := $| asParser token
+        yourself.
+    b2 := $] asParser token
+        yourself.		
+    choice2 := (a2 / b2) wrapped
+        name: 'choice1'; 
+        yourself.
+    
+    tricky := (a1 asParser, choice1) / (b2 asParser, choice2).
+
+    parser := tricky compileWithConfiguration: configuration.
+    self assert: parser parse: '||'.
+
+    parser := tricky compileWithConfiguration: configuration.
+    self assert: parser parse: '|]'.
+
+    parser := tricky compileWithConfiguration: configuration.
+    self assert: parser parse: ']|'.
+
+    parser := tricky compileWithConfiguration: configuration.
+    self assert: parser parse: ']]'.
+!
+
+testCompileTrim
+    parser := 'foo' asParser token trim end compileWithConfiguration: configuration.
+    
+    self assert: parser parse: 'foo'.
+    self assert: result inputValue = 'foo'.
+
+    self assert: parser parse: 'foo  '.
+    self assert: result inputValue = 'foo'.
+
+
+    self assert: parser parse: '  foo'.
+    self assert: result inputValue = 'foo'.
+
+    self assert: parser fail: 'boo'.
+!
+
+testTokenName
+    | token |
+    token := 'foo' asParser token name: 'fooToken'; yourself.
+    parser := token plus
+        compileWithConfiguration: configuration.
+
+    self assert: parser parse: 'foofoo'.
+    self assert: result first inputValue = 'foo'.
+    self assert: result second inputValue = 'foo'.
+    self assert: (parser class methodDictionary includesKey: #fooToken).
+! !
+