peg refactorings
parent
46b0df2631
commit
9fc2175403
|
@ -17,7 +17,7 @@ TUPLE: just-parser p1 ;
|
||||||
|
|
||||||
|
|
||||||
M: just-parser (compile) ( parser -- quot )
|
M: just-parser (compile) ( parser -- quot )
|
||||||
just-parser-p1 compiled-parser just-pattern curry ;
|
just-parser-p1 compile-parser just-pattern curry ;
|
||||||
|
|
||||||
: just ( parser -- parser )
|
: just ( parser -- parser )
|
||||||
just-parser boa wrap-peg ;
|
just-parser boa wrap-peg ;
|
||||||
|
|
|
@ -280,7 +280,13 @@ GENERIC: (compile) ( peg -- quot )
|
||||||
gensym 2dup swap peg>> (compile) 0 1 <effect> define-declared swap dupd id>> "peg-id" set-word-prop
|
gensym 2dup swap peg>> (compile) 0 1 <effect> define-declared swap dupd id>> "peg-id" set-word-prop
|
||||||
[ execute-parser ] curry ;
|
[ execute-parser ] curry ;
|
||||||
|
|
||||||
: compiled-parser ( parser -- word )
|
: preset-parser-word ( parser -- parser word )
|
||||||
|
gensym [ >>compiled ] keep ;
|
||||||
|
|
||||||
|
: define-parser-word ( parser word -- )
|
||||||
|
swap parser-body (( -- result )) define-declared ;
|
||||||
|
|
||||||
|
: compile-parser ( parser -- word )
|
||||||
#! Look to see if the given parser has been compiled.
|
#! Look to see if the given parser has been compiled.
|
||||||
#! If not, compile it to a temporary word, cache it,
|
#! If not, compile it to a temporary word, cache it,
|
||||||
#! and return it. Otherwise return the existing one.
|
#! and return it. Otherwise return the existing one.
|
||||||
|
@ -290,7 +296,7 @@ GENERIC: (compile) ( peg -- quot )
|
||||||
dup compiled>> [
|
dup compiled>> [
|
||||||
nip
|
nip
|
||||||
] [
|
] [
|
||||||
gensym tuck >>compiled 2dup parser-body 0 1 <effect> define-declared dupd "peg" set-word-prop
|
preset-parser-word [ define-parser-word ] keep
|
||||||
] if* ;
|
] if* ;
|
||||||
|
|
||||||
SYMBOL: delayed
|
SYMBOL: delayed
|
||||||
|
@ -299,13 +305,13 @@ SYMBOL: delayed
|
||||||
#! Work through all delayed parsers and recompile their
|
#! Work through all delayed parsers and recompile their
|
||||||
#! words to have the correct bodies.
|
#! words to have the correct bodies.
|
||||||
delayed get [
|
delayed get [
|
||||||
call compiled-parser 1quotation 0 1 <effect> define-declared
|
call compile-parser 1quotation 0 1 <effect> define-declared
|
||||||
] assoc-each ;
|
] assoc-each ;
|
||||||
|
|
||||||
: compile ( parser -- word )
|
: compile ( parser -- word )
|
||||||
[
|
[
|
||||||
H{ } clone delayed [
|
H{ } clone delayed [
|
||||||
compiled-parser fixup-delayed
|
compile-parser fixup-delayed
|
||||||
] with-variable
|
] with-variable
|
||||||
] with-compilation-unit ;
|
] with-compilation-unit ;
|
||||||
|
|
||||||
|
@ -412,8 +418,8 @@ M: seq-parser (compile) ( peg -- quot )
|
||||||
[
|
[
|
||||||
[ input-slice V{ } clone <parse-result> ] %
|
[ input-slice V{ } clone <parse-result> ] %
|
||||||
[
|
[
|
||||||
parsers>> unclip compiled-parser 1quotation [ parse-seq-element ] curry ,
|
parsers>> unclip compile-parser 1quotation [ parse-seq-element ] curry ,
|
||||||
[ compiled-parser 1quotation [ merge-errors ] compose [ parse-seq-element ] curry , ] each
|
[ compile-parser 1quotation [ merge-errors ] compose [ parse-seq-element ] curry , ] each
|
||||||
] { } make , \ && ,
|
] { } make , \ && ,
|
||||||
] [ ] make ;
|
] [ ] make ;
|
||||||
|
|
||||||
|
@ -422,7 +428,7 @@ TUPLE: choice-parser parsers ;
|
||||||
M: choice-parser (compile) ( peg -- quot )
|
M: choice-parser (compile) ( peg -- quot )
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
parsers>> [ compiled-parser ] map
|
parsers>> [ compile-parser ] map
|
||||||
unclip 1quotation , [ 1quotation [ merge-errors ] compose , ] each
|
unclip 1quotation , [ 1quotation [ merge-errors ] compose , ] each
|
||||||
] { } make , \ || ,
|
] { } make , \ || ,
|
||||||
] [ ] make ;
|
] [ ] make ;
|
||||||
|
@ -439,7 +445,7 @@ TUPLE: repeat0-parser p1 ;
|
||||||
] if* ; inline
|
] if* ; inline
|
||||||
|
|
||||||
M: repeat0-parser (compile) ( peg -- quot )
|
M: repeat0-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[
|
p1>> compile-parser 1quotation '[
|
||||||
input-slice V{ } clone <parse-result> , swap (repeat)
|
input-slice V{ } clone <parse-result> , swap (repeat)
|
||||||
] ;
|
] ;
|
||||||
|
|
||||||
|
@ -453,7 +459,7 @@ TUPLE: repeat1-parser p1 ;
|
||||||
] if* ;
|
] if* ;
|
||||||
|
|
||||||
M: repeat1-parser (compile) ( peg -- quot )
|
M: repeat1-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[
|
p1>> compile-parser 1quotation '[
|
||||||
input-slice V{ } clone <parse-result> , swap (repeat) repeat1-empty-check
|
input-slice V{ } clone <parse-result> , swap (repeat) repeat1-empty-check
|
||||||
] ;
|
] ;
|
||||||
|
|
||||||
|
@ -463,7 +469,7 @@ TUPLE: optional-parser p1 ;
|
||||||
[ input-slice f <parse-result> ] unless* ;
|
[ input-slice f <parse-result> ] unless* ;
|
||||||
|
|
||||||
M: optional-parser (compile) ( peg -- quot )
|
M: optional-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[ @ check-optional ] ;
|
p1>> compile-parser 1quotation '[ @ check-optional ] ;
|
||||||
|
|
||||||
TUPLE: semantic-parser p1 quot ;
|
TUPLE: semantic-parser p1 quot ;
|
||||||
|
|
||||||
|
@ -475,7 +481,7 @@ TUPLE: semantic-parser p1 quot ;
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
M: semantic-parser (compile) ( peg -- quot )
|
M: semantic-parser (compile) ( peg -- quot )
|
||||||
[ p1>> compiled-parser 1quotation ] [ quot>> ] bi
|
[ p1>> compile-parser 1quotation ] [ quot>> ] bi
|
||||||
'[ @ , check-semantic ] ;
|
'[ @ , check-semantic ] ;
|
||||||
|
|
||||||
TUPLE: ensure-parser p1 ;
|
TUPLE: ensure-parser p1 ;
|
||||||
|
@ -484,7 +490,7 @@ TUPLE: ensure-parser p1 ;
|
||||||
[ ignore <parse-result> ] [ drop f ] if ;
|
[ ignore <parse-result> ] [ drop f ] if ;
|
||||||
|
|
||||||
M: ensure-parser (compile) ( peg -- quot )
|
M: ensure-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[ input-slice @ check-ensure ] ;
|
p1>> compile-parser 1quotation '[ input-slice @ check-ensure ] ;
|
||||||
|
|
||||||
TUPLE: ensure-not-parser p1 ;
|
TUPLE: ensure-not-parser p1 ;
|
||||||
|
|
||||||
|
@ -492,7 +498,7 @@ TUPLE: ensure-not-parser p1 ;
|
||||||
[ drop f ] [ ignore <parse-result> ] if ;
|
[ drop f ] [ ignore <parse-result> ] if ;
|
||||||
|
|
||||||
M: ensure-not-parser (compile) ( peg -- quot )
|
M: ensure-not-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[ input-slice @ check-ensure-not ] ;
|
p1>> compile-parser 1quotation '[ input-slice @ check-ensure-not ] ;
|
||||||
|
|
||||||
TUPLE: action-parser p1 quot ;
|
TUPLE: action-parser p1 quot ;
|
||||||
|
|
||||||
|
@ -504,7 +510,7 @@ TUPLE: action-parser p1 quot ;
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
M: action-parser (compile) ( peg -- quot )
|
M: action-parser (compile) ( peg -- quot )
|
||||||
[ p1>> compiled-parser 1quotation ] [ quot>> ] bi '[ @ , check-action ] ;
|
[ p1>> compile-parser 1quotation ] [ quot>> ] bi '[ @ , check-action ] ;
|
||||||
|
|
||||||
: left-trim-slice ( string -- string )
|
: left-trim-slice ( string -- string )
|
||||||
#! Return a new string without any leading whitespace
|
#! Return a new string without any leading whitespace
|
||||||
|
@ -516,7 +522,7 @@ M: action-parser (compile) ( peg -- quot )
|
||||||
TUPLE: sp-parser p1 ;
|
TUPLE: sp-parser p1 ;
|
||||||
|
|
||||||
M: sp-parser (compile) ( peg -- quot )
|
M: sp-parser (compile) ( peg -- quot )
|
||||||
p1>> compiled-parser 1quotation '[
|
p1>> compile-parser 1quotation '[
|
||||||
input-slice left-trim-slice input-from pos set @
|
input-slice left-trim-slice input-from pos set @
|
||||||
] ;
|
] ;
|
||||||
|
|
||||||
|
@ -535,7 +541,7 @@ M: box-parser (compile) ( peg -- quot )
|
||||||
#! to produce the parser to be compiled.
|
#! to produce the parser to be compiled.
|
||||||
#! This differs from 'delay' which calls
|
#! This differs from 'delay' which calls
|
||||||
#! it at run time.
|
#! it at run time.
|
||||||
quot>> call compiled-parser 1quotation ;
|
quot>> call compile-parser 1quotation ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue