SmaCC__JavaScanner.st
author vranyj1
Wed, 17 Nov 2010 21:57:55 +0000
changeset 20 4ea23addc2c4
parent 1 b8cca2663544
child 25 5a6921729520
permissions -rw-r--r--
Makefile updated

"{ Package: 'stx:goodies/smaCC' }"

"{ NameSpace: SmaCC }"

SmaCCScanner subclass:#JavaScanner
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'SmaCC-Example Parsers'
!


!JavaScanner class methodsFor:'generated-comments'!

scannerDefinitionComment

	"<DECIMAL_INTEGER>: 0 | [1-9] [0-9]*    ;
<HEX_INTEGER>: 0[xX][0-9a-fA-F]+        ;
<OCTAL_INTEGER>: 0[0-7]+        ;

<EXPONENT>: [eE] [\-\+]? [0-9]+         ;
<FLOAT_TYPE>: [fFdD]    ;

<ESCAPE_SEQUENCE>: \\ ([btnfr\""\'\\] | ([0-3] [0-7]{0,2} | [4-7][0-7]?))       ;

<INTEGER_LITERAL>: (<DECIMAL_INTEGER> | <HEX_INTEGER> | <OCTAL_INTEGER>) [lL]?  ;
<FLOATING_POINT_LITERAL>: [0-9]+ \. [0-9]* <EXPONENT>? <FLOAT_TYPE>? | \. [0-9]+ <EXPONENT>? <FLOAT_TYPE>? | [0-9]+ <EXPONENT> <FLOAT_TYPE>? | [0-9]+ <FLOAT_TYPE>      ;
<BOOLEAN_LITERAL>: true | false ;
<CHARACTER_LITERAL>: \' ([^\\\'] | <ESCAPE_SEQUENCE> ) \'       ;
<STRING_LITERAL>: \"" ([^\\\""] | <ESCAPE_SEQUENCE> )* \""      ;
<NULL_LITERAL>: null    ;

<IDENTIFIER>: [a-zA-Z_] \w*     ;

<eol>: \r | \n | \r\n   ;
<whitespace>: \s+       ;
<comment>: \/\/ [^\r\n]* <eol>  ;
<multipleLineComment>: \/ \*    ;"
! !

!JavaScanner class methodsFor:'generated-initialization'!

initializeKeywordMap
	keywordMap := Dictionary new.
	#(#(99 'abstract' 40) #(99 'boolean' 33) #(99 'break' 78) #(99 'byte' 32) #(99 'case' 23) #(99 'catch' 73) #(99 'char' 28) #(99 'class' 9) #(99 'continue' 72) #(99 'default' 41) #(99 'do' 80) #(99 'double' 26) #(99 'else' 14) #(99 'extends' 8) #(99 'false' 95) #(99 'final' 39) #(99 'finally' 81) #(99 'float' 27) #(99 'for' 79) #(99 'if' 46) #(99 'implements' 2) #(99 'import' 42) #(99 'instanceof' 55) #(99 'int' 25) #(99 'interface' 12) #(99 'long' 24) #(99 'native' 38) #(99 'new' 76) #(99 'null' 98) #(99 'package' 29) #(99 'private' 37) #(99 'protected' 43) #(99 'public' 44) #(99 'return' 71) #(99 'short' 31) #(99 'static' 36) #(99 'strictfp' 22) #(99 'super' 13) #(99 'switch' 70) #(99 'synchronized' 18) #(99 'this' 19) #(99 'throw' 75) #(99 'throws' 20) #(99 'transient' 35) #(99 'true' 95) #(99 'try' 74) #(99 'void' 17) #(99 'volatile' 11) #(99 'while' 88)) 
		do: 
			[:each | 
			(keywordMap at: each first ifAbsentPut: [Dictionary new]) at: (each at: 2) put: each last].
	^keywordMap
! !

!JavaScanner methodsFor:'generated-scanner'!

scan1
        
	[self recordMatch: #(94).
	self step.
	currentCharacter isDigit] whileTrue.
	(currentCharacter == $D 
		or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
			ifTrue: [^self recordAndReportMatch: #(94)].
	(currentCharacter == $E or: [currentCharacter == $e]) ifTrue: [^self scan2].
	^self reportLastMatch
!

scan2
	self step.
	currentCharacter isDigit ifTrue: [^self scan3].
	(currentCharacter == $+ or: [currentCharacter == $-]) 
		ifTrue: 
			[self step.
			currentCharacter isDigit ifTrue: [^self scan3].
			^self reportLastMatch].
	^self reportLastMatch
!

scan3
        
	[self recordMatch: #(94).
	self step.
	currentCharacter isDigit] whileTrue.
	(currentCharacter == $D 
		or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
			ifTrue: [^self recordAndReportMatch: #(94)].
	^self reportLastMatch
!

scan4
	self step.
	currentCharacter == $' ifTrue: [^self recordAndReportMatch: #(96)].
	^self reportLastMatch
!

scan5
	self step.
	(currentCharacter between: $0 and: $7) ifTrue: [^self scan4].
	currentCharacter == $' ifTrue: [^self recordAndReportMatch: #(96)].
	^self reportLastMatch
!

scan6
        
	[self step.
	currentCharacter <= $!! 
		or: [(currentCharacter between: $# and: $[) or: [currentCharacter >= $]]]] 
			whileTrue.
	currentCharacter == $" ifTrue: [^self recordAndReportMatch: #(97)].
	currentCharacter == $\ 
		ifTrue: 
			[self step.
			(currentCharacter == $" or: 
					[currentCharacter == $' or: 
							[(currentCharacter between: $0 and: $7) or: 
									[currentCharacter == $\ or: 
											[currentCharacter == $b or: 
													[currentCharacter == $f 
														or: [currentCharacter == $n or: [currentCharacter == $r or: [currentCharacter == $t]]]]]]]]) 
				ifTrue: [^self scan6].
			^self reportLastMatch].
	^self reportLastMatch
!

scan7
        
	[self step.
	currentCharacter isDigit] whileTrue.
	(currentCharacter == $D 
		or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
			ifTrue: [^self recordAndReportMatch: #(94)].
	(currentCharacter == $E or: [currentCharacter == $e]) ifTrue: [^self scan2].
	currentCharacter == $. ifTrue: [^self scan1].
	^self reportLastMatch
!

scanForToken
	self step.
	((currentCharacter between: $A and: $Z) 
		or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]) 
			ifTrue: 
				[
				[self recordMatch: #(99).
				self step.
				currentCharacter isHexDigit or: 
						[(currentCharacter between: $G and: $Z) 
							or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]] 
						whileTrue.
				^self reportLastMatch].
	(currentCharacter between: $1 and: $9) 
		ifTrue: 
			[
			[self recordMatch: #(93).
			self step.
			currentCharacter isDigit] whileTrue.
			(currentCharacter == $D 
				or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
					ifTrue: [^self recordAndReportMatch: #(94)].
			(currentCharacter == $E or: [currentCharacter == $e]) ifTrue: [^self scan2].
			(currentCharacter == $L or: [currentCharacter == $l]) 
				ifTrue: [^self recordAndReportMatch: #(93)].
			currentCharacter == $. ifTrue: [^self scan1].
			^self reportLastMatch].
	((currentCharacter between: $    and: $
) or: [currentCharacter == $ ]) 
		ifTrue: 
			[
			[self recordMatch: #whitespace.
			self step.
			(currentCharacter between: $     and: $
) or: [currentCharacter == $ ]] 
					whileTrue.
			^self reportLastMatch].
	currentCharacter == $!! 
		ifTrue: 
			[self recordMatch: #(84).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(53)].
			^self reportLastMatch].
	currentCharacter == $" ifTrue: [^self scan6].
	currentCharacter == $% 
		ifTrue: 
			[self recordMatch: #(87).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(67)].
			^self reportLastMatch].
	currentCharacter == $& 
		ifTrue: 
			[self recordMatch: #(48).
			self step.
			currentCharacter == $& ifTrue: [^self recordAndReportMatch: #(57)].
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(61)].
			^self reportLastMatch].
	currentCharacter == $' 
		ifTrue: 
			[self step.
			(currentCharacter <= $& 
				or: [(currentCharacter between: $( and: $[) or: [currentCharacter >= $]]]) 
					ifTrue: [^self scan4].
			currentCharacter == $\ 
				ifTrue: 
					[self step.
					(currentCharacter == $" or: 
							[currentCharacter == $' or: 
									[currentCharacter == $\ or: 
											[currentCharacter == $b or: 
													[currentCharacter == $f 
														or: [currentCharacter == $n or: [currentCharacter == $r or: [currentCharacter == $t]]]]]]]) 
						ifTrue: [^self scan4].
					(currentCharacter between: $0 and: $3) 
						ifTrue: 
							[self step.
							(currentCharacter between: $0 and: $7) ifTrue: [^self scan5].
							currentCharacter == $' ifTrue: [^self recordAndReportMatch: #(96)].
							^self reportLastMatch].
					(currentCharacter between: $4 and: $7) ifTrue: [^self scan5].
					^self reportLastMatch].
			^self reportLastMatch].
	currentCharacter == $( ifTrue: [^self recordAndReportMatch: #(7)].
	currentCharacter == $) ifTrue: [^self recordAndReportMatch: #(21)].
	currentCharacter == $* 
		ifTrue: 
			[self recordMatch: #(45).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(54)].
			^self reportLastMatch].
	currentCharacter == $+ 
		ifTrue: 
			[self recordMatch: #(92).
			self step.
			currentCharacter == $+ ifTrue: [^self recordAndReportMatch: #(77)].
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(66)].
			^self reportLastMatch].
	currentCharacter == $, ifTrue: [^self recordAndReportMatch: #(6)].
	currentCharacter == $- 
		ifTrue: 
			[self recordMatch: #(91).
			self step.
			currentCharacter == $- ifTrue: [^self recordAndReportMatch: #(89)].
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(60)].
			^self reportLastMatch].
	currentCharacter == $. 
		ifTrue: 
			[self recordMatch: #(34).
			self step.
			currentCharacter isDigit ifTrue: [^self scan1].
			^self reportLastMatch].
	currentCharacter == $/ 
		ifTrue: 
			[self recordMatch: #(83).
			self step.
			currentCharacter == $* ifTrue: [^self recordAndReportMatch: #multipleLineComment].
			currentCharacter == $/ 
				ifTrue: 
					[
					[self step.
					currentCharacter <= $    
						or: [(currentCharacter between: $ and: $) or: [currentCharacter >= $]]] 
							whileTrue.
					currentCharacter isLinefeed ifTrue: [^self recordAndReportMatch: #comment].
					currentCharacter == $
 
						ifTrue: 
							[self recordMatch: #comment.
							self step.
							currentCharacter isLinefeed ifTrue: [^self recordAndReportMatch: #comment].
							^self reportLastMatch].
					^self reportLastMatch].
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(68)].
			^self reportLastMatch].
	currentCharacter == $0 
		ifTrue: 
			[self recordMatch: #(93).
			self step.
			(currentCharacter between: $0 and: $7) 
				ifTrue: 
					[
					[self recordMatch: #(93).
					self step.
					currentCharacter between: $0 and: $7] 
							whileTrue.
					(currentCharacter == $D 
						or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
							ifTrue: [^self recordAndReportMatch: #(94)].
					(currentCharacter between: $8 and: $9) ifTrue: [^self scan7].
					(currentCharacter == $E or: [currentCharacter == $e]) ifTrue: [^self scan2].
					(currentCharacter == $L or: [currentCharacter == $l]) 
						ifTrue: [^self recordAndReportMatch: #(93)].
					currentCharacter == $. ifTrue: [^self scan1].
					^self reportLastMatch].
			(currentCharacter == $D 
				or: [currentCharacter == $F or: [currentCharacter == $d or: [currentCharacter == $f]]]) 
					ifTrue: [^self recordAndReportMatch: #(94)].
			(currentCharacter between: $8 and: $9) ifTrue: [^self scan7].
			(currentCharacter == $E or: [currentCharacter == $e]) ifTrue: [^self scan2].
			(currentCharacter == $L or: [currentCharacter == $l]) 
				ifTrue: [^self recordAndReportMatch: #(93)].
			(currentCharacter == $X or: [currentCharacter == $x]) 
				ifTrue: 
					[self step.
					(currentCharacter isHexDigit or: [currentCharacter between: $a and: $f]) 
						ifTrue: 
							[
							[self recordMatch: #(93).
							self step.
							currentCharacter isHexDigit or: [currentCharacter between: $a and: $f]] 
									whileTrue.
							(currentCharacter == $L or: [currentCharacter == $l]) 
								ifTrue: [^self recordAndReportMatch: #(93)].
							^self reportLastMatch].
					^self reportLastMatch].
			currentCharacter == $. ifTrue: [^self scan1].
			^self reportLastMatch].
	currentCharacter == $: ifTrue: [^self recordAndReportMatch: #(16)].
	currentCharacter == $; ifTrue: [^self recordAndReportMatch: #(30)].
	currentCharacter == $< 
		ifTrue: 
			[self recordMatch: #(82).
			self step.
			currentCharacter == $< 
				ifTrue: 
					[self recordMatch: #(86).
					self step.
					currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(59)].
					^self reportLastMatch].
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(69)].
			^self reportLastMatch].
	currentCharacter == $= 
		ifTrue: 
			[self recordMatch: #(3).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(49)].
			^self reportLastMatch].
	currentCharacter == $> 
		ifTrue: 
			[self recordMatch: #(58).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(56)].
			currentCharacter == $> 
				ifTrue: 
					[self recordMatch: #(85).
					self step.
					currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(63)].
					currentCharacter == $> 
						ifTrue: 
							[self recordMatch: #(65).
							self step.
							currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(62)].
							^self reportLastMatch].
					^self reportLastMatch].
			^self reportLastMatch].
	currentCharacter == $? ifTrue: [^self recordAndReportMatch: #(64)].
	currentCharacter == $[ ifTrue: [^self recordAndReportMatch: #(10)].
	currentCharacter == $] ifTrue: [^self recordAndReportMatch: #(5)].
	currentCharacter == $^ 
		ifTrue: 
			[self recordMatch: #(51).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(47)].
			^self reportLastMatch].
	currentCharacter == ${ ifTrue: [^self recordAndReportMatch: #(1)].
	currentCharacter == $| 
		ifTrue: 
			[self recordMatch: #(50).
			self step.
			currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(15)].
			currentCharacter == $| ifTrue: [^self recordAndReportMatch: #(52)].
			^self reportLastMatch].
	currentCharacter == $} ifTrue: [^self recordAndReportMatch: #(4)].
	currentCharacter == $~ ifTrue: [^self recordAndReportMatch: #(90)].
	^self reportLastMatch
! !

!JavaScanner methodsFor:'generated-tokens'!

emptySymbolTokenId
	^254
!

errorTokenId
	^255
! !

!JavaScanner methodsFor:'public'!

multipleLineComment
	| char |
        
	[[(char := stream next) isNil or: [char == $*]] whileFalse.
	stream atEnd ifTrue: [self scannerError].
	stream peekFor: $/] 
			whileFalse.
	^self whitespace
! !

!JavaScanner class methodsFor:'documentation'!

version
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__JavaScanner.st,v 1.1 2006-02-09 21:13:52 vranyj1 Exp $'
! !