tokenizer=spaces (number | operator)
main= . . .
EBNF] call ast>>
+] unit-test
+
+{ "++" } [
+ "++--" [EBNF tokenizer=("++" | "--") main="++" EBNF] call ast>>
] unit-test
\ No newline at end of file
\r
: default-tokenizer ( -- tokenizer )\r
T{ tokenizer f \r
- [ [ drop t ] satisfy ]\r
+ [ any-char ]\r
[ token ]\r
- [ [ = ] curry satisfy ]\r
+ [ [ = ] curry any-char swap semantic ]\r
} ;\r
\r
: parser-tokenizer ( parser -- tokenizer )\r
- 1quotation [ [ = ] curry satisfy ] dup tokenizer boa ;\r
+ [ 1quotation ] keep\r
+ [ swap [ = ] curry semantic ] curry dup tokenizer boa ;\r
\r
: rule-tokenizer ( name word -- tokenizer )\r
rule parser-tokenizer ;\r
: parse-javascript ( string -- ast )
tokenize-javascript [
- ast>> parse-javascript [
+ ast>> javascript [
ast>>
] [
"Unable to parse JavaScript" throw
! Copyright (C) 2008 Chris Double.
! See http://factorcode.org/license.txt for BSD license.
!
-USING: kernel tools.test peg peg.javascript.ast peg.javascript.tokenizer
- peg.javascript.parser accessors multiline sequences math ;
+USING: kernel tools.test peg peg.javascript.ast peg.javascript.parser
+ accessors multiline sequences math ;
IN: peg.javascript.parser.tests
-\ parse-javascript must-infer
+\ javascript must-infer
{
T{
}
}
} [
- "123; 'hello'; foo(x);" tokenize-javascript ast>> parse-javascript ast>>
+ "123; 'hello'; foo(x);" javascript ast>>
] unit-test
{ t } [
<"
var x=5
var y=10
-"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
+"> javascript remaining>> length zero?
] unit-test
initial = f(initial, seq[i]);
return initial;
}
-"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
+"> javascript remaining>> length zero?
] unit-test
{ t } [
r.length = this.length - index;
return r;
}
-"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
+"> javascript remaining>> length zero?
] unit-test
! Copyright (C) 2008 Chris Double.
! See http://factorcode.org/license.txt for BSD license.
-USING: kernel accessors peg peg.ebnf peg.javascript.ast ;
+USING: kernel accessors peg peg.ebnf peg.javascript.ast peg.javascript.tokenizer ;
IN: peg.javascript.parser
#! Grammar for JavaScript. Based on OMeta-JS example from:
#! http://jarrett.cs.ucla.edu/ometa-js/#JavaScript_Compiler
-EBNF: parse-javascript
+EBNF: javascript
+tokenizer = <foreign tokenize-javascript Tok>
End = !(.)
Space = " " | "\t" | "\n"
Spaces = Space* => [[ ignore ]]