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.
You're missing an argument at the end of your code:
I'm confident you can more or less tuck that argument away -- but
.assumingimmediately reifies/evaluates the argument(s) being assumed so that won't work out. Instead we need to postpone that step until the smart match call (to get ahold of the$_as it is during the smart match call).We need to change the
$tokendeclaration and call. Here are two possibilities I can think of:Stick with
$tokenChange its declaration, and turn its use with
~~into a method call:Switch to
&tokenNow there's no need for the dot in the smart match line. Even better, you can drop the sigil:
A proper answer to your question should really provide a decent answer to these three questions:
Why does one have to pass a new grammar object?
What's this
origbusiness?How could anyone have known this?
I'm not going to answer those questions, at least not adequately/tonight, and perhaps never. (I recall investigating this years ago and getting bogged down in Rakudo code.)
From memory, my working hypothesis boils down:
There's a fundamental aspect of the regex/grammar machinery wherein it presumes a match/grammar object is setup at the start (and then passed along to subrules as matching happens).
There's a difference between a method/rule declared with
myvs withhasregarding how that happens. (Presumably whatselfis bound to.)That difference means user code has to deal with this disparity in the scenario covered by your question.