--- a/compiler/tests/PPCCompilerTest.st Wed Nov 19 10:52:37 2014 +0000
+++ b/compiler/tests/PPCCompilerTest.st Mon Nov 24 00:09:23 2014 +0000
@@ -14,19 +14,6 @@
^ context := PPCProfilingContext new
! !
-!PPCCompilerTest methodsFor:'running'!
-
-tearDown
- | parserClass |
-
- parserClass := (Smalltalk at: #PPGeneratedParser).
- parserClass notNil ifTrue:[
- parserClass removeFromSystem
- ].
-
- "Created: / 30-10-2014 / 22:56:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
!PPCCompilerTest methodsFor:'test support'!
assert: p parse: whatever
@@ -65,6 +52,15 @@
parse: whatever
^ result := super parse: whatever.
+!
+
+tearDown
+ | parserClass |
+
+ parserClass := (Smalltalk at: #PPGeneratedParser ifAbsent: [nil]).
+ parserClass notNil ifTrue:[
+ parserClass removeFromSystem
+ ].
! !
!PPCCompilerTest methodsFor:'tests - compiling'!
@@ -195,30 +191,28 @@
!
testCompileNotLiteral
- parser := 'foo' asParser not compile.
- self assert: parser class methodDictionary size = 2.
+ parser := 'foo' asParser not compile.
+ self assert: parser class methodDictionary size = 2.
- self assert: parser parse: 'bar' to: nil end: 0.
-
- self assert: parser fail: 'foo'.
- self assert: parser parse: '' to: nil end: 0.
+ self assert: parser parse: 'bar' to: nil end: 0.
+
+ self assert: parser fail: 'foo'.
+ self assert: parser parse: '' to: nil end: 0.
- parser := '''' asParser not compile.
- self assert: parser class methodDictionary size = 2.
+ parser := '''' asParser not compile.
+ self assert: parser class methodDictionary size = 2.
- self assert: parser parse: 'a' to: nil end: 0.
- self assert: parser fail: ''''.
- self assert: parser parse: '' to: nil end: 0.
+ self assert: parser parse: 'a' to: nil end: 0.
+ self assert: parser fail: ''''.
+ self assert: parser parse: '' to: nil end: 0.
- parser := ('foo' asParser, 'bar' asParser not) compile.
- self assert: parser parse: 'foofoo' to: { 'foo'. nil } end: 3.
-
- parser := ('foo' asParser, 'foo' asParser not, #any asParser star) compile.
- self assert: parser parse: 'foobar' to: { 'foo'. nil . #($b $a $r) } end: 6.
- self assert: parser fail: 'foofoo'.
-
- "Modified: / 05-11-2014 / 23:18:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ parser := ('foo' asParser, 'bar' asParser not) compile.
+ self assert: parser parse: 'foofoo' to: { 'foo'. nil } end: 3.
+
+ parser := ('foo' asParser, 'foo' asParser not, #any asParser star) compile.
+ self assert: parser parse: 'foobar' to: { 'foo'. nil . #($b $a $r) } end: 6.
+ self assert: parser fail: 'foofoo'.
!
testCompileOptional
@@ -313,7 +307,7 @@
testCompileSymbolBlock
parser := (#letter asParser) plus ==> #second.
- parser := parser compile: #PPCompilerTest.
+ parser := parser compile.
self assert: parser parse: 'foo' to: $o.
self assert: parser parse: 'bar' to: $a.
@@ -321,6 +315,28 @@
self should: [ parser parse: 'f' ] raise: Error.
!
+testCompileTrimmingToken
+ | token1 token2 |
+ token1 := (#letter asParser) plus trimmingToken.
+ token2 := (#letter asParser) plus trimmingToken.
+
+ parser := (token1, token2) compile.
+
+ self assert: parser parse: 'foo bar'.
+ self assert: parser parse: ' foo bar '.
+!
+
+testCompileTrimmingToken2
+ | token1 token2 |
+ token1 := (#letter asParser) plus trimmingToken.
+ token2 := (#letter asParser) plus trimmingToken / 'foo' asParser trimmingToken.
+
+ parser := (token1, token2) compile.
+
+ self assert: parser parse: 'foo bar'.
+ self assert: parser parse: ' foo bar '.
+!
+
testTrim
parser := self compile: $a asParser trim.
@@ -369,37 +385,22 @@
block := ${ asParser, p1, $} asParser / nil asParser.
p1 setParser: block.
- parser := block compile: #PPCompilerTest.
+ parser := block compile.
self assert: parser parse: '{}' to: { ${. nil . $} }.
self assert: parser parse: '{{}}' to: { ${. { ${ . nil . $} } . $} }.
!
-testGuardSmalltlakToken
- | charSet |
- charSet := PPCCompiler new guardCharSet: 'foo' asParser smalltalkToken.
- self assert: (charSet equals: (PPCharSetPredicate on: [ :char | char = $f ])).
-
- parser := (#letter asParser, #word asParser star) smalltalkToken compileWithParameters: { #profile -> true }.
- self assert: parser parse: 'bar'.
- self assert: (context invocations anySatisfy: [ :e | e beginsWith: 'seq' ]).
+testSmalltalkToken
+ parser := (#letter asParser, (#digit asParser / #letter asParser) star) smalltalkToken compileWithParameters: {#profile -> true}.
- self assert: parser fail: '123'.
- self assert: (context invocations noneSatisfy: [ :e | e beginsWith: 'seq' ]).
-!
-
-testSmalltalkToken
- parser := (#letter asParser, (#digit asParser / #letter asParser) star) smalltalkToken compileWithParameters: {#profile -> true}.
-
- self assert: parser class methodDictionary size = 6.
- self assert: parser parse: 'foo'.
- self assert: result inputValue = 'foo'.
- self assert: context invocationCount = 9.
- self assert: context rememberCount = 0.
- self assert: context lwRememberCount = 1.
- self assert: context lwRestoreCount = 0.
-
- "Modified: / 05-11-2014 / 23:17:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ self assert: parser class methodDictionary size = 6.
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
+ self assert: context invocationCount = 9.
+ self assert: context rememberCount = 0.
+ self assert: context lwRememberCount = 1.
+ self assert: context lwRestoreCount = 0.
!
testSmalltalkToken2
@@ -408,7 +409,7 @@
name: 'identifier';
yourself.
- parser := (id, $: asParser) smalltalkToken
+ parser := (id wrapped, $: asParser) smalltalkToken
name: 'kw';
yourself.
@@ -428,48 +429,94 @@
!
testToken2
- parser := (#letter asParser, (#digit asParser / #letter asParser) star) token compileWithParameters: {#profile -> true}.
-
- self assert: parser class methodDictionary size = 5.
- self assert: parser parse: 'foo'.
- self assert: result inputValue = 'foo'.
- self assert: context invocationCount = 7.
- self assert: context rememberCount = 0.
- self assert: context lwRememberCount = 1.
- self assert: context lwRestoreCount = 0.
-
- "Modified: / 05-11-2014 / 23:17:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ parser := (#letter asParser, (#digit asParser / #letter asParser) star) token compileWithParameters: {#profile -> true}.
+
+ self assert: parser class methodDictionary size = 5.
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
+ self assert: context invocationCount = 7.
+ self assert: context rememberCount = 0.
+ self assert: context lwRememberCount = 1.
+ self assert: context lwRestoreCount = 0.
!
testTrimmingToken
- parser := (#letter asParser, (#digit asParser / #letter asParser) star) trimmingToken compileWithParameters: { #profile -> true }.
+ parser := (#letter asParser, (#digit asParser / #letter asParser) star) trimmingToken compileWithParameters: { #profile -> true }.
- self assert: parser class methodDictionary size = 6.
+ self assert: parser class methodDictionary size = 5.
- self assert: parser parse: 'foo'.
- self assert: result inputValue = 'foo'.
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
- self assert: context invocationCount = 9.
- self assert: context rememberCount = 0.
- self assert: context lwRememberCount = 1.
- self assert: context lwRestoreCount = 0.
+ self assert: context invocationCount = 7.
+ self assert: context rememberCount = 0.
+ self assert: context lwRememberCount = 1.
+ self assert: context lwRestoreCount = 0.
- self assert: parser parse: ' foo '.
- self assert: result inputValue = 'foo'.
+ self assert: parser parse: ' foo '.
+ self assert: result inputValue = 'foo'.
- self assert: parser fail: '123'.
+ self assert: parser fail: '123'.
- self assert: context invocationCount = 3.
- self assert: context rememberCount = 0.
- self assert: context lwRememberCount = 0.
- self assert: context lwRestoreCount = 0.
+ self assert: context invocationCount = 2.
+ self assert: context rememberCount = 0.
+ self assert: context lwRememberCount = 0.
+ self assert: context lwRestoreCount = 0.
- self assert: parser fail: ''.
+ self assert: parser fail: ''.
+!
+
+testTrimmingTokenNested
+ | identifier kw |
+ kw := 'false' asParser trimmingToken name: #kw.
+ identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
+
+ parser := identifier / kw.
+ parser := parser compileWithParameters: { #profile -> true }.
+ self assert: parser class methodDictionary size = 6.
+
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
+
+ self assert: parser parse: 'false'.
+ self assert: result inputValue = 'false'.
+!
- "Modified: / 06-11-2014 / 00:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+testTrimmingTokenNested2
+ | identifier kw |
+ kw := 'false' asParser trimmingToken name: #kw.
+ identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
+
+ parser := identifier / kw.
+ parser := parser compileWithParameters: { #profile -> true }.
+ self assert: parser class methodDictionary size = 6.
+
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
+
+ self assert: parser parse: 'false'.
+ self assert: result inputValue = 'false'.
+!
+
+testTrimmingTokenNested3
+ | identifier kw |
+ kw := ('false' asParser, #word asParser not) trimmingToken name: #kw.
+ identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
+
+ parser := identifier / kw.
+ parser := parser compileWithParameters: { #profile -> true }.
+ self assert: parser class methodDictionary size = 9.
+ self assert: (parser class methods anySatisfy: [ :m | m selector = #kw ]).
+ self assert: (parser class methods anySatisfy: [ :m | m selector = #kw_fast ]).
+
+ self assert: parser parse: 'foo'.
+ self assert: result inputValue = 'foo'.
+
+ self assert: parser parse: 'false'.
+ self assert: result inputValue = 'false'.
! !
!PPCCompilerTest methodsFor:'tests - first set'!
@@ -606,6 +653,15 @@
self assert: (charSet equals: (PPCharSetPredicate on: [ :char | (char = $f) or: [ char = $b ]] )).
!
+testGuardSmalltlakToken
+ parser := (#letter asParser, #word asParser star) smalltalkToken compileWithParameters: { #profile -> true }.
+ self assert: parser parse: 'bar'.
+ self assert: (context invocations anySatisfy: [ :e | e beginsWith: 'seq' ]).
+
+ self assert: parser fail: '123'.
+ self assert: (context invocations noneSatisfy: [ :e | e beginsWith: 'seq' ]).
+!
+
testSequenceGuard
parser := ((#any asParser, #any asParser) wrapped, (#any asParser, #any asParser)) compile.