SmaCC__SmaCCLR1Item.st
author vranyj1
Thu, 10 Apr 2008 09:11:12 +0000
changeset 1 b8cca2663544
child 15 8b8cd1701c33
permissions -rw-r--r--
Initial import
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:#SmaCCLR1Item
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'rhs symbol location followers'
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-Parser 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
SmaCCLR1Item comment:'SmaCCLR1Item represents an item in a SmaCCItemSet.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
Instance Variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	followers	<SmaCCSymbolSet>	all possible symbols that can follow this production in this state
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
	location	<Integer>	the position in the rhs of the production we are at
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
	rhs	<SmaCCRHS>	the rhs of the production
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
	symbol	<SmaCCSymbol>	the symbol for the production'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
!SmaCCLR1Item class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
symbol: productionGrammarSymbol rhs: aRHS follow: aGrammarSymbolCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
	^(self new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
		symbol: productionGrammarSymbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
			rhs: aRHS
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
			follow: aGrammarSymbolCollection;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
!SmaCCLR1Item methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
action: aGrammarSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
	location > rhs size 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
			[(symbol isStartingSymbol and: [aGrammarSymbol isEmptySymbol]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
				ifTrue: [^SmaCCAcceptAction new].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
			(followers includes: aGrammarSymbol) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
				ifTrue: [^SmaCCReduceAction symbol: symbol rhs: rhs]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
		ifFalse: [(rhs at: location) = aGrammarSymbol ifTrue: [^SmaCCShiftAction new]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
	^SmaCCRejectAction new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
followers
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
	^followers
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
mergeWith: aLRItem 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
	followers mergeWith: aLRItem followers
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
moveNext
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
	^(self copy)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
		followers: (followers class basedOn: followers);
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
		location: location + 1;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
nextSymbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
	^location > rhs size 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
		ifTrue: [SmaCCSymbol sentinel]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
		ifFalse: [rhs at: location]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
precedence
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
	"If we don't have a precedence, then assume we are the lowest precedence (which will cause a shift action)."
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
	| max |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
	max := -1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
	rhs do: [:each | max := max max: (each precedence ifNil: [max])].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
	^max
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
rest
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
	| newRHS |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
	newRHS := SmaCCRHS new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
	location + 1 to: rhs size do: [:each | newRHS add: (rhs at: each)].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
	^newRHS
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
!SmaCCLR1Item methodsFor:'comparing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
= anItem 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
	^self class == anItem class and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
			[location == anItem location 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
				and: [rhs == anItem rhs and: [symbol == anItem symbol]]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
	^(symbol identityHash bitXor: (location bitShift: 14)) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
		bitXor: rhs identityHash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
!SmaCCLR1Item methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
followers: aSymbolSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
	followers := aSymbolSet
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
location: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
	location := anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
symbol: productionGrammarSymbol rhs: aRHS follow: aSymbolCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
	symbol := productionGrammarSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
	rhs := aRHS.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
	location := 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
	followers := aSymbolCollection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
!SmaCCLR1Item methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
printOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
        | i |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
        aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
                nextPut: $[;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
                nextPutAll: symbol printString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
                nextPutAll: ' :'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
        i := 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
        rhs do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
                        [:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
                        i = location ifTrue: [aStream nextPutAll: ' . ' asText allBold].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
                        aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
                                space;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
                                nextPutAll: each printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
                        i := i + 1].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
        location > rhs size ifTrue: [aStream nextPutAll: ' . ' asText allBold].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
        aStream nextPut: $;.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
        followers printOn: aStream.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
        aStream nextPut: $]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
    "Modified: / 14-02-2008 / 12:28:48 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
!SmaCCLR1Item methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
location
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
	^location
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
rhs
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
	^rhs
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
symbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
	^symbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
!SmaCCLR1Item methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
isLR1EqualTo: aLRItem 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
	^self followers size = aLRItem followers size 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
		and: [self followers allSatisfy: [:each | aLRItem followers includes: each]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
!SmaCCLR1Item class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCLR1Item.st,v 1.2 2008-02-17 10:30:47 vranyj1 Exp $'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
! !