remove match from parse results

release
Chris Double 2007-11-21 15:31:23 +13:00
parent 691c62501f
commit e9df13dad5
2 changed files with 21 additions and 23 deletions

View File

@ -24,9 +24,9 @@ IN: temporary
"endbegin" 0 <parse-state> "begin" token parse
] unit-test
{ "begin" "begin" "end" } [
{ "begin" "end" } [
"beginend" 0 <parse-state> "begin" token parse
{ parse-result-matched parse-result-ast parse-result-remaining } get-slots
{ parse-result-ast parse-result-remaining } get-slots
parse-state-input >string
] unit-test
@ -50,16 +50,16 @@ IN: temporary
"bad" 0 <parse-state> "a" token "b" token 2array seq parse
] unit-test
{ "go" } [
"good" 0 <parse-state> "g" token "o" token 2array seq parse parse-result-matched
{ V{ "g" "o" } } [
"good" 0 <parse-state> "g" token "o" token 2array seq parse parse-result-ast
] unit-test
{ "a" } [
"abcd" 0 <parse-state> "a" token "b" token 2array choice parse parse-result-matched
"abcd" 0 <parse-state> "a" token "b" token 2array choice parse parse-result-ast
] unit-test
{ "b" } [
"bbcd" 0 <parse-state> "a" token "b" token 2array choice parse parse-result-matched
"bbcd" 0 <parse-state> "a" token "b" token 2array choice parse parse-result-ast
] unit-test
{ f } [
@ -78,8 +78,8 @@ IN: temporary
"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
{ V{ "a" "a" "a" } } [
"aaab" 0 <parse-state> "a" token repeat0 parse parse-result-ast
] unit-test
{ f } [
@ -90,6 +90,6 @@ IN: temporary
"b" 0 <parse-state> "a" token repeat1 parse
] unit-test
{ "aaa" } [
"aaab" 0 <parse-state> "a" token repeat1 parse parse-result-matched
{ V{ "a" "a" "a" } } [
"aaab" 0 <parse-state> "a" token repeat1 parse parse-result-ast
] unit-test

View File

@ -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 shuffle combinators.lib ;
USING: kernel sequences strings namespaces math assocs shuffle vectors combinators.lib ;
IN: peg
TUPLE: parse-state input cache ;
@ -20,9 +20,9 @@ TUPLE: parse-state input cache ;
[ parse-state-input ] dip tail-slice
{ set-parse-state-cache set-parse-state-input } parse-state construct ;
TUPLE: parse-result remaining matched ast ;
TUPLE: parse-result remaining ast ;
: <parse-result> ( remaining matched ast -- parse-result )
: <parse-result> ( remaining ast -- parse-result )
parse-result construct-boa ;
SYMBOL: next-id
@ -41,7 +41,7 @@ TUPLE: token-parser symbol ;
M: token-parser parse ( state parser -- result )
token-parser-symbol 2dup >r parse-state-input r> head? [
dup >r length state-tail r> dup <parse-result>
dup >r length state-tail r> <parse-result>
] [
2drop f
] if ;
@ -57,7 +57,7 @@ M: range-parser parse ( state parser -- result )
] [
0 pick parse-state-input nth dup rot
{ range-parser-min range-parser-max } get-slots between? [
[ 1 state-tail ] dip dup <parse-result>
[ 1 state-tail ] dip <parse-result>
] [
2drop f
] if
@ -71,8 +71,7 @@ TUPLE: seq-parser parsers ;
: do-seq-parser ( result parser -- result )
[ dup parse-result-remaining ] dip 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
parse-result-ast swap [ parse-result-ast push ] keep
] [
drop f
] if* ;
@ -85,7 +84,7 @@ TUPLE: seq-parser parsers ;
] if ;
M: seq-parser parse ( state parser -- result )
seq-parser-parsers [ "" V{ } clone <parse-result> ] dip (seq-parser) ;
seq-parser-parsers [ V{ } clone <parse-result> ] dip (seq-parser) ;
: seq ( seq -- parser )
seq-parser construct-boa init-parser ;
@ -114,22 +113,21 @@ 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
parse-result-ast swap [ parse-result-ast push ] 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> ;
{ parse-result-remaining parse-result-ast }
get-slots 1vector <parse-result> ;
M: repeat0-parser parse ( state parser -- result )
repeat0-parser-p1 2dup parse [
nipd clone-result (repeat-parser)
] [
drop "" V{ } clone <parse-result>
drop V{ } clone <parse-result>
] if* ;
: repeat0 ( parser -- parser )