Add packrat-parse, etc
parent
f6b7f8197e
commit
fa8b311b27
|
@ -266,7 +266,7 @@ M: ebnf-non-terminal (transform) ( ast -- parser )
|
||||||
] [ ] make delay sp ;
|
] [ ] make delay sp ;
|
||||||
|
|
||||||
: transform-ebnf ( string -- object )
|
: transform-ebnf ( string -- object )
|
||||||
'ebnf' [ parse ] packrat-parse parse-result-ast transform ;
|
'ebnf' packrat-parse parse-result-ast transform ;
|
||||||
|
|
||||||
: check-parse-result ( result -- result )
|
: check-parse-result ( result -- result )
|
||||||
dup [
|
dup [
|
||||||
|
@ -281,7 +281,7 @@ M: ebnf-non-terminal (transform) ( ast -- parser )
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: ebnf>quot ( string -- hashtable quot )
|
: ebnf>quot ( string -- hashtable quot )
|
||||||
'ebnf' [ parse ] with-packrat check-parse-result
|
'ebnf' packrat-parse check-parse-result
|
||||||
parse-result-ast transform dup main swap at compile 1quotation ;
|
parse-result-ast transform dup main swap at compile 1quotation ;
|
||||||
|
|
||||||
: [EBNF "EBNF]" parse-multiline-string ebnf>quot nip parsed ; parsing
|
: [EBNF "EBNF]" parse-multiline-string ebnf>quot nip parsed ; parsing
|
||||||
|
|
|
@ -12,7 +12,7 @@ HELP: parse
|
||||||
{ $description
|
{ $description
|
||||||
"Given the input string, parse it using the given parser. The result is a <parse-result> object if "
|
"Given the input string, parse it using the given parser. The result is a <parse-result> object if "
|
||||||
"the parse was successful, otherwise it is f." }
|
"the parse was successful, otherwise it is f." }
|
||||||
{ $see-also compile with-packrat } ;
|
{ $see-also compile with-packrat packrat-parse } ;
|
||||||
|
|
||||||
HELP: with-packrat
|
HELP: with-packrat
|
||||||
{ $values
|
{ $values
|
||||||
|
@ -23,8 +23,30 @@ HELP: with-packrat
|
||||||
"Calls the quotation with a packrat cache in scope. Usually the quotation will "
|
"Calls the quotation with a packrat cache in scope. Usually the quotation will "
|
||||||
"call " { $link parse } " or call a word produced by " { $link compile } "."
|
"call " { $link parse } " or call a word produced by " { $link compile } "."
|
||||||
"The cache is used to avoid the possible exponential time performace that pegs "
|
"The cache is used to avoid the possible exponential time performace that pegs "
|
||||||
"can have, instead giving linear time at the cost of increased memory usage." }
|
"can have, instead giving linear time at the cost of increased memory usage. "
|
||||||
{ $see-also compile parse } ;
|
"Use of this packrat option also allows direct and indirect recursion to "
|
||||||
|
"be handled in the parser without entering an infinite loop." }
|
||||||
|
{ $see-also compile parse packrat-parse packrat-call } ;
|
||||||
|
|
||||||
|
HELP: packrat-parse
|
||||||
|
{ $values
|
||||||
|
{ "input" "a string" }
|
||||||
|
{ "parser" "a parser" }
|
||||||
|
{ "result" "a parse-result or f" }
|
||||||
|
}
|
||||||
|
{ $description
|
||||||
|
"Compiles and calls the parser with a packrat cache in scope." }
|
||||||
|
{ $see-also compile parse packrat-call with-packrat } ;
|
||||||
|
|
||||||
|
HELP: packrat-call
|
||||||
|
{ $values
|
||||||
|
{ "input" "a string" }
|
||||||
|
{ "quot" "a quotation with stack effect ( input -- result )" }
|
||||||
|
{ "result" "a parse-result or f" }
|
||||||
|
}
|
||||||
|
{ $description
|
||||||
|
"Calls the compiled parser with a packrat cache in scope." }
|
||||||
|
{ $see-also compile packrat-call packrat-parse with-packrat } ;
|
||||||
|
|
||||||
HELP: compile
|
HELP: compile
|
||||||
{ $values
|
{ $values
|
||||||
|
@ -36,7 +58,7 @@ HELP: compile
|
||||||
"The mapping from parser to compiled word is kept in a cache. If you later change "
|
"The mapping from parser to compiled word is kept in a cache. If you later change "
|
||||||
"the definition of a parser you'll need to clear this cache with "
|
"the definition of a parser you'll need to clear this cache with "
|
||||||
{ $link reset-compiled-parsers } " before using " { $link compile } " on that parser again." }
|
{ $link reset-compiled-parsers } " before using " { $link compile } " on that parser again." }
|
||||||
{ $see-also compile with-packrat reset-compiled-parsers } ;
|
{ $see-also compile with-packrat reset-compiled-parsers packrat-call packrat-parse } ;
|
||||||
|
|
||||||
HELP: reset-compiled-parsers
|
HELP: reset-compiled-parsers
|
||||||
{ $description
|
{ $description
|
||||||
|
|
|
@ -67,11 +67,17 @@ GENERIC: (compile) ( parser -- quot )
|
||||||
[ compiled-parser ] with-compilation-unit ;
|
[ compiled-parser ] with-compilation-unit ;
|
||||||
|
|
||||||
: parse ( state parser -- result )
|
: parse ( state parser -- result )
|
||||||
compile execute ;
|
compile execute ; inline
|
||||||
|
|
||||||
: with-packrat ( quot -- result )
|
: with-packrat ( quot -- result )
|
||||||
#! Run the quotation with a packrat cache active.
|
#! Run the quotation with a packrat cache active.
|
||||||
[ H{ } clone packrat ] dip with-variable ;
|
[ H{ } clone packrat ] dip with-variable ; inline
|
||||||
|
|
||||||
|
: packrat-parse ( state parser -- result )
|
||||||
|
[ parse ] with-packrat ;
|
||||||
|
|
||||||
|
: packrat-call ( state quot -- result )
|
||||||
|
with-packrat ; inline
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue