如何以编程方式(动态)创建 Raku 语法?

use*_*725 6 grammar raku


\n

假设语法 G 有两个产生式 \xe2\x80\xa6

\n
    \n
  1. S \xe2\x86\x92 \xce\xbb
  2. \n
  3. S \xe2\x86\x92 aSb
  4. \n
\n
\n

在 Raku 中,如何以编程方式(即在运行时动态地)创建这种语法?

\n

目标是让 Raku 程序在运行时创建 \xe2\x80\x94 \xe2\x80\x94 一个可以静态编写为 \xe2\x80\xa6 的 Raku 语法

\n
grammar Parser\n  {\n  token  TOP  { <S> }\n  token S { '' | 'a' <S> 'b' }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

鉴于我的问题的第一个答案,我正在尝试动态创建静态写为 \xe2\x80\xa6 的内容

\n
  grammar Parser\n    {\n    token TOP { <S> }\n    } # end grammar Parser\n
Run Code Online (Sandbox Code Playgroud)\n

我试过 \xe2\x80\xa6

\n
  constant Parser := Metamodel::GrammarHOW.new_type( name => 'Parser' ) ;\n  Parser.^add_method('TOP', my method TOP(Parser:) { <S> }) ;\n  Parser.^compose;                                                 # } \n  say Parser.HOW.^name ;\n  say Parser.^methods(:local) ;\n
Run Code Online (Sandbox Code Playgroud)\n

然而,回复是\xe2\x80\xa6

\n
Perl6::Metamodel::GrammarHOW\n(TOP)\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 而不是希望的 \xe2\x80\xa6

\n
Perl6::Metamodel::GrammarHOW\n(token TOP { <S> } BUILDALL)\n
Run Code Online (Sandbox Code Playgroud)\n

应该如何add_method调用来添加TOP 令牌(以及稍后的其他令牌,例如S token)?

\n
\n

经过更多工作,我相信我可能有一个解决方案\xe2\x80\xa6

\n
  constant Parser := Metamodel::GrammarHOW.new_type( name => 'Parser' ) ;\n  Parser.^add_method( 'TOP', my token TOP { <S> } ) ;\n  Parser.^add_method( 'S', my token S { '' | 'a' <S> 'b' } ) ;\n  Parser.^compose ;\n  say Parser.HOW.^name ;\n  say Parser.^methods( :local ) ;\n  say Parser.parse: 'aabb' ;\n
Run Code Online (Sandbox Code Playgroud)\n

输出为\xe2\x80\xa6

\n
Perl6::Metamodel::GrammarHOW\n(token TOP { <S> } token S { '' | 'a' <S> 'b' })\n\xe2\x88\xa9\xe2\x95\x9c\xc3\xb3aabb\xe2\x88\xa9\xe2\x95\x9c\xc3\xba\n S => \xe2\x88\xa9\xe2\x95\x9c\xc3\xb3aabb\xe2\x88\xa9\xe2\x95\x9c\xc3\xba\n  S => \xe2\x88\xa9\xe2\x95\x9c\xc3\xb3ab\xe2\x88\xa9\xe2\x95\x9c\xc3\xba\n   S => \xe2\x88\xa9\xe2\x95\x9c\xc3\xb3\xe2\x88\xa9\xe2\x95\x9c\xc3\xba\n
Run Code Online (Sandbox Code Playgroud)\n

我编写了一个静态版本Parser和 ,与上面显示的静态 Parser类似输出是 \xe2\x80\xa6

\n
(token TOP { <S> } token S { '' | 'a' 'a' <S> 'b' 'b' } BUILDALL)\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定我的动态创建BUILDALL的. 我不太明白,在网上搜索也没有找到太多。ParserBUILDALL

\n
\n