SystemOrganization addCategory: #'PetitRegex-Core'! PPCompositeParser subclass: #PPRegexParser instanceVariableNames: 'regex atom escapeCharacterAtom anyAtom beginOfLineAtom endOfLineAtom characterAtom' classVariableNames: '' poolDictionaries: '' category: 'PetitRegex-Core'! !PPRegexParser methodsFor: 'grammar-atoms' stamp: 'lr 2/7/2010 23:28'! anyAtom ^ $. asParser map: [ :char | #any asParser ]! ! !PPRegexParser methodsFor: 'grammar' stamp: 'lr 2/7/2010 23:34'! atom ^ escapeCharacterAtom / anyAtom / beginOfLineAtom / endOfLineAtom / characterAtom! ! !PPRegexParser methodsFor: 'grammar-atoms' stamp: 'lr 2/7/2010 23:28'! beginOfLineAtom ^ $^ asParser map: [ :char | [ :stream | stream position or: [ (stream skip: -1; next) = Character cr ] ] asParser ]! ! !PPRegexParser methodsFor: 'grammar-atoms' stamp: 'lr 2/7/2010 23:49'! characterAtom ^ #any asParser map: [ :char | char asParser ]! ! !PPRegexParser methodsFor: 'grammar-atoms' stamp: 'lr 2/7/2010 23:28'! endOfLineAtom ^ $$ asParser map: [ :char | [ :stream | stream atEnd or: [ stream peek = Character cr ] ] asParser ]! ! !PPRegexParser methodsFor: 'grammar-atoms' stamp: 'lr 2/7/2010 23:29'! escapeCharacterAtom ^ $\ asParser , #any asParser map: [ :escape :char | char asParser ]! ! !PPRegexParser methodsFor: 'grammar' stamp: 'lr 2/7/2010 23:49'! regex ^ PPExpressionParser new term: atom; group: [ :g | g postfix: $* do: [ :atom :op | atom star ]. g postfix: $+ do: [ :atom : op | atom plus ]. g postfix: $? do: [ :atom :op | atom optional ] ]; group: [ :g | g left: nil asParser do: [ :left :operator :right | left , right ] ]; group: [ :g | g left: $| do: [ :left :operator :right | left / right ] ]; yourself! ! !PPRegexParser methodsFor: 'accessing' stamp: 'lr 2/7/2010 23:24'! start ^ regex end! !