⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t-gen-testsuite.st

📁 編譯器的語法產生器
💻 ST
📖 第 1 页 / 共 3 页
字号:
!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 + -