! Copyright (C) 2007 Chris Double.\r
! See http://factorcode.org/license.txt for BSD license.\r
- USING: kernel compiler.units parser words arrays strings math.parser sequences \r
+ USING: kernel compiler.units words arrays strings math.parser sequences \r
quotations vectors namespaces math assocs continuations peg\r
- peg.parsers unicode.categories multiline combinators combinators.lib \r
- splitting accessors effects sequences.deep peg.search inference \r
- io.streams.string io prettyprint parser ;\r
+ peg.parsers unicode.categories multiline combinators.lib \r
+ splitting accessors effects sequences.deep peg.search\r
+ combinators.short-circuit ;\r
IN: peg.ebnf\r
\r
+ : rule ( name word -- parser )\r
+ #! Given an EBNF word produced from EBNF: return the EBNF rule\r
+ "ebnf-parser" word-prop at ;\r
+ \r
+ TUPLE: tokenizer any one many ;\r
+ \r
+ : default-tokenizer ( -- tokenizer )\r
+ T{ tokenizer f \r
+ [ any-char ]\r
+ [ token ]\r
+ [ [ = ] curry any-char swap semantic ]\r
+ } ;\r
+ \r
+ : parser-tokenizer ( parser -- tokenizer )\r
+ [ 1quotation ] keep\r
+ [ swap [ = ] curry semantic ] curry dup tokenizer boa ;\r
+ \r
+ : rule-tokenizer ( name word -- tokenizer )\r
+ rule parser-tokenizer ;\r
+ \r
+ : tokenizer ( -- word )\r
+ \ tokenizer get-global [ default-tokenizer ] unless* ;\r
+ \r
+ : reset-tokenizer ( -- )\r
+ default-tokenizer \ tokenizer set-global ;\r
+ \r
+ : TOKENIZER: \r
+ scan search [ "Tokenizer not found" throw ] unless*\r
+ execute \ tokenizer set-global ; parsing\r
+ \r
TUPLE: ebnf-non-terminal symbol ;\r
TUPLE: ebnf-terminal symbol ;\r
+ TUPLE: ebnf-foreign word rule ;\r
TUPLE: ebnf-any-character ;\r
TUPLE: ebnf-range pattern ;\r
TUPLE: ebnf-ensure group ;\r