SmaCC__ParserGeneratorTest.st
author vranyj1
Mon, 10 Sep 2012 09:07:46 +0000
changeset 23 11ad79f459e6
parent 15 8b8cd1701c33
child 25 5a6921729520
permissions -rw-r--r--
- stx_goodies_smaCC added: #svnRepositoryUrlString changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - SmaCC::SmaCCRHS changed: #parseTreeRewriter
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     1
"{ Package: 'stx:goodies/smaCC' }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     3
"{ NameSpace: SmaCC }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     4
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     5
TestCase subclass:#ParserGeneratorTest
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'wrappers'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     7
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     8
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     9
	category:'SmaCC-Tests'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
SmaCCParser subclass:#TestParser
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
	instanceVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
	privateIn:ParserGeneratorTest
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
SmaCCScanner subclass:#TestScanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
	instanceVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
	privateIn:ParserGeneratorTest
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
!ParserGeneratorTest methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
tearDown
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
        Class withoutUpdatingChangesDo:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
            SmaCC::TestParser notNil ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
                self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
                        removeAllSelectorsFrom: SmaCC::TestParser;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
                        removeAllSelectorsFrom: SmaCC::TestParser class.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
                SmaCC::TestParser removeFromSystem.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
            ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
            SmaCC::TestScanner notNil ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
                self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
                        removeAllSelectorsFrom: SmaCC::TestScanner;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
                        removeAllSelectorsFrom: SmaCC::TestScanner class.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
                SmaCC::TestScanner removeFromSystem.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
            ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
        ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
