This is similar to this question for classes, except the same procedure does not seem to work for Grammars.
grammar TestGrammar {
token num { \d+ }
}
my $test-grammar = TestGrammar.new();
my $token = $test-grammar.^lookup('num');
say "3" ~~ $token;
This returns:
Type check failed in binding to parameter '<anon>'; expected TestGrammar but got Match (Match.new(:orig("3")...)
in regex num at pointer-to-token.raku line 2
in block <unit> at pointer-to-token.raku line 9
This seems to point to the fact that you need binding to a class/grammar, and not a "bare" token. However, it's not clear how to do that. Passing grammar or an instance of it as a parameter returns a different error:
Cannot look up attributes in a TestGrammar type object. Did you forget a '.new'?
Any idea of why this does not really work?
Update: using ^find_method
as indicated in this question that is referenced from the one above does not work either. Same issue. Using assuming
does not fix it either.
Update 2: I seem to be getting somewhere here:
my $token = $test-grammar.^lookup('num').assuming($test-grammar);
say "33" ~~ $token;
Does not yield any syntax error, however it returns False
no matter what.
grammar foo { token bar { . } } my $rule = 'bar'; say foo.parse(:$rule, 9); # 「9」
? – Autotrucksubparse
and notparse
, but close enough. Why don't you do it yourself so that I can accept it as an answer? Maybe you don't want because it's not exactly what I was asking (still, getting the pointer does not seem to be possible), but it would serve the same purpose. – Putsch.parse
or.subparse
. I don't have time to properly write it up tonight. The very rough version I have right now isgrammar foo { token bar { \d+ } }; my &match = { ($^grammar.^lookup: $^rule)($grammar.new: orig => $^text) }; say '42' ~~ match(foo, 'bar', $_);
. But I want something much closer to your original question and to add explanation. – Autotruck