string %token string:string [^"]+ %token string:_quote " -> default // Objects. %token brace_ { %token _brace } // Arrays. %token bracket_ \[ %token _bracket \] // Rest. %token colon : %token comma , %token number \d+ value: | | | string() | object() | array() | number() string: ::quote_:: ::_quote:: number: #object: ::brace_:: pair() ( ::comma:: pair() )* ::_brace:: #pair: string() ::colon:: value() #array: ::bracket_:: value() ( ::comma:: value() )* ::_bracket:: GRAMMAR; $_result = << #object > > #pair > > > token(string:string, foo) > > > token(true, true) > > #pair > > > token(string:string, bar) > > > #array > > > > token(null, null) > > > > token(number, 42) GRAMMAR; $this ->given( $grammar = new File\ReadWrite('hoa://Test/Vfs/Json.pp?type=file'), $grammar->writeAll($_grammar), $compiler = LUT\Llk::load($grammar) ) ->when($ast = $compiler->parse('{"foo": true, "bar": [null, 42]}')) ->then ->object($ast) ->given($dump = new LUT\Visitor\Dump()) ->when($result = $dump->visit($ast)) ->then ->string($result) ->isEqualTo($_result); } }