Rebol[
	Title: "Parseen"
	Date: 28-Nov-2010/9:09:13+1:00
	History: [
		26/Apr/2003/11:30			"working version"
		21/Dec/2004/13:40			"thru-rule added"
		22/Dec/2004/8:05			"lit added"
		18-Mar-2007/1:45:14+1:00	"do-block corrected"
		18-Mar-2007/9:57:05+1:00	"dialect upgraded"
		16-Oct-2010/23:13:26+2:00	"then-rule added"
									"the parseen function removed"
									"lit rule renamed to quote-rule"
		31-Oct-2010/9:16:55+1:00	"if-rule added"
	]
	File: %parseen.r
	Author: "Ladislav Mecir"
	Purpose: {Parse enhancements for R2}
]

comment [
	; Example # 1  

	rule: not-rule [any "a" "b"]
	parse "ab" rule
	parse "b" rule
	parse "" rule

	; Example # 2

	rule: not-rule "aa"
	parse "ab" [rule any "a" "b"]
	parse "aab" [rule any "a" "b"]

	; Example # 3

	rule: not-rule quote-rule 1
	parse [1] [any [rule skip]]
	parse [2] [any [rule skip]]

	; Example # 4

	rule: not-rule integer!
	parse [1 a] [rule to end]
	parse [a 1] [rule to end]

	; Example # 5

	parse [a b c 1 d] [any [rule skip]]
	parse [a b c d e] [any [rule skip]]

	; Example # 6

	result: ""
	rule: to-rule [" " | "
"] parse/all "aa" [rule result: to end] probe result parse/all "a a
" [rule result: to end] probe result parse/all "ab
" [rule result: to end] probe result ; Example # 7 digit: charset [#"0" - #"9"] four-digit: [4 digit] rule: to-rule four-digit parse/all "abcd 1234" [rule copy fd four-digit to end] probe fd ; Example # 8 pm: charset "+-" rule: thru-rule pm parse "assdasasasa+" [copy t rule] probe t ; Example # 9 rule: quote-rule first ['ahoj] parse ['ahoj] rule parse [ahoj] rule ; Example # 10 rule: if-rule (false) parse [] rule ; Example # 11 rule: if-rule (true) parse [] rule ] ; a rule that always fails, opposite to none fail: [end skip] use [x y z] [ then-rule: func [ {generate the A THEN B | C rule} a b c /local d ] [ d: copy first [(x:)] reduce [reduce [a append/only d b '| append/only d c] 'x] ] not-rule: func [ {generate the NOT A rule} a ] [ reduce [append reduce [a] [(x: fail) | (x: none)] 'x] ] and-rule: func [ {generate the AND A rule} a ] [ reduce [append reduce [a] [(x: fail) | (x: none)] fail '| 'x] ] to-rule: func [ {generate the TO A rule} a ] [ reduce [ 'any reduce [ append reduce [a] [(x: fail y: none) | (x: 'skip y: fail)] 'x ] 'y ] ] thru-rule: func [ {generate the THRU A rule} a ] [ reduce [ 'any reduce [ append reduce [a] [x: (y: fail z: [:x]) | (y: 'skip z: fail)] 'y ] 'z ] ] quote-rule: func [ {generate the QUOTE A rule} a /local b ] [ b: copy/deep [copy x skip (y: unless equal? x) y] append/only append/only fourth b reduce [:a] [fail] b ] if-rule: func [ {generate the IF A rule} 'a [paren!] ] [ a: reduce [first [x:] 'either :a [none] [[end skip]]] reduce [to paren! a 'x] ] ]