Rip out packrat stuff
It was broken since the transition to generating compiled quotations. As far as I know, no one was using packrat-parse anyway. Rework in progress...db4
parent
d1e7ede35d
commit
1c6882b32c
|
@ -1,7 +1,7 @@
|
|||
! Copyright (C) 2007, 2008 Chris Double, Doug Coleman.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: kernel sequences strings namespaces math assocs shuffle
|
||||
vectors arrays combinators.lib memoize math.parser match
|
||||
vectors arrays combinators.lib math.parser match
|
||||
unicode.categories sequences.deep peg peg.private
|
||||
peg.search math.ranges ;
|
||||
IN: peg.parsers
|
||||
|
@ -19,26 +19,26 @@ TUPLE: just-parser p1 ;
|
|||
M: just-parser compile ( parser -- quot )
|
||||
just-parser-p1 compile just-pattern append ;
|
||||
|
||||
MEMO: just ( parser -- parser )
|
||||
just-parser construct-boa init-parser ;
|
||||
: just ( parser -- parser )
|
||||
just-parser construct-boa ;
|
||||
|
||||
MEMO: 1token ( ch -- parser ) 1string token ;
|
||||
: 1token ( ch -- parser ) 1string token ;
|
||||
|
||||
<PRIVATE
|
||||
MEMO: (list-of) ( items separator repeat1? -- parser )
|
||||
: (list-of) ( items separator repeat1? -- parser )
|
||||
>r over 2seq r> [ repeat1 ] [ repeat0 ] if [ concat ] action 2seq
|
||||
[ unclip 1vector swap first append ] action ;
|
||||
PRIVATE>
|
||||
|
||||
MEMO: list-of ( items separator -- parser )
|
||||
: list-of ( items separator -- parser )
|
||||
hide f (list-of) ;
|
||||
|
||||
MEMO: list-of-many ( items separator -- parser )
|
||||
: list-of-many ( items separator -- parser )
|
||||
hide t (list-of) ;
|
||||
|
||||
MEMO: epsilon ( -- parser ) V{ } token ;
|
||||
: epsilon ( -- parser ) V{ } token ;
|
||||
|
||||
MEMO: any-char ( -- parser ) [ drop t ] satisfy ;
|
||||
: any-char ( -- parser ) [ drop t ] satisfy ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
|
@ -47,10 +47,10 @@ MEMO: any-char ( -- parser ) [ drop t ] satisfy ;
|
|||
|
||||
PRIVATE>
|
||||
|
||||
MEMO: exactly-n ( parser n -- parser' )
|
||||
: exactly-n ( parser n -- parser' )
|
||||
swap <repetition> seq ;
|
||||
|
||||
MEMO: at-most-n ( parser n -- parser' )
|
||||
: at-most-n ( parser n -- parser' )
|
||||
dup zero? [
|
||||
2drop epsilon
|
||||
] [
|
||||
|
@ -58,27 +58,27 @@ MEMO: at-most-n ( parser n -- parser' )
|
|||
-rot 1- at-most-n 2choice
|
||||
] if ;
|
||||
|
||||
MEMO: at-least-n ( parser n -- parser' )
|
||||
: at-least-n ( parser n -- parser' )
|
||||
dupd exactly-n swap repeat0 2seq
|
||||
[ flatten-vectors ] action ;
|
||||
|
||||
MEMO: from-m-to-n ( parser m n -- parser' )
|
||||
: from-m-to-n ( parser m n -- parser' )
|
||||
>r [ exactly-n ] 2keep r> swap - at-most-n 2seq
|
||||
[ flatten-vectors ] action ;
|
||||
|
||||
MEMO: pack ( begin body end -- parser )
|
||||
: pack ( begin body end -- parser )
|
||||
>r >r hide r> r> hide 3seq [ first ] action ;
|
||||
|
||||
MEMO: surrounded-by ( parser begin end -- parser' )
|
||||
: surrounded-by ( parser begin end -- parser' )
|
||||
[ token ] 2apply swapd pack ;
|
||||
|
||||
MEMO: 'digit' ( -- parser )
|
||||
: 'digit' ( -- parser )
|
||||
[ digit? ] satisfy [ digit> ] action ;
|
||||
|
||||
MEMO: 'integer' ( -- parser )
|
||||
: 'integer' ( -- parser )
|
||||
'digit' repeat1 [ 10 digits>integer ] action ;
|
||||
|
||||
MEMO: 'string' ( -- parser )
|
||||
: 'string' ( -- parser )
|
||||
[
|
||||
[ CHAR: " = ] satisfy hide ,
|
||||
[ CHAR: " = not ] satisfy repeat0 ,
|
||||
|
@ -97,7 +97,7 @@ MEMO: 'string' ( -- parser )
|
|||
] action
|
||||
replace ;
|
||||
|
||||
MEMO: range-pattern ( pattern -- parser )
|
||||
: range-pattern ( pattern -- parser )
|
||||
#! 'pattern' is a set of characters describing the
|
||||
#! parser to be produced. Any single character in
|
||||
#! the pattern matches that character. If the pattern
|
||||
|
|
|
@ -4,10 +4,6 @@
|
|||
USING: kernel tools.test strings namespaces arrays sequences peg peg.private ;
|
||||
IN: peg.tests
|
||||
|
||||
{ 0 1 2 } [
|
||||
0 next-id set-global get-next-id get-next-id get-next-id
|
||||
] unit-test
|
||||
|
||||
{ f } [
|
||||
"endbegin" "begin" token parse
|
||||
] unit-test
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
! Copyright (C) 2007 Chris Double.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: kernel sequences strings namespaces math assocs shuffle
|
||||
vectors arrays combinators.lib memoize math.parser match
|
||||
vectors arrays combinators.lib math.parser match
|
||||
unicode.categories sequences.lib compiler.units parser
|
||||
words ;
|
||||
IN: peg
|
||||
|
@ -10,70 +10,14 @@ TUPLE: parse-result remaining ast ;
|
|||
|
||||
GENERIC: compile ( parser -- quot )
|
||||
|
||||
: (parse) ( state parser -- result )
|
||||
: parse ( state parser -- result )
|
||||
compile call ;
|
||||
|
||||
|
||||
<PRIVATE
|
||||
|
||||
SYMBOL: packrat-cache
|
||||
SYMBOL: ignore
|
||||
SYMBOL: not-in-cache
|
||||
|
||||
: not-in-cache? ( result -- ? )
|
||||
not-in-cache = ;
|
||||
|
||||
: <parse-result> ( remaining ast -- parse-result )
|
||||
parse-result construct-boa ;
|
||||
|
||||
SYMBOL: next-id
|
||||
|
||||
: get-next-id ( -- number )
|
||||
next-id get-global 0 or dup 1+ next-id set-global ;
|
||||
|
||||
TUPLE: parser id ;
|
||||
|
||||
: init-parser ( parser -- parser )
|
||||
get-next-id parser construct-boa over set-delegate ;
|
||||
|
||||
: from ( slice-or-string -- index )
|
||||
dup slice? [ slice-from ] [ drop 0 ] if ;
|
||||
|
||||
: get-cached ( input parser -- result )
|
||||
[ from ] dip parser-id packrat-cache get at at* [
|
||||
drop not-in-cache
|
||||
] unless ;
|
||||
|
||||
: put-cached ( result input parser -- )
|
||||
parser-id dup packrat-cache get at [
|
||||
nip
|
||||
] [
|
||||
H{ } clone dup >r swap packrat-cache get set-at r>
|
||||
] if*
|
||||
[ from ] dip set-at ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: parse ( input parser -- result )
|
||||
packrat-cache get [
|
||||
2dup get-cached dup not-in-cache? [
|
||||
! "cache missed: " write over parser-id number>string write " - " write nl ! pick .
|
||||
drop
|
||||
#! Protect against left recursion blowing the callstack
|
||||
#! by storing a failed parse in the cache.
|
||||
[ f ] dipd [ put-cached ] 2keep
|
||||
[ (parse) dup ] 2keep put-cached
|
||||
] [
|
||||
! "cache hit: " write over parser-id number>string write " - " write nl ! pick .
|
||||
2nip
|
||||
] if
|
||||
] [
|
||||
(parse)
|
||||
] if ;
|
||||
|
||||
: packrat-parse ( input parser -- result )
|
||||
H{ } clone packrat-cache [ parse ] with-variable ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
TUPLE: token-parser symbol ;
|
||||
|
@ -295,17 +239,17 @@ M: delay-parser compile ( parser -- quot )
|
|||
|
||||
PRIVATE>
|
||||
|
||||
MEMO: token ( string -- parser )
|
||||
token-parser construct-boa init-parser ;
|
||||
: token ( string -- parser )
|
||||
token-parser construct-boa ;
|
||||
|
||||
: satisfy ( quot -- parser )
|
||||
satisfy-parser construct-boa init-parser ;
|
||||
satisfy-parser construct-boa ;
|
||||
|
||||
MEMO: range ( min max -- parser )
|
||||
range-parser construct-boa init-parser ;
|
||||
: range ( min max -- parser )
|
||||
range-parser construct-boa ;
|
||||
|
||||
: seq ( seq -- parser )
|
||||
seq-parser construct-boa init-parser ;
|
||||
seq-parser construct-boa ;
|
||||
|
||||
: 2seq ( parser1 parser2 -- parser )
|
||||
2array seq ;
|
||||
|
@ -320,7 +264,7 @@ MEMO: range ( min max -- parser )
|
|||
{ } make seq ; inline
|
||||
|
||||
: choice ( seq -- parser )
|
||||
choice-parser construct-boa init-parser ;
|
||||
choice-parser construct-boa ;
|
||||
|
||||
: 2choice ( parser1 parser2 -- parser )
|
||||
2array choice ;
|
||||
|
@ -334,32 +278,32 @@ MEMO: range ( min max -- parser )
|
|||
: choice* ( quot -- paser )
|
||||
{ } make choice ; inline
|
||||
|
||||
MEMO: repeat0 ( parser -- parser )
|
||||
repeat0-parser construct-boa init-parser ;
|
||||
: repeat0 ( parser -- parser )
|
||||
repeat0-parser construct-boa ;
|
||||
|
||||
MEMO: repeat1 ( parser -- parser )
|
||||
repeat1-parser construct-boa init-parser ;
|
||||
: repeat1 ( parser -- parser )
|
||||
repeat1-parser construct-boa ;
|
||||
|
||||
MEMO: optional ( parser -- parser )
|
||||
optional-parser construct-boa init-parser ;
|
||||
: optional ( parser -- parser )
|
||||
optional-parser construct-boa ;
|
||||
|
||||
MEMO: ensure ( parser -- parser )
|
||||
ensure-parser construct-boa init-parser ;
|
||||
: ensure ( parser -- parser )
|
||||
ensure-parser construct-boa ;
|
||||
|
||||
MEMO: ensure-not ( parser -- parser )
|
||||
ensure-not-parser construct-boa init-parser ;
|
||||
: ensure-not ( parser -- parser )
|
||||
ensure-not-parser construct-boa ;
|
||||
|
||||
: action ( parser quot -- parser )
|
||||
action-parser construct-boa init-parser ;
|
||||
action-parser construct-boa ;
|
||||
|
||||
MEMO: sp ( parser -- parser )
|
||||
sp-parser construct-boa init-parser ;
|
||||
: sp ( parser -- parser )
|
||||
sp-parser construct-boa ;
|
||||
|
||||
MEMO: hide ( parser -- parser )
|
||||
: hide ( parser -- parser )
|
||||
[ drop ignore ] action ;
|
||||
|
||||
MEMO: delay ( quot -- parser )
|
||||
delay-parser construct-boa init-parser ;
|
||||
: delay ( quot -- parser )
|
||||
delay-parser construct-boa ;
|
||||
|
||||
: PEG:
|
||||
(:) [
|
||||
|
|
Loading…
Reference in New Issue