!ParserGeneratorTest methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
removeAllSelectorsFrom: class 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
            Class withoutUpdatingChangesDo:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
                class selectors do: [:each | class removeSelector: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
            ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
        class selectors do: [:each | class removeSelector: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
supportsUnicodeStrings
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
	^
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
	[String with: (Character value: 16rFF00).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
	true] on: Error
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
			do: [:ex | ex return: false]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
!ParserGeneratorTest methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
expressionParserString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
	^'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
%left "+" "-" ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
%left "*" "/" ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
%right "^" ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
Expression: Expression ''first'' "+" Expression ''last'' {first + last}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
	| Expression "-" Expression {''1'' - ''3''}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
	| Expression "*" Expression {''1'' * ''3''}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
	| Expression "/" Expression {''1'' / ''3''}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
	| Expression "^" Expression {''1'' raisedTo: ''3''} 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
	| "(" Expression ")" {''2''}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
	| <number> {''1'' value asNumber};'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
expressionScannerString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
	^'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
<number>	:	[0-9]+ (\. [0-9]+) ? ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
<whitespace>	:	\s+;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
testBadCharacterBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
	self should: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
			[parserCompiler buildScanner: '<foo> : [a-] ;' andParser: 'Start : <foo>;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
			parserCompiler compileInto: TestScanner andParser: TestParser]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
		raise: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
testBadSmalltalkBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
	self should: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
			[parserCompiler buildScanner: '<foo> : foo ;' andParser: 'Start : <foo> {self printOn: };'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
			parserCompiler compileInto: TestScanner andParser: TestParser]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
		raise: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
testBraceRepeatToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
        | parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
        parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
                buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
                                                <DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
                                                <IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*      ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
                                                <whitespace>: \s+       ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
                andParser: 'begin : <%<IDENTIFIER>%>;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
        parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
                compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
                compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
        self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
                assert: ((TestParser parse: 'a b c') collect: [:each | each value]) asArray 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
                                = #('a' 'b' 'c').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
        self assert: (TestParser parse: '') size = 0
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
    "Modified: / 04-04-2006 / 12:23:02 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
testBracketOptionalToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
		buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
						<DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
						<IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
		andParser: 'begin : <IDENTIFIER> [":"] begin {''1'' value , ''3''} | <IDENTIFIER> {''1'' value};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
	parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
		compileDefinitionComments;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
		compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
		compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
	self assert: (TestParser parse: 'a b : c') = 'abc'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
testErrorToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
        | parserCompiler countingBlock |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
        parserCompiler buildScanner: '<name> : [a-zA-Z]+; <whitespace>: \s+;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
                andParser: '%left "+"; Expression : <name> | Expression "+" Expression { Notification raiseSignal } | error "+" Expression ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
        parserCompiler buildScanner: '<name> : [a-zA-Z]+; <whitespace>: \s+;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
                andParser: '%left "+"; Expression : <name> | Expression "+" Expression {[Notification signal] on: Error do: [:ex | ex return: (Notification raise)]} | error "+" Expression ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
        countingBlock := 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
                        [:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
                        | count |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
                        count := 0.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
                        
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
                        [[TestParser parse: each] on: Notification
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
                                do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
                                        [:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
                                        count := count + 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
                                        [ex resume] on: Error
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
                                                do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
                                                        [:ex1 | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
                                                        ex isResumable: true.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
                                                        ex1 retry]]] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
                                        on: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
                                        do: [:ex | ex return].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
                        count].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
        #(#('a + b + c' 2) #('+ a + b + c' 2) #('a + b +' 1) #('a + 1 / 2 + b + c + 3' 2) #('1 + 1 / 2 + b + c + 3' 1)) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
                do: [:each | self assert: (countingBlock value: each first) = each last]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
testErrors
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
        | parserCompiler position |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
        parserCompiler buildScanner: self expressionScannerString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
                andParser: self expressionParserString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
        TestParser parse: '+3*4' onError: [:str :pos | position := pos].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
            self assert: position = (1 + PositionableStream zeroPosition).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
            self assert: position = 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
        TestParser parseStream: (ReadStream on: '1+a+4')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
                onError: [:str :pos | position := pos].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
            self assert: position = (3 + PositionableStream zeroPosition).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
            self assert: position = 3
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
        ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
testExpressions
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
	#(#LR1 #LALR1) do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
			| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
			parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
			parserCompiler grammar type: each.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
			parserCompiler buildScanner: self expressionScannerString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
				andParser: self expressionParserString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
			parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
			self assert: (TestParser parse: '2 + 3 * 4 / 5 ^ 3 ^ 2') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
						= (2 + (3 * 4 / (5 raisedTo: (3 raisedTo: 2)))).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
			self assert: (TestParser parse: '1.0*2/3+4.0^2^3+3') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
						= (1.0 * 2 / 3 + (4.0 raisedTo: (2 raisedTo: 3)) + 3).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
			self assert: (TestParser parse: '(((1 + 2) * 3) ^ 2) ^ 3') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
						= (((1 + 2) * 3 raisedTo: 2) raisedTo: 3)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
testIgnoreCaseKeywords
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
	| parserCompiler case |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
	case := SmaCCGrammar ignoreCase.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
	SmaCCGrammar ignoreCase: true.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
	
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
	[parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
		buildScanner: '<identifier> : [a-z_]+ ; <whitespace> : \s+ ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
		andParser: 'Start ::= "Foo" {true} | <identifier> <identifier> {false};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
	self assert: (TestParser parse: 'FOo').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
	self deny: (TestParser parse: 'FoObAr ASDS')] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
			ensure: [SmaCCGrammar ignoreCase: case]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
testInvertedCharactersBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
		buildScanner: '<A> : a{1,3} ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
						<ID> : [^a]+ ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
						<comment> : \s+ ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
		andParser: 'begin : {0} | begin <A> {''1'' + 1} | begin <ID> {''1'' - 1};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
	self assert: (TestParser parse: 'aa') = 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
	self assert: (TestParser parse: 'aaaa') = 2.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
	self assert: (TestParser parse: 'a bab') = 0
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
testKeywords
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
	| parserCompiler size case |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
	size := SmaCCGrammar maximumCharacterValue.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
	case := SmaCCGrammar ignoreCase.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
	SmaCCGrammar ignoreCase: true.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
	self supportsUnicodeStrings 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
		ifTrue: [SmaCCGrammar maximumCharacterValue: (2 raisedTo: 16) - 1].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
	
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
	[parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   251
	parserCompiler buildScanner: '' andParser: 'Start ::= "Foo" "bar";'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   252
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   253
	TestParser parse: 'FoObAr'] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   254
			ensure: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
				[SmaCCGrammar
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   256
					ignoreCase: case;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   257
					maximumCharacterValue: size]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   258
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   259
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   260
testLALRErrorHandler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   261
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   262
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   263
	parserCompiler buildScanner: '<whitespace> : \s+ ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   264
		andParser: 'Start : Foo "]" Foo ")";
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   265
					Foo : "a" Bar ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   266
					Bar : "b" | error ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   267
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   268
	self should: [TestParser parse: 'a ] a b )'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   269
	self should: [TestParser parse: 'a ) a b )'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   270
	self should: [TestParser parse: 'a b ] a  ]'] raise: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   271
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   272
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   273
testMultipleStartingPositions
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   274
        | parserCompiler position |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   275
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   276
        parserCompiler buildScanner: '<name> : \w+;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   277
                andParser: '%start plus ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   278
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   279
                                        multiply: plus "*" plus {true};
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   280
                                        plus: <name> {false} | <name> "+" <name> {false};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   281
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   282
        self assert: (TestParser parse: 'a*a').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   283
        self assert: (TestParser parse: 'a+a*a').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   284
        self should: [TestParser parse: 'a+a'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   285
        self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   286
                deny: (TestParser parse: 'a+a' startingAt: TestParser startingStateForplus).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   287
        TestParser 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   288
                parse: 'a*a'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   289
                startingAt: TestParser startingStateForplus
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   290
                onError: [:str :pos | position := pos].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   291
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   292
            self assert: position = (2 + PositionableStream zeroPosition)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   293
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   294
            self assert: position = 2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   295
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   296
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   297
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   298
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   299
testNonAssociativeTokens
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   300
        | parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   301
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   302
        parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   303
                buildScanner: '<IDENTIFIER> : \w+ ; <whitespace> : \s+ ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   304
                andParser: '%left "and" ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   305
                                        %nonassoc "=" "<=";
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   306
                                        %left "+" ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   307
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   308
                                        expr : expr "=" expr {true} | expr "<=" expr {true} | expr "and" expr {true} | expr "+" expr {true} | <IDENTIFIER> {true};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   309
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   310
        self should: [TestParser parse: 'a=b=c'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   311
        self should: [TestParser parse: 'a=b<=c'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   312
        self should: [TestParser parse: 'a=b+c=d'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   313
        "/self assert: (TestParser parse: 'a=b and c=d')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   314
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   315
    "Modified: / 02-10-2006 / 10:13:38 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   316
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   317
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   318
testOptionalToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   319
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   320
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   321
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   322
		buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   323
						<DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   324
						<IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   325
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   326
		andParser: 'begin : <IDENTIFIER> ":" ? begin {''1'' value , ''3''} | <IDENTIFIER> {''1'' value};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   327
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   328
	parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   329
		compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   330
		compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   331
	self assert: (TestParser parse: 'a b : c') = 'abc'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   332
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   333
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   334
testParenthesesOptionalToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   335
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   336
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   337
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   338
		buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   339
						<DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   340
						<IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   341
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   342
		andParser: 'begin : <IDENTIFIER> (":" | "|") begin {''1'' value , ''3''} | <IDENTIFIER> {''1'' value};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   343
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   344
	parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   345
		compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   346
		compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   347
	self assert: (TestParser parse: 'a | b : c') = 'abc'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   348
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   349
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   350
testPriority
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   351
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   352
	TestScanner 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   353
		compile: 'all self recordAndReportMatch: (Array with: self allId)'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   354
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   355
	parserCompiler buildScanner: '<a> : \{ | \< \% ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   356
						<all> : .;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   357
		andParser: '%id <all> <a>;  begin : A {true}
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   358
							| All {false};
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   359
					A : <a> ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   360
					All: <all>;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   361
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   362
	self assert: (TestParser parse: '{').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   363
	self assert: (TestParser parse: '<%').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   364
	self deny: (TestParser parse: '}')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   365
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   366
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   367
testRecursiveRule
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   368
	#(#LR1 #LALR1) do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   369
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   370
			| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   371
			parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   372
			parserCompiler grammar type: each.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   373
			parserCompiler buildScanner: self expressionScannerString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   374
				andParser: 'Test: Test1 Recursive;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   375
							Test1: <number> {''1'' value};
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   376
							Recursive: | Recursive "|" <number> {''1'' add: ''3'' value; yourself};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   377
			parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   378
			self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   379
				assert: ((parserCompiler grammar nonTerminalSymbolNamed: 'Recursive') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   380
						firstTerminals 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   381
							includes: (parserCompiler grammar keywordTerminalNamed: '"|"')).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   382
			self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   383
				assert: (TestParser parse: '2|3|4') = (OrderedCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   384
								with: '2'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   385
								with: '3'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   386
								with: '4')]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   387
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   388
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   389
testReduceReduceConflict
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   390
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   391
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   392
	parserCompiler buildScanner: '<letter> : \w ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   393
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   394
		andParser: 'begin : Foo <letter> {true} | Bar <letter> {false};
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   395
					Foo :  ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   396
					Bar : ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   397
	self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   398
		assert: (
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   399
			[parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   400
			false] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   401
					on: SmaCCCompilationNotification
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   402
					do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   403
						[:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   404
						('*Reduce/Reduce*' match: ex messageText) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   405
							ifTrue: [ex return: true]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   406
							ifFalse: [ex resume: nil]])
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   407
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   408
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   409
testRepeatMultipleToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   410
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   411
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   412
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   413
		buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   414
						<DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   415
						<IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>){1,2}	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   416
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   417
		andParser: 'begin : <IDENTIFIER> + ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   418
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   419
	parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   420
		compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   421
		compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   422
	self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   423
		assert: ((TestParser parse: 'a1 bb c44') collect: [:each | each value]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   424
				asArray = #('a1' 'bb' 'c44').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   425
	self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   426
		assert: ((TestParser parse: 'aaaaa') collect: [:each | each value]) asArray 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   427
				= #('aaa' 'aa').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   428
	self should: [TestParser parse: ''] raise: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   429
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   430
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   431
testRepeatToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   432
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   433
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   434
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   435
		buildScanner: '<LETTER> : [a-zA-Z_] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   436
						<DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   437
						<IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   438
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   439
		andParser: 'begin : <IDENTIFIER> * ;'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   440
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   441
	parserCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   442
		compileItemSetsComment;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   443
		compileSymbolComment.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   444
	self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   445
		assert: ((TestParser parse: 'a b c') collect: [:each | each value]) asArray 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   446
				= #('a' 'b' 'c').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   447
	self assert: (TestParser parse: '') size = 0
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   448
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   449
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   450
testRepeatingCharactersBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   451
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   452
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   453
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   454
		buildScanner: '<A> : a{1,3} ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   455
						<ID> : \w+ ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   456
						<whitespace> : \s+ ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   457
		andParser: 'begin : {true} | begin <A> {''1''} | begin <ID> {false};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   458
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   459
	self assert: (TestParser parse: 'aa').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   460
	self deny: (TestParser parse: 'aaaa')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   461
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   462
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   463
testReuseCompositeToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   464
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   465
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   466
	parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   467
		buildScanner: '<LETTERDIGIT> : [a-zA-Z_] \d ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   468
						<AAorBB> :  aa | bb;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   469
						<IDENTIFIER>: <LETTERDIGIT> | <AAorBB>	;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   470
						<whitespace>: \s+	;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   471
		andParser: 'begin : <IDENTIFIER> begin {false} | <IDENTIFIER> {true};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   472
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   473
	self should: [TestParser parse: '2'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   474
	self assert: (TestParser parse: 'aa').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   475
	self assert: (TestParser parse: 'bb').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   476
	self assert: (TestParser parse: 'a4').
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   477
	self should: [TestParser parse: 'ab'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   478
	self should: [TestParser parse: '4b'] raise: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   479
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   480
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   481
testReuseSimpleToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   482
        | parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   483
        parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   484
        parserCompiler 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   485
                buildScanner: '<LETTER> : [a-zA-Z_\\] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   486
                                                <DIGIT> : [0-9] ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   487
                                                <IDENTIFIER>: <LETTER> (<LETTER>|<DIGIT>)*      ;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   488
                                                <whitespace>: \s+       ;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   489
                andParser: 'begin : <IDENTIFIER> begin {false} | <IDENTIFIER> {true};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   490
        parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   491
        self should: [TestParser parse: '2'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   492
        self assert: (TestParser parse: '\')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   493
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   494
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   495
testSimple
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   496
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   497
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   498
	parserCompiler buildScanner: '<a> : a ;' andParser: 'begin : <a> {true};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   499
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   500
	self should: [TestParser parse: '2'] raise: SmaCCParserError.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   501
	self assert: (TestParser parse: 'a')
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   502
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   503
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   504
testSpecialCharacters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   505
	| parserCompiler |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   506
	[String with: (Character value: 16rFF00)] on: Error do: [:ex | ^self].	"Unicode characters not supported"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   507
	parserCompiler := SmaCCGrammarCompiler new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   508
	parserCompiler buildScanner: '<name> : \x3g \x20 \xFF \xFF1 \xFF00 \cC;'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   509
		andParser: 'begin ::= <name> {true};'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   510
	parserCompiler compileInto: TestScanner andParser: TestParser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   511
	self assert: (TestParser 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   512
				parse: (String withAll: (#(3 103 16r20 16rFF 16rFF1 16rFF00 2) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   513
								collect: [:each | Character value: each])))
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   514
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   515
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   516
!ParserGeneratorTest::TestParser class methodsFor:'documentation'!
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   517
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   518
version
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   519
    ^'$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   520
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   521
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   522
!ParserGeneratorTest::TestScanner class methodsFor:'documentation'!
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   523
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   524
version
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   525
    ^'$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   526
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   527
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   528
!ParserGeneratorTest::TestScanner methodsFor:'others'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   529
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   530
all self recordAndReportMatch: (Array with: self allId)
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   531
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   532
    "Modified: / 08-06-2008 / 10:04:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   533
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   534
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   535
!ParserGeneratorTest class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   536
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   537
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   538
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__ParserGeneratorTest.st,v 1.3 2006-10-02 08:14:37 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 5
diff changeset
   539
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 5
diff changeset
   540
8b8cd1701c33 added version_SVN method
vranyj1
parents: 5
diff changeset
   541
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 5
diff changeset
   542
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   543
! !