Hi list,
when using the peg.* parsing words to parse a sequence of elements, what is
the best way to detect invalid input ? By default the parsing stops when
rules don't match (end of input, or bad input),

For example, consider the following case:
"abaXbba" [EBNF rule= ("a" | "b")* EBNF] ! V{ "a" "b" "a" }
"abaabba" [EBNF rule= ("a" | "b")* EBNF] ! V{ "a" "b" "a" "a" "b" "b" "a" }

Sometimes, in the first case, you want the parsing to throw, or to return a
boolean or return the remaining text to parse.

The following works, but uses low level words:
"abbaXbba" <EBNF rule= ("a" | "b")* EBNF> (parse) [ ast>> ] [ remaining>>
empty? ] bi

The following also works (I think)
"abaXbba" [EBNF rule= ("a" | "b" | . => [[ "invalid" throw ]] )* EBNF]
or with lookahead
"abaXbba" [EBNF rule= ("a" | "b")* !(.) EBNF]
Those two work, but then you can't use the same parser for both behaviors,
and they use "advanced" (actions or lookahead) features for a simple task.

Should we add words to do this more easily ?
maybe
: parse* ( string parser -- ast remaining )
: parse-all ( string parser -- ast ) ! throws when remaining not empty

Maybe EBNF: can define several words ? (but it's bad for grepability...)

Or maybe just document the existing solution with <EBNF> and remaining>>
What do you think ?

Cheers,
Jon
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to