📄 t-gen-testsuite.st
字号:
!TranslatorGenerator methodsFor: 'testing'!
buildAndInstallParserNamed: name tokenSpec: tSpec grammarSpec: gSpec ifFail: failBlock
self tokenSpecification: tSpec.
self grammarSpecification: gSpec.
self buildParserIfFail: failBlock.
self parser fastParser
createScannerParserClassesNamed: name
category: self testingCategoryName
tokenSpec: self tokenSpecification
grammarSpec: self grammarSpecification!
grammarSpec: gSpec targetGrammar: gram ifFail: failBlock
self grammarSpecification: gSpec.
self buildParserIfFail: failBlock.
self grammar printString = gram
ifTrue: [Transcript show: '*']
ifFalse: failBlock.!
parseInputs: strings compareDTTo: dtTargets compareSASTTo: sastTargets tokenSpec: tSpec grammarSpec: gSpec ifFail: failBlock
| scannerName parserName dt |
scannerName := (self testingClassBaseName , 'Scanner') asSymbol.
parserName := (self testingClassBaseName , 'Parser') asSymbol.
(Smalltalk includesKey: scannerName)
ifTrue: [self error: 'A class named ' , scannerName , ' already exists.'].
(Smalltalk includesKey: parserName)
ifTrue: [self error: 'A class named ' , parserName , ' already exists.'].
self
buildAndInstallParserNamed: self testingClassBaseName
tokenSpec: tSpec
grammarSpec: gSpec
ifFail: failBlock.
strings with: dtTargets do:
[:string :target |
dt := (Smalltalk at: parserName) new parseForDerivationTree: string ifFail: failBlock.
dt printString = target
ifTrue: [Transcript show: '*']
ifFalse: failBlock].
strings with: sastTargets do:
[:string :target |
dt := (Smalltalk at: parserName) new parseForShamAST: string ifFail: failBlock.
dt printString = target
ifTrue: [Transcript show: '*']
ifFalse: failBlock].
(Smalltalk includesKey: scannerName)
ifTrue: [(Smalltalk at: scannerName) removeFromSystem].
(Smalltalk includesKey: parserName)
ifTrue: [(Smalltalk at: parserName) removeFromSystem]!
parseInputs: strings compareDTTo: targets tokenSpec: tSpec grammarSpec: gSpec ifFail: failBlock
| scannerName parserName dt |
scannerName := (self testingClassBaseName , 'Scanner') asSymbol.
parserName := (self testingClassBaseName , 'Parser') asSymbol.
(Smalltalk includesKey: scannerName)
ifTrue: [self error: 'A class named ' , scannerName , ' already exists.'].
(Smalltalk includesKey: parserName)
ifTrue: [self error: 'A class named ' , parserName , ' already exists.'].
self
buildAndInstallParserNamed: self testingClassBaseName
tokenSpec: tSpec
grammarSpec: gSpec
ifFail: failBlock.
strings with: targets do:
[:string :target |
dt := (Smalltalk at: parserName) new parseForDerivationTree: string ifFail: failBlock.
dt printString = target
ifTrue: [Transcript show: '*']
ifFalse: failBlock].
(Smalltalk includesKey: scannerName)
ifTrue: [(Smalltalk at: scannerName) removeFromSystem].
(Smalltalk includesKey: parserName)
ifTrue: [(Smalltalk at: parserName) removeFromSystem]!
parseInputs: strings compareDTToAny: targets tokenSpec: tSpec grammarSpec: gSpec ifFail: failBlock
"The argument 'strings' is an Array of strings. The argument 'targets'
is an Array of Array of strings. The test for a given element of 'strings'
will succeed if it matches any of the strings in the corresponding
'targets' Array. Due to the nondeterminism of hashing, productions
are sometimes processed in different orders and new nonterminals
get numbered differently. As an example, see TranslatorGenerator
class>>basicLLParserGenerationTest2."
| scannerName parserName dt dtps |
scannerName := (self testingClassBaseName , 'Scanner') asSymbol.
parserName := (self testingClassBaseName , 'Parser') asSymbol.
(Smalltalk includesKey: scannerName)
ifTrue: [self error: 'A class named ' , scannerName , ' already exists.'].
(Smalltalk includesKey: parserName)
ifTrue: [self error: 'A class named ' , parserName , ' already exists.'].
self
buildAndInstallParserNamed: self testingClassBaseName
tokenSpec: tSpec
grammarSpec: gSpec
ifFail: failBlock.
strings with: targets do:
[:string :target |
dt := (Smalltalk at: parserName) new parseForDerivationTree: string ifFail: failBlock.
dtps := dt printString.
(target inject: false into: [:result :targetStr | result or: [dtps = targetStr]])
ifTrue: [Transcript show: '*']
ifFalse: failBlock].
(Smalltalk includesKey: scannerName)
ifTrue: [(Smalltalk at: scannerName) removeFromSystem].
(Smalltalk includesKey: parserName)
ifTrue: [(Smalltalk at: parserName) removeFromSystem]!
testingCategoryName
^'T-gen-Interface'!
testingClassBaseName
^'TgenTemporaryTest'! !
!TranslatorGenerator class methodsFor: 'testing'!
basicLLParserGenerationTest1
"TranslatorGenerator basicLLParserGenerationTest1"
| tgen failBlock testName |
testName := 'T-gen LL Parser Generation Test 1'.
tgen := self new setGrammarModeToLL.
failBlock := [self error: testName, ' failed.'].
Transcript cr; show: 'START: ' , testName; cr.
tgen
parseInputs: #(
''
'aabb'
)
compareDTTo: (Array
with: '#S\ . ''<epsilon>''\' withCRs
with: '#S\ . ''a''\ . #S\ . . ''a''\ . . #S\ . . . ''<epsilon>''\ . . ''b''\ . ''b''\' withCRs
)
compareSASTTo: (Array
with: '#Core\' withCRs
with: '#Pair\ . #Pair\ . . #Core\' withCRs
)
tokenSpec: ''
grammarSpec: '
S : ''a'' S ''b'' {Pair} ;
S : {Core} ;
'
ifFail: failBlock.
Transcript cr; show: 'STOP: ' , testName!
basicLLParserGenerationTest2
"TranslatorGenerator basicLLParserGenerationTest2"
| tgen failBlock testName |
testName := 'T-gen LL Parser Generation Test 2'.
tgen := self new setGrammarModeToLL.
failBlock := [self error: testName, ' failed.'].
Transcript cr; show: 'START: ' , testName; cr.
tgen
parseInputs: (Array with:
' program\ var a b c : integer\ begin\ a := 3;\ b := a * 4 * 5;\ begin\ c := a + b * 19;\ b := b * c + 1;\ a := (a + 1) * a;\ end\ c := b * (c + 5);\ end\' withCRs
)
compareDTToAny: (Array with: (Array
with: '#Z\ . ''program''\ . #Decls\ . . ''var''\ . . #IdList\ . . . #Name\ . . . . ''<id>''\ . . . #IdList1\ . . . . #IdList\ . . . . . #Name\ . . . . . . ''<id>''\ . . . . . #IdList1\ . . . . . . #IdList\ . . . . . . . #Name\ . . . . . . . . ''<id>''\ . . . . . . . #IdList1\ . . . . . . . . ''<epsilon>''\ . . '':''\ . . ''integer''\ . #Stmts\ . . ''begin''\ . . #SL\ . . . #S\ . . . . #Name\ . . . . . ''<id>''\ . . . . '':=''\ . . . . #E\ . . . . . #T\ . . . . . . #P\ . . . . . . . ''<number>''\ . . . . . . #T1\ . . . . . . . ''<epsilon>''\ . . . . . #E0\ . . . . . . ''<epsilon>''\ . . . . '';''\ . . . #SL2\ . . . . #SL\ . . . . . #S\ . . . . . . #Name\ . . . . . . . ''<id>''\ . . . . . . '':=''\ . . . . . . #E\ . . . . . . . #T\ . . . . . . . . #P\ . . . . . . . . . #Name\ . . . . . . . . . . ''<id>''\ . . . . . . . . #T1\ . . . . . . . . . ''*''\ . . . . . . . . . #T\ . . . . . . . . . . #P\ . . . . . . . . . . . ''<number>''\ . . . . . . . . . . #T1\ . . . . . . . . . . . ''*''\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . #E0\ . . . . . . . . ''<epsilon>''\ . . . . . . '';''\ . . . . . #SL2\ . . . . . . #SL\ . . . . . . . #Stmts\ . . . . . . . . ''begin''\ . . . . . . . . #SL\ . . . . . . . . . #S\ . . . . . . . . . . #Name\ . . . . . . . . . . . ''<id>''\ . . . . . . . . . . '':=''\ . . . . . . . . . . #E\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . #E0\ . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . #T\ . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . '';''\ . . . . . . . . . #SL2\ . . . . . . . . . . #SL\ . . . . . . . . . . . #S\ . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . '':=''\ . . . . . . . . . . . . #E\ . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . '';''\ . . . . . . . . . . . #SL2\ . . . . . . . . . . . . #SL\ . . . . . . . . . . . . . #S\ . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . '':=''\ . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . ''(''\ . . . . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . '')''\ . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . '';''\ . . . . . . . . . . . . . #SL2\ . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . ''end''\ . . . . . . . #SL1\ . . . . . . . . #SL\ . . . . . . . . . #S\ . . . . . . . . . . #Name\ . . . . . . . . . . . ''<id>''\ . . . . . . . . . . '':=''\ . . . . . . . . . . #E\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . ''(''\ . . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . '')''\ . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . #E0\ . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . '';''\ . . . . . . . . . #SL2\ . . . . . . . . . . ''<epsilon>''\ . . ''end''\' withCRs
with: '#Z\ . ''program''\ . #Decls\ . . ''var''\ . . #IdList\ . . . #Name\ . . . . ''<id>''\ . . . #IdList1\ . . . . #IdList\ . . . . . #Name\ . . . . . . ''<id>''\ . . . . . #IdList1\ . . . . . . #IdList\ . . . . . . . #Name\ . . . . . . . . ''<id>''\ . . . . . . . #IdList1\ . . . . . . . . ''<epsilon>''\ . . '':''\ . . ''integer''\ . #Stmts\ . . ''begin''\ . . #SL\ . . . #S\ . . . . #Name\ . . . . . ''<id>''\ . . . . '':=''\ . . . . #E\ . . . . . #T\ . . . . . . #P\ . . . . . . . ''<number>''\ . . . . . . #T1\ . . . . . . . ''<epsilon>''\ . . . . . #E0\ . . . . . . ''<epsilon>''\ . . . . '';''\ . . . #SL1\ . . . . #SL\ . . . . . #S\ . . . . . . #Name\ . . . . . . . ''<id>''\ . . . . . . '':=''\ . . . . . . #E\ . . . . . . . #T\ . . . . . . . . #P\ . . . . . . . . . #Name\ . . . . . . . . . . ''<id>''\ . . . . . . . . #T1\ . . . . . . . . . ''*''\ . . . . . . . . . #T\ . . . . . . . . . . #P\ . . . . . . . . . . . ''<number>''\ . . . . . . . . . . #T1\ . . . . . . . . . . . ''*''\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . #E0\ . . . . . . . . ''<epsilon>''\ . . . . . . '';''\ . . . . . #SL1\ . . . . . . #SL\ . . . . . . . #Stmts\ . . . . . . . . ''begin''\ . . . . . . . . #SL\ . . . . . . . . . #S\ . . . . . . . . . . #Name\ . . . . . . . . . . . ''<id>''\ . . . . . . . . . . '':=''\ . . . . . . . . . . #E\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . #E0\ . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . #T\ . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . '';''\ . . . . . . . . . #SL1\ . . . . . . . . . . #SL\ . . . . . . . . . . . #S\ . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . '':=''\ . . . . . . . . . . . . #E\ . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . '';''\ . . . . . . . . . . . #SL1\ . . . . . . . . . . . . #SL\ . . . . . . . . . . . . . #S\ . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . '':=''\ . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . ''(''\ . . . . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . '')''\ . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . '';''\ . . . . . . . . . . . . . #SL1\ . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . ''end''\ . . . . . . . #SL2\ . . . . . . . . #SL\ . . . . . . . . . #S\ . . . . . . . . . . #Name\ . . . . . . . . . . . ''<id>''\ . . . . . . . . . . '':=''\ . . . . . . . . . . #E\ . . . . . . . . . . . #T\ . . . . . . . . . . . . #P\ . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . ''*''\ . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . ''(''\ . . . . . . . . . . . . . . . #E\ . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . #Name\ . . . . . . . . . . . . . . . . . . . ''<id>''\ . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . ''+''\ . . . . . . . . . . . . . . . . . #T\ . . . . . . . . . . . . . . . . . . #P\ . . . . . . . . . . . . . . . . . . . ''<number>''\ . . . . . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . . . #E0\ . . . . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . . . . . '')''\ . . . . . . . . . . . . . . #T1\ . . . . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . . #E0\ . . . . . . . . . . . . ''<epsilon>''\ . . . . . . . . . . '';''\ . . . . . . . . . #SL1\ . . . . . . . . . . ''<epsilon>''\ . . ''end''\' withCRs
))
tokenSpec: '
<id> : [a-z]+ ;
<number> : [0-9]+ ;
<space> : [\s\t\r]+ {ignoreDelimiter} ;
'
grammarSpec: '
Z : ''program'' Decls Stmts {Program} ;
Decls : ''var'' IdList '':'' ''integer'' {Decls} ;
IdList : Name IdList {liftRightChild} ;
IdList : Name {IdList} ;
Stmts : ''begin'' SL ''end'' {Stmts} ;
SL : S SL {liftRightChild} ;
SL : Stmts SL {liftRightChild} ;
SL : S {StmtList} ;
SL : Stmts {StmtList} ;
S : Name '':='' E '';'' {Assign} ;
E : E ''+'' T {Plus} ;
E : T ;
T : P ''*'' T {Times} ;
T : P;
P : ''('' E '')'' ;
P : Name ;
P : <number> {Number} ;
Name : <id> {Id} ;
'
ifFail: failBlock.
Transcript cr; show: 'STOP: ' , testName!
basicLLParserGenerationTest3
"TranslatorGenerator basicLLParserGenerationTest3"
| tgen failBlock testName |
testName := 'T-gen LL Parser Generation Test 3'.
tgen := self new setGrammarModeToLL.
failBlock := [self error: testName, ' failed.'].
Transcript cr; show: 'START: ' , testName; cr.
tgen
parseInputs: #(
'a'
'a + b * c + a'
)
compareDTTo: (Array
with: '#E\ . #T\ . . #P\ . . . ''a''\ . . #Tc\ . . . ''<epsilon>''\ . #Ec\ . . ''<epsilon>''\' withCRs
with: '#E\ . #T\ . . #P\ . . . ''a''\ . . #Tc\ . . . ''<epsilon>''\ . #Ec\ . . ''+''\ . . #E\ . . . #T\ . . . . #P\ . . . . . ''b''\ . . . . #Tc\ . . . . . ''*''\ . . . . . #T\ . . . . . . #P\ . . . . . . . ''c''\ . . . . . . #Tc\ . . . . . . . ''<epsilon>''\ . . . #Ec\ . . . . ''+''\ . . . . #E\ . . . . . #T\ . . . . . . #P\ . . . . . . . ''a''\ . . . . . . #Tc\ . . . . . . . ''<epsilon>''\ . . . . . #Ec\ . . . . . . ''<epsilon>''\' withCRs
)
compareSASTTo: (Array
with: '#A\' withCRs
with: '#Plus\ . #A\ . #Plus\ . . #Times\ . . . #B\ . . . #C\ . . #A\' withCRs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -