add repeat0 and repeat1
							parent
							
								
									2d3fe08403
								
							
						
					
					
						commit
						691c62501f
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
! Copyright (C) 2007 Chris Double.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
!
 | 
			
		||||
USING: kernel tools.test strings namespaces arrays peg ;
 | 
			
		||||
USING: kernel tools.test strings namespaces arrays sequences peg ;
 | 
			
		||||
IN: temporary
 | 
			
		||||
 | 
			
		||||
{ 0 1 2 } [
 | 
			
		||||
| 
						 | 
				
			
			@ -68,4 +68,28 @@ IN: temporary
 | 
			
		|||
 | 
			
		||||
{ f } [
 | 
			
		||||
  "" 0 <parse-state> "a" token "b" token 2array choice parse 
 | 
			
		||||
] unit-test
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ 0 } [
 | 
			
		||||
  "" 0 <parse-state> "a" token repeat0 parse parse-result-ast length
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ 0 } [
 | 
			
		||||
  "b" 0 <parse-state> "a" token repeat0 parse parse-result-ast length
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ "aaa" } [
 | 
			
		||||
  "aaab" 0 <parse-state> "a" token repeat0 parse parse-result-matched 
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ f } [
 | 
			
		||||
  "" 0 <parse-state> "a" token repeat1 parse 
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ f } [
 | 
			
		||||
  "b" 0 <parse-state> "a" token repeat1 parse 
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ "aaa" } [
 | 
			
		||||
  "aaab" 0 <parse-state> "a" token repeat1 parse parse-result-matched 
 | 
			
		||||
] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
! Copyright (C) 2007 Chris Double.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: kernel sequences strings namespaces math assocs combinators.lib ;
 | 
			
		||||
USING: kernel sequences strings namespaces math assocs shuffle combinators.lib ;
 | 
			
		||||
IN: peg
 | 
			
		||||
 | 
			
		||||
TUPLE: parse-state input cache ;
 | 
			
		||||
| 
						 | 
				
			
			@ -108,3 +108,37 @@ M: choice-parser parse ( state parser -- result )
 | 
			
		|||
 | 
			
		||||
: choice ( seq -- parser )
 | 
			
		||||
  choice-parser construct-boa init-parser ;
 | 
			
		||||
 | 
			
		||||
TUPLE: repeat0-parser p1 ;
 | 
			
		||||
 | 
			
		||||
: (repeat-parser) ( parser result -- result )
 | 
			
		||||
  2dup parse-result-remaining swap parse [
 | 
			
		||||
    [ parse-result-remaining swap set-parse-result-remaining ] 2keep 
 | 
			
		||||
    [ parse-result-ast swap parse-result-ast push ] 2keep
 | 
			
		||||
    parse-result-matched swap [ parse-result-matched swap append ] keep [ set-parse-result-matched ] keep 
 | 
			
		||||
    (repeat-parser) 
 | 
			
		||||
 ] [
 | 
			
		||||
    nip
 | 
			
		||||
  ] if* ;
 | 
			
		||||
 | 
			
		||||
: clone-result ( result -- result )
 | 
			
		||||
  { parse-result-remaining parse-result-matched parse-result-ast }
 | 
			
		||||
  get-slots V{ } clone-like <parse-result> ;
 | 
			
		||||
 | 
			
		||||
M: repeat0-parser parse ( state parser -- result )
 | 
			
		||||
     repeat0-parser-p1 2dup parse [ 
 | 
			
		||||
       nipd clone-result (repeat-parser) 
 | 
			
		||||
     ] [ 
 | 
			
		||||
       drop "" V{ } clone <parse-result> 
 | 
			
		||||
     ] if* ;
 | 
			
		||||
 | 
			
		||||
: repeat0 ( parser -- parser )
 | 
			
		||||
  repeat0-parser construct-boa init-parser ;
 | 
			
		||||
 | 
			
		||||
TUPLE: repeat1-parser p1 ;
 | 
			
		||||
 | 
			
		||||
M: repeat1-parser parse ( state parser -- result )
 | 
			
		||||
     repeat1-parser-p1 tuck parse dup [ clone-result (repeat-parser) ] [ nip ] if ;
 | 
			
		||||
 | 
			
		||||
: repeat1 ( parser -- parser )
 | 
			
		||||
  repeat1-parser construct-boa init-parser ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue