compiler/extensions.st
changeset 422 116d2b2af905
parent 421 7e08b31e0dae
child 438 20598d7ce9fa
equal deleted inserted replaced
421:7e08b31e0dae 422:116d2b2af905
   110 	^ self globalAt: #compiledParser put: aPPParser
   110 	^ self globalAt: #compiledParser put: aPPParser
   111 ! !
   111 ! !
   112 
   112 
   113 !PPContext methodsFor:'*petitcompiler'!
   113 !PPContext methodsFor:'*petitcompiler'!
   114 
   114 
   115 lastTokenResult
       
   116 	^ scanner lastResult
       
   117 ! !
       
   118 
       
   119 !PPContext methodsFor:'*petitcompiler'!
       
   120 
       
   121 lwRemember
   115 lwRemember
   122 	^ self position
   116 	^ self position
   123 ! !
   117 ! !
   124 
   118 
   125 !PPContext methodsFor:'*petitcompiler'!
   119 !PPContext methodsFor:'*petitcompiler'!
   126 
   120 
   127 lwRestore: position
   121 lwRestore: position
   128 	^ self position: position
   122 	^ self position: position
   129 ! !
       
   130 
       
   131 !PPContext methodsFor:'*petitcompiler'!
       
   132 
       
   133 matchToken: id
       
   134 	^ scanner matchToken: id
       
   135 ! !
       
   136 
       
   137 !PPContext methodsFor:'*petitcompiler'!
       
   138 
       
   139 nextToken
       
   140 	scanner next
       
   141 ! !
       
   142 
       
   143 !PPContext methodsFor:'*petitcompiler'!
       
   144 
       
   145 nextToken: id
       
   146 	^ scanner next: id
       
   147 ! !
   123 ! !
   148 
   124 
   149 !PPContext methodsFor:'*petitcompiler'!
   125 !PPContext methodsFor:'*petitcompiler'!
   150 
   126 
   151 peek: anInteger
   127 peek: anInteger
   235 
   211 
   236 compileWith: aPetitCompiler
   212 compileWith: aPetitCompiler
   237 	^ aPetitCompiler compileCharacter: literal.
   213 	^ aPetitCompiler compileCharacter: literal.
   238 ! !
   214 ! !
   239 
   215 
   240 !PPLiteralObjectParser methodsFor:'*petitcompiler'!
       
   241 
       
   242 firstCharParser
       
   243 	^ self
       
   244 ! !
       
   245 
       
   246 !PPLiteralParser methodsFor:'*petitcompiler'!
   216 !PPLiteralParser methodsFor:'*petitcompiler'!
   247 
   217 
   248 id
   218 id
   249 	^ literal printString
   219 	^ literal printString
   250 ! !
   220 ! !
   262 
   232 
   263 compileWith: aPetitCompiler
   233 compileWith: aPetitCompiler
   264 	^ aPetitCompiler compileLiteral: literal.
   234 	^ aPetitCompiler compileLiteral: literal.
   265 ! !
   235 ! !
   266 
   236 
   267 !PPLiteralSequenceParser methodsFor:'*petitcompiler'!
       
   268 
       
   269 firstCharParser
       
   270 	^ literal first asParser
       
   271 ! !
       
   272 
       
   273 !PPNotParser methodsFor:'*petitcompiler'!
   237 !PPNotParser methodsFor:'*petitcompiler'!
   274 
   238 
   275 asCompilerNode
   239 asCompilerNode
   276 	^ PPCNotNode new 
   240 	^ PPCNotNode new 
   277 		child: parser;
   241 		child: parser;
   283 
   247 
   284 compileWith: aPetitCompiler
   248 compileWith: aPetitCompiler
   285 	^ aPetitCompiler compileNot: self
   249 	^ aPetitCompiler compileNot: self
   286 ! !
   250 ! !
   287 
   251 
   288 !PPNotParser methodsFor:'*petitcompiler'!
       
   289 
       
   290 firstCharParser
       
   291 	^ parser firstCharParser not
       
   292 ! !
       
   293 
       
   294 !PPOptionalParser methodsFor:'*petitcompiler'!
   252 !PPOptionalParser methodsFor:'*petitcompiler'!
   295 
   253 
   296 asCompilerNode
   254 asCompilerNode
   297 	^ PPCOptionalNode new
   255 	^ PPCOptionalNode new
   298 		name: self name;
   256 		name: self name;
   325 
   283 
   326 !PPParser methodsFor:'*petitcompiler'!
   284 !PPParser methodsFor:'*petitcompiler'!
   327 
   285 
   328 bridge
   286 bridge
   329 	^ self
   287 	^ self
   330 ! !
       
   331 
       
   332 !PPParser methodsFor:'*petitcompiler'!
       
   333 
       
   334 cached
       
   335 	"Faster way of memoizing --- it ignores context information, therefore it is not suitable for context-sensitive rules"
       
   336 	
       
   337 	^ PPCachingParser on: self
       
   338 ! !
   288 ! !
   339 
   289 
   340 !PPParser methodsFor:'*petitcompiler'!
   290 !PPParser methodsFor:'*petitcompiler'!
   341 
   291 
   342 compile
   292 compile
   374 
   324 
   375 !PPParser methodsFor:'*petitcompiler'!
   325 !PPParser methodsFor:'*petitcompiler'!
   376 
   326 
   377 compileWithParameters: params
   327 compileWithParameters: params
   378 	^ self compile: #PPGeneratedParser parameters: params
   328 	^ self compile: #PPGeneratedParser parameters: params
   379 ! !
       
   380 
       
   381 !PPParser methodsFor:'*petitcompiler'!
       
   382 
       
   383 first
       
   384 	first ifNil: [  
       
   385 		first := self firstSet
       
   386 	].
       
   387 	^ first
       
   388 ! !
       
   389 
       
   390 !PPParser methodsFor:'*petitcompiler'!
       
   391 
       
   392 first: firstSet
       
   393 	first := firstSet
       
   394 ! !
   329 ! !
   395 
   330 
   396 !PPParser methodsFor:'*petitcompiler'!
   331 !PPParser methodsFor:'*petitcompiler'!
   397 
   332 
   398 firstSetSuchThat: block
   333 firstSetSuchThat: block
   518 	].
   453 	].
   519 
   454 
   520 	^ super compileWith: aPetitCompiler.
   455 	^ super compileWith: aPetitCompiler.
   521 ! !
   456 ! !
   522 
   457 
   523 !PPPossessiveRepeatingParser methodsFor:'*petitcompiler'!
       
   524 
       
   525 optimized
       
   526 	^ (PPFastPossessiveRepeatingParser on: parser)
       
   527 		setMin: min;
       
   528 		setMax: max;
       
   529 		yourself
       
   530 ! !
       
   531 
       
   532 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   458 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   533 
   459 
   534 asCompilerNode
   460 asCompilerNode
   535 	^ PPCPredicateNode new
   461 	^ PPCPredicateNode new
   536 		name: self name;
   462 		name: self name;
   547 	^ aPetitCompiler compilePredicate: predicate.
   473 	^ aPetitCompiler compilePredicate: predicate.
   548 ! !
   474 ! !
   549 
   475 
   550 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   476 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   551 
   477 
   552 firstCharParser
       
   553 	^ self
       
   554 ! !
       
   555 
       
   556 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
       
   557 
       
   558 firstCharSet
   478 firstCharSet
   559 	^ predicate
   479 	^ predicate
   560 ! !
   480 ! !
   561 
   481 
   562 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   482 !PPPredicateObjectParser methodsFor:'*petitcompiler'!
   571 	^ PPCSequenceNode new
   491 	^ PPCSequenceNode new
   572 		children: parsers;
   492 		children: parsers;
   573 		name: self name;
   493 		name: self name;
   574 		properties: properties;
   494 		properties: properties;
   575 		yourself
   495 		yourself
   576 ! !
       
   577 
       
   578 !PPSequenceParser methodsFor:'*petitcompiler'!
       
   579 
       
   580 checkFirst: context
       
   581 	first isEmpty ifTrue: [ ^ true ].
       
   582 
       
   583 	first do: [ :elem | 
       
   584 		(context matchToken: elem id) ifTrue: [ ^ true ].
       
   585 	].
       
   586 	^ false
       
   587 ! !
   496 ! !
   588 
   497 
   589 !PPSequenceParser methodsFor:'*petitcompiler'!
   498 !PPSequenceParser methodsFor:'*petitcompiler'!
   590 
   499 
   591 compileWith: aPetitCompiler
   500 compileWith: aPetitCompiler
   605 		child acceptsEpsilon ifFalse: [ ^ aCollection ]
   514 		child acceptsEpsilon ifFalse: [ ^ aCollection ]
   606 	].
   515 	].
   607 	^ aCollection
   516 	^ aCollection
   608 ! !
   517 ! !
   609 
   518 
   610 !PPSequenceParser methodsFor:'*petitcompiler'!
       
   611 
       
   612 optimized
       
   613 	^ PPFastSequenceParser withAll: parsers
       
   614 ! !
       
   615 
       
   616 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
   519 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
   617 
   520 
   618 comment
   521 comment
   619  	^ $" asParser, $" asParser negate star, $" asParser.	
   522  	^ $" asParser, $" asParser negate star, $" asParser.	
   620 ! !
   523 ! !
   631 
   534 
   632 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
   535 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
   633 
   536 
   634 whitespace
   537 whitespace
   635 	^ #space asParser plus
   538 	^ #space asParser plus
   636 ! !
       
   637 
       
   638 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
       
   639 
       
   640 whitespaceOld
       
   641 	^ #space asParser plus
       
   642 ! !
       
   643 
       
   644 !PPSmalltalkGrammar methodsFor:'*petitcompiler'!
       
   645 
       
   646 whitespaceX
       
   647 	whitespace ifNil: [
       
   648 		whitespace := PPSmalltalkWhitespaceParser new
       
   649 	].
       
   650 	^ whitespace
       
   651 ! !
   539 ! !
   652 
   540 
   653 !PPSmalltalkTokenParser methodsFor:'*petitcompiler'!
   541 !PPSmalltalkTokenParser methodsFor:'*petitcompiler'!
   654 
   542 
   655 compileWith: aPetitCompiler
   543 compileWith: aPetitCompiler
   708 	^ true
   596 	^ true
   709 ! !
   597 ! !
   710 
   598 
   711 !PPSmalltalkWhitespaceParser methodsFor:'*petitcompiler'!
   599 !PPSmalltalkWhitespaceParser methodsFor:'*petitcompiler'!
   712 
   600 
   713 firstCharParser
       
   714 	^ PPFailingParser new
       
   715 ! !
       
   716 
       
   717 !PPSmalltalkWhitespaceParser methodsFor:'*petitcompiler'!
       
   718 
       
   719 firstCharSet
   601 firstCharSet
   720 	^ PPCharSetPredicate on: [:e | false ] 
   602 	^ PPCharSetPredicate on: [:e | false ] 
   721 ! !
   603 ! !
   722 
   604 
   723 !PPStream methodsFor:'*petitcompiler'!
   605 !PPStream methodsFor:'*petitcompiler'!
   769 	^ super firstSets: aFirstDictionary  into: aSet 
   651 	^ super firstSets: aFirstDictionary  into: aSet 
   770 ! !
   652 ! !
   771 
   653 
   772 !PPTokenParser methodsFor:'*petitcompiler'!
   654 !PPTokenParser methodsFor:'*petitcompiler'!
   773 
   655 
   774 id
       
   775 	id ifNil: [ 
       
   776 		id := ('TOK[', parser id, ']') asSymbol
       
   777 	].
       
   778 	^ id
       
   779 ! !
       
   780 
       
   781 !PPTokenParser methodsFor:'*petitcompiler'!
       
   782 
       
   783 isFirstSetTerminal
   656 isFirstSetTerminal
   784 	^ false
   657 	^ false
   785 ! !
   658 ! !
   786 
   659 
   787 !PPTokenParser methodsFor:'*petitcompiler'!
   660 !PPTokenParser methodsFor:'*petitcompiler'!
   790 	^ true
   663 	^ true
   791 ! !
   664 ! !
   792 
   665 
   793 !PPTokenParser methodsFor:'*petitcompiler'!
   666 !PPTokenParser methodsFor:'*petitcompiler'!
   794 
   667 
   795 isUnique
       
   796 	unique ifNil: [  
       
   797 		unique := parser firstSet size = 1 and: [ (parser firstSet anyOne isKindOf: PPLiteralParser) ]
       
   798 	].
       
   799 	^ unique
       
   800 ! !
       
   801 
       
   802 !PPTokenParser methodsFor:'*petitcompiler'!
       
   803 
       
   804 optimize
   668 optimize
   805 	^ self transform: [ :each | each optimized ]
   669 	^ self transform: [ :each | each optimized ]
   806 ! !
   670 ! !
   807 
   671 
   808 !PPTokenParser methodsFor:'*petitcompiler'!
   672 !PPTokenParser methodsFor:'*petitcompiler'!
   809 
   673 
   810 parseOnX: aPPContext
       
   811 	(aPPContext matchToken: self id) ifTrue: [ 
       
   812 		^ aPPContext nextToken: self id.
       
   813 	].
       
   814 	^ PPFailure message: self id, ' not found' context: aPPContext.
       
   815 ! !
       
   816 
       
   817 !PPTokenParser methodsFor:'*petitcompiler'!
       
   818 
       
   819 parser
   674 parser
   820 	^ parser
   675 	^ parser
   821 ! !
   676 ! !
   822 
   677 
   823 !PPTokenParser methodsFor:'*petitcompiler'!
   678 !PPTokenParser methodsFor:'*petitcompiler'!