--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/PPCPredicateNode.st Sun Oct 26 01:03:31 2014 +0000
@@ -0,0 +1,85 @@
+"{ Package: 'stx:goodies/petitparser/compiler' }"
+
+PPCAbstractPredicateNode subclass:#PPCPredicateNode
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'PetitCompiler-Nodes'
+!
+
+PPCPredicateNode comment:''
+!
+
+!PPCPredicateNode methodsFor:'as yet unclassified'!
+
+bodyOfPredicate: compiler
+ | id |
+ id := (compiler idFor: predicate prefixed: #predicate).
+ compiler addConstant: predicate as: id.
+
+ compiler addOnLine: '(context atEnd not and: [ ', id , ' value: context uncheckedPeek])'.
+ compiler indent.
+ compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'.
+ compiler add: 'ifTrue: [ context next ].'.
+ compiler dedent.
+!
+
+rewrite: changeStatus
+ | charSet |
+
+ (predicate class == PPCharSetPredicate) ifTrue: [
+ charSet := predicate.
+ ].
+ charSet := PPCharSetPredicate on: predicate.
+
+ (charSet equals: (PPCharSetPredicate on: [ :char | char isLetter])) ifTrue: [
+ changeStatus change.
+ ^ PPCMessagePredicateNode new
+ name: name;
+ message: #isLetter;
+ predicate: predicate;
+ yourself
+ ].
+
+ (charSet equals: (PPCharSetPredicate on: [ :char | char isDigit])) ifTrue: [
+ changeStatus change.
+ ^ PPCMessagePredicateNode new
+ name: name;
+ message: #isDigit;
+ predicate: predicate;
+ yourself
+ ].
+
+ (charSet equals: (PPCharSetPredicate on: [ :char | char isAlphaNumeric])) ifTrue: [
+ changeStatus change.
+ ^ PPCMessagePredicateNode new
+ name: name;
+ message: #isAlphaNumeric;
+ predicate: predicate;
+ yourself
+ ].
+
+ (charSet equals: (PPCharSetPredicate on: [ :char | char isSeparator])) ifTrue: [
+ changeStatus change.
+ ^ PPCMessagePredicateNode new
+ name: name;
+ message: #isSeparator;
+ predicate: predicate;
+ yourself
+ ].
+
+
+ (charSet equals: (PPCharSetPredicate on: [ :char | true ])) ifTrue: [
+ changeStatus change.
+ ^ PPCAnyNode new
+ name: name;
+ yourself
+ ].
+
+ changeStatus change.
+ ^ PPCCharSetPredicateNode new
+ name: name;
+ predicate: charSet;
+ yourself.
+! !
+