SmaCC__SmaCCRegularExpressionNode.st
author vranyj1
Wed, 17 Nov 2010 21:57:55 +0000
changeset 20 4ea23addc2c4
parent 15 8b8cd1701c33
permissions -rw-r--r--
Makefile updated
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
Object subclass:#SmaCCRegularExpressionNode
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'action position'
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-Scanner Generator'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
SmaCCRegularExpressionNode comment:'SmaCCRegularExpressionNode represents a regular expression. The scanner is represented by a regular expression. These are the initial objects created in producing the scanner. From these nodes, we create a directed graph and then we compile the graph.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
Subclasses must implement the following messages:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	accessing
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
		possibleMatchesSize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
	private
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
		asNFAStartingWith:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
		possibleMatchesDo:on:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
Instance Variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
	action	<SequenceableCollection>	the actions to be performed when we find a match
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
	position	<Integer>	the position of the RE in the scanner. If we have multiple matches, we prefer the ones listed first.'
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
!SmaCCRegularExpressionNode class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
	^(super new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
		initialize;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
!SmaCCRegularExpressionNode methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
, aScannerNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
	^SmaCCSequenceRENode nodes: (OrderedCollection with: self with: aScannerNode)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
	^position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
position: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
	position := anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
possibleMatches
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
	| matches |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
	matches := OrderedCollection new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
	self possibleMatchesDo: [:each | matches add: each].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
	^matches
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
possibleMatchesDo: aBlock 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
	| stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
	stream := WriteStream on: String new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
	self possibleMatchesDo: [aBlock value: stream contents] on: stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
possibleMatchesSize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
repeat
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
	^SmaCCRepeatingRENode component: self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
repeatFor: minimum to: maximum 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
	^SmaCCRepeatingRENode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
		component: self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
		minimum: minimum
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
		maximum: maximum
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
repeatForAtLeast: minimum 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
	^SmaCCRepeatingRENode component: self minimum: minimum
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
| aScannerNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
	^SmaCCOrRENode nodes: (OrderedCollection with: self with: aScannerNode)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
!SmaCCRegularExpressionNode methodsFor:'converting'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
asDFA
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
	| startNode |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
	startNode := SmaCCNode new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
	self asNFAStartingWith: startNode.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
	^startNode asNFAWithoutEpsilonTransitions asDFA
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
!SmaCCRegularExpressionNode methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
action
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
	^action
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
action: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
	action := aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
!SmaCCRegularExpressionNode methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
asNFAStartingWith: startNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
possibleMatchesDo: aBlock on: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
	self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
!SmaCCRegularExpressionNode methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
isKeywordLiteral
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
	self possibleMatchesSize < 50 ifFalse: [^false].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
	self possibleMatchesDo: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
			(each allSatisfy: [:char | char isAlphaNumeric or: [char == $_]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
				ifFalse: [^false]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
	^true
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
!SmaCCRegularExpressionNode class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCRegularExpressionNode.st,v 1.1 2006-02-09 21:15:38 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   132
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   133
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   134
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   135
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
! !