假设语法 G 有两个产生式 \xe2\x80\xa6
\n在 Raku 中,如何以编程方式(即在运行时动态地)创建这种语法?
\n目标是让 Raku 程序在运行时创建 \xe2\x80\x94 \xe2\x80\x94 一个可以静态编写为 \xe2\x80\xa6 的 Raku 语法
\ngrammar Parser\n {\n token TOP { <S> }\n token S { '' | 'a' <S> 'b' }\n }\nRun Code Online (Sandbox Code Playgroud)\n鉴于我的问题的第一个答案,我正在尝试动态创建静态写为 \xe2\x80\xa6 的内容
\n grammar Parser\n {\n token TOP { <S> }\n } # end grammar Parser\nRun 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) ;\nRun Code Online (Sandbox Code Playgroud)\n然而,回复是\xe2\x80\xa6
\nPerl6::Metamodel::GrammarHOW\n(TOP)\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 而不是希望的 \xe2\x80\xa6
\nPerl6::Metamodel::GrammarHOW\n(token TOP { <S> } BUILDALL)\nRun Code Online (Sandbox Code Playgroud)\n应该如何add_method调用来添加TOP 令牌(以及稍后的其他令牌,例如S token)?
经过更多工作,我相信我可能有一个解决方案\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' ;\nRun Code Online (Sandbox Code Playgroud)\n输出为\xe2\x80\xa6
\nPerl6::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\nRun Code Online (Sandbox Code Playgroud)\n我编写了一个静态版本Parser和 ,与上面显示的静态 Parser类似输出是 \xe2\x80\xa6
(token TOP { <S> } token S { '' | 'a' 'a' <S> 'b' 'b' } BUILDALL)\nRun Code Online (Sandbox Code Playgroud)\n我不确定我的动态创建BUILDALL的. 我不太明白,在网上搜索也没有找到太多。ParserBUILDALL
当然,使用元模型。就像每种基本类型都有 HOW(高阶工作)一样,语法也有GrammarHOW。不幸的是,关于元模型的信息并不多。Masak 的这篇文章提到了 GrammarHOW,就是这样。然而,看代码,它本质上是一个类;如果您查看示例classHOW,并将方法作为标记,将类作为语法,您可能会觉得没问题。
一般来说,元编程是一个迄今为止尚未被广泛讨论的主题。遗憾的是。