generated parser API
parse
parses input2ms ‣
const e=t.generate("start = 'a'");o(e.parse("a")).to.equal("a")
parses input in library mode1ms ‣
const e=t.generate("start = 'a'").parse("a",{peg$library:!0});o(e.peg$result).to.equal("a"),o(e.peg$success).to.equal(!0),o(e.peg$throw).to.equal(void 0)
throws an exception on syntax error3ms ‣
const e=t.generate("start = 'a'");o((()=>{e.parse("b")})).to.throw()
gives partial result on syntax error in library mode3ms ‣
const e=t.generate("start = 'a'+").parse("aab",{peg$library:!0});o(e.peg$result).to.deep.equal(["a","a"]),o(e.peg$success).to.equal(!1),o(e.peg$throw).to.throw('Expected "a" or end of input but "b" found.')
correctly describe character class in syntax error2ms ‣
const e=t.generate("start = [123-5]");o((()=>{e.parse("0")})).to.throw("[123-5]")
accepts custom options1ms ‣
t.generate("start = 'a'").parse("a",{foo:42})
start rule
when |startRule| is not set
starts parsing from the first allowed rule1ms ‣
o(e.parse("x")).to.equal("b")
when |startRule| is set to an allowed rule
starts parsing from specified rule0ms ‣
o(e.parse("x",{startRule:"b"})).to.equal("b"),o(e.parse("x",{startRule:"c"})).to.equal("c")
when |startRule| is set to a disallowed start rule
throws an exception0ms ‣
o((()=>{e.parse("x",{startRule:"a"})})).to.throw()
tracing
default tracer
traces using console.log (if console is defined)1ms ‣
const t=["1:1-1:1 rule.enter start","1:1-1:1 rule.enter a","1:1-1:1 rule.fail a","1:1-1:1 rule.enter b","1:1-1:2 rule.match b","1:1-1:2 rule.match start"];"object"==typeof console&&a(console,"log");try{e.parse("b"),"object"==typeof console&&(o(console.log.callCount).to.equal(t.length),t.forEach(((e,t)=>{const r=console.log.getCall(t);o(r.calledWithExactly(e)).to.equal(!0)})))}finally{"object"==typeof console&&console.log.restore()}
custom tracers
trace
receives tracing events1ms ‣
const t=[{type:"rule.enter",rule:"start",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:0,line:1,column:1}}},{type:"rule.enter",rule:"a",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:0,line:1,column:1}}},{type:"rule.fail",rule:"a",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:0,line:1,column:1}}},{type:"rule.enter",rule:"b",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:0,line:1,column:1}}},{type:"rule.match",rule:"b",result:"b",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:1,line:1,column:2}}},{type:"rule.match",rule:"start",result:"b",location:{source:void 0,start:{offset:0,line:1,column:1},end:{offset:1,line:1,column:2}}}],a={trace:r()};e.parse("b",{tracer:a}),o(a.trace.callCount).to.equal(t.length),t.forEach(((e,t)=>{const r=a.trace.getCall(t);o(r.calledWithExactly(e)).to.equal(!0)}))
Peggy API
has the correct VERSION0ms ‣
expect(peg.VERSION).to.equal(pkg.version),globalThis.peggyVersion=peg.VERSION
generate
generates a parser1ms ‣
const e=peg.generate("start = 'a'");expect(e).to.be.an("object"),expect(e.parse("a")).to.equal("a")
throws an exception on syntax error2ms ‣
expect((()=>{peg.generate("start = @")})).to.throw(),expect((()=>{peg.generate("start = 'a'\n")})).to.throw(),expect((()=>{peg.generate("start = 'a'\n")})).to.throw()
throws an exception on semantic error0ms ‣
expect((()=>{peg.generate("start = undefined")})).to.throw()
throws an exception on bad startRule0ms ‣
expect((()=>{peg.parser.parse("start = 'a'",{startRule:"BAD_START_RULE"})})).to.throw()
accepts custom options0ms ‣
peg.generate("start = 'a'",{grammarSource:42})
allowed start rules
when |allowedStartRules| is not set
generated parser can start only from the first rule1ms ‣
const t=peg.generate(e);expect(t.parse("x",{startRule:"a"})).to.equal("x"),expect((()=>{t.parse("x",{startRule:"b"})})).to.throw(),expect((()=>{t.parse("x",{startRule:"c"})})).to.throw()
when |allowedStartRules| is set
generated parser can start only from specified rules1ms ‣
const t=peg.generate(e,{allowedStartRules:["b","c"]});expect((()=>{t.parse("x",{startRule:"a"})})).to.throw(),expect(t.parse("x",{startRule:"b"})).to.equal("x"),expect(t.parse("x",{startRule:"c"})).to.equal("x")
intermediate results caching
when |cache| is not set
generated parser doesn't cache intermediate parse results2ms ‣
const t=peg.generate(e);expect(t.parse("ac")).to.equal(2)
when |cache| is set to |false|
generated parser doesn't cache intermediate parse results2ms ‣
const t=peg.generate(e,{cache:!1});expect(t.parse("ac")).to.equal(2)
when |cache| is set to |true|
generated parser caches intermediate parse results2ms ‣
const t=peg.generate(e,{cache:!0});expect(t.parse("ac")).to.equal(1)
tracing
when |trace| is not set
generated parser doesn't trace0ms ‣
const t=peg.generate(e),r={trace:spy()};t.parse("a",{tracer:r}),expect(r.trace.called).to.equal(!1)
when |trace| is set to |false|
generated parser doesn't trace0ms ‣
const t=peg.generate(e,{trace:!1}),r={trace:spy()};t.parse("a",{tracer:r}),expect(r.trace.called).to.equal(!1)
when |trace| is set to |true|
generated parser traces1ms ‣
const t=peg.generate(e,{trace:!0}),r={trace:spy()};t.parse("a",{tracer:r}),expect(r.trace.called).to.equal(!0)
output
when |output| is not set
returns generated parser object1ms ‣
const e=peg.generate(grammar);expect(e).to.be.an("object"),expect(e.parse("a")).to.equal("a")
when |output| is set to |"parser"|
returns generated parser object1ms ‣
const e=peg.generate(grammar,{output:"parser"});expect(e).to.be.an("object"),expect(e.parse("a")).to.equal("a")
when |output| is set to |"source"|
returns generated parser source code0ms ‣
const source=peg.generate(grammar,{output:"source"});expect(source).to.be.a("string"),expect(eval(source).parse("a")).to.equal("a")
when |output| is set to |"ast"|
returns generated parser AST1ms ‣
const e=peg.generate(grammar,{output:"ast"});expect(e).to.be.an("object"),expect(e).to.be.like(peg.parser.parse(grammar))
reserved words
throws an exception on reserved JS words used as a label
break0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
case0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
catch0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
class0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
const0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
continue1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
debugger0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
default0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
delete1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
do0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
else0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
export1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
extends0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
finally0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
for0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
function0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
if0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
import0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
in0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
instanceof0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
new0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
return0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
super0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
switch0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
this0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
throw0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
try0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
typeof0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
var0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
void1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
while0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
with0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
null0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
true0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
false0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
enum0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
implements0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
interface0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
let0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
package0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
private1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
protected0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
public0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
static0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
yield0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
await1ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
arguments0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
eval0ms ‣
expect((()=>{peg.generate(["start = "+e+":end","end = 'a'"].join("\n"),{output:"source"})})).to.throw(peg.parser.SyntaxError)
does not throw an exception on special non-reserved JS words used as a label
abstract2ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
boolean1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
byte1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
char1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
double1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
final1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
float1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
goto1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
int1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
long1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
native1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
short1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
synchronized1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
throws1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
transient1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
volatile1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
as1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
async1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
from1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
get1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
of1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
set1ms ‣
const source=peg.generate(["start = "+label+":end { return "+label+"; }","end = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
does not throw an exception on reserved JS words used as a rule name
break0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
case1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
catch1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
class1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
const1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
continue0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
debugger1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
default1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
delete1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
do1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
else0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
export1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
extends1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
finally0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
for1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
function1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
if1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
import1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
in1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
instanceof0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
new1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
return1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
super1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
switch1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
this1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
throw1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
try0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
typeof1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
var1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
void1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
while0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
with1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
null1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
true1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
false0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
enum1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
implements1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
interface1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
let1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
package1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
private1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
protected1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
public1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
static1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
yield1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
await1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
arguments1ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
eval0ms ‣
const source=peg.generate(["start = "+rule,rule+" = 'a'"].join("\n"),{output:"source"});expect(eval(source).parse("a")).to.equal("a")
generates source map
Peggy
Parser Generator for JavaScript
generated parser API
parse
parses input2ms ‣
parses input in library mode1ms ‣
throws an exception on syntax error3ms ‣
gives partial result on syntax error in library mode3ms ‣
correctly describe character class in syntax error2ms ‣
accepts custom options1ms ‣
start rule
when |startRule| is not set
starts parsing from the first allowed rule1ms ‣
when |startRule| is set to an allowed rule
starts parsing from specified rule0ms ‣
when |startRule| is set to a disallowed start rule
throws an exception0ms ‣
tracing
default tracer
traces using console.log (if console is defined)1ms ‣
custom tracers
Peggy API
has the correct VERSION0ms ‣
generate
generates a parser1ms ‣
throws an exception on syntax error2ms ‣
throws an exception on semantic error0ms ‣
throws an exception on bad startRule0ms ‣
accepts custom options0ms ‣
allowed start rules
when |allowedStartRules| is not set
generated parser can start only from the first rule1ms ‣
when |allowedStartRules| is set
generated parser can start only from specified rules1ms ‣
intermediate results caching
when |cache| is not set
generated parser doesn't cache intermediate parse results2ms ‣
when |cache| is set to |false|
generated parser doesn't cache intermediate parse results2ms ‣
when |cache| is set to |true|
generated parser caches intermediate parse results2ms ‣
tracing
when |trace| is not set
generated parser doesn't trace0ms ‣
when |trace| is set to |false|
generated parser doesn't trace0ms ‣
when |trace| is set to |true|
generated parser traces1ms ‣
output
when |output| is not set
returns generated parser object1ms ‣
when |output| is set to |"parser"|
returns generated parser object1ms ‣
when |output| is set to |"source"|
returns generated parser source code0ms ‣
when |output| is set to |"ast"|
returns generated parser AST1ms ‣
reserved words
throws an exception on reserved JS words used as a label
break0ms ‣
case0ms ‣
catch0ms ‣
class0ms ‣
const0ms ‣
continue1ms ‣
debugger0ms ‣
default0ms ‣
delete1ms ‣
do0ms ‣
else0ms ‣
export1ms ‣
extends0ms ‣
finally0ms ‣
for0ms ‣
function0ms ‣
if0ms ‣
import0ms ‣
in0ms ‣
instanceof0ms ‣
new0ms ‣
return0ms ‣
super0ms ‣
switch0ms ‣
this0ms ‣
throw0ms ‣
try0ms ‣
typeof0ms ‣
var0ms ‣
void1ms ‣
while0ms ‣
with0ms ‣
null0ms ‣
true0ms ‣
false0ms ‣
enum0ms ‣
implements0ms ‣
interface0ms ‣
let0ms ‣
package0ms ‣
private1ms ‣
protected0ms ‣
public0ms ‣
static0ms ‣
yield0ms ‣
await1ms ‣
arguments0ms ‣
eval0ms ‣
does not throw an exception on special non-reserved JS words used as a label
does not throw an exception on reserved JS words used as a rule name
break0ms ‣
case1ms ‣
catch1ms ‣
class1ms ‣
const1ms ‣
continue0ms ‣
debugger1ms ‣
default1ms ‣
delete1ms ‣
do1ms ‣
else0ms ‣
export1ms ‣
extends1ms ‣
finally0ms ‣
for1ms ‣
function1ms ‣
if1ms ‣
import1ms ‣
in1ms ‣
instanceof0ms ‣
new1ms ‣
return1ms ‣
super1ms ‣
switch1ms ‣
this1ms ‣
throw1ms ‣
try0ms ‣
typeof1ms ‣
var1ms ‣
void1ms ‣
while0ms ‣
with1ms ‣
null1ms ‣
true1ms ‣
false0ms ‣
enum1ms ‣
implements1ms ‣
interface1ms ‣
let1ms ‣
package1ms ‣
private1ms ‣
protected1ms ‣
public1ms ‣
static1ms ‣
yield1ms ‣
await1ms ‣
arguments1ms ‣
eval0ms ‣
generates source map