在Raku中,如何從字符串動(dòng)態(tài)創(chuàng)建代碼對(duì)象?


在Raku版本v2022.06中,我試圖動(dòng)態(tài)創(chuàng)建語(yǔ)法G,其中包含兩個(gè)結(jié)果…

  1. S→ λ
  2. S→ aSb公司

我的草稿程序是…

sub MAIN ( )
  {
  my @variableRightHandSidesMap is Array[Pair] ;
  @variableRightHandSidesMap.push: Pair.new("S", "") ;
  @variableRightHandSidesMap.push: Pair.new("S", "'a' <S> 'b'") ;

  constant Parser := Metamodel::GrammarHOW.new_type( name => 'Parser' ) ;

  my $myTopCode = my token TOP { <S> } ;
  my $mySCode = my token S { '' | 'a' <S> 'b' } ;

  Parser.^add_method( 'TOP', $myTopCode ) ;
  Parser.^add_method( 'S', $mySCode ) ;

  Parser.^compose ;
  say Parser.HOW.^name ;
  say Parser.^methods( :local ) ;
  say ?(Parser.parse: 'aabb') ;
  say ?(Parser.parse: 'aaaaabbbbb') ;
  say ?(Parser.parse: 'aabbb') ;
  say ?(Parser.parse: 'abab') ;
  } # end sub MAIN

程序輸出為…

Perl6::Metamodel::GrammarHOW
(token TOP { <S> } token S { '' | 'a' <S> 'b' })
True
True
False
False

上面顯示的草稿程序有$myTopCode$mySCode硬編碼。

然而,如何從@variableRightHandSidesMap中的字符串對(duì)動(dòng)態(tài)(以編程方式)創(chuàng)建Code對(duì)象$myTopCode$mySCode??


Update …

下面的答案讓我得出了以下草案,該草案產(chǎn)生了所希望的產(chǎn)出(如上所示)…

use MONKEY-SEE-NO-EVAL ;

sub MAIN ( )
  {
  my @variableRightHandSidesMap is Array[Pair] ;
  @variableRightHandSidesMap.push: Pair.new("S", "") ;
  @variableRightHandSidesMap.push: Pair.new("S", "'a' <S> 'b'") ;

  constant Parser := Metamodel::GrammarHOW.new_type( name => 'Parser' ) ;

  my $startVariable = @variableRightHandSidesMap[0].key ; # 'S'
  my $myTopCode = EVAL ( 'my token TOP { <' ~ $startVariable ~ '> }' ) ;
  Parser.^add_method( 'TOP', $myTopCode ) ;

  my Str $sCumulativeRightHandSide = '' ;
  loop ( my $i = 0 ; $i < @variableRightHandSidesMap.elems ; $i++ )
    {
    if ( $i > 0 )
      {
      $sCumulativeRightHandSide ~= ( ' | ' ) ;
      }
    if ( @variableRightHandSidesMap[$i].value.chars <= 0 )
      {
      $sCumulativeRightHandSide ~= ( '\'\'' ) ;
      }
    else
      {
      $sCumulativeRightHandSide ~= ( @variableRightHandSidesMap[$i].value ) ;
      } # end else
    } # end loop

  my $mySCode = EVAL ( 'my token ' ~ 'S' ~ ' { ' ~ $sCumulativeRightHandSide ~ ' }' ) ;
  Parser.^add_method( 'S', $mySCode ) ;

  Parser.^compose ;
  say Parser.HOW.^name ;
  say Parser.^methods( :local ) ;
  say ?(Parser.parse: 'aabb') ;
  say ?(Parser.parse: 'aaaaabbbbb') ;
  say ?(Parser.parse: 'aabbb') ;
  say ?(Parser.parse: 'abab') ;
  } # end sub MAIN

如有任何建議(如使上述草案更加簡(jiǎn)明的建議),將不勝感激。


? 最佳回答:

在RakuAST分支落地之前,我會(huì)說(shuō)使用EVAL。

您可以在當(dāng)前的Raku語(yǔ)法中進(jìn)行探索,以了解它當(dāng)前是如何完成的,但無(wú)法保證在RakuAST分支著陸后仍能正常工作。

RakuAST分支落地后,將有一個(gè)穩(wěn)定的API來(lái)實(shí)現(xiàn)這一點(diǎn)。

主站蜘蛛池模板: 国产裸体舞一区二区三区| 久草新视频一区二区三区| 一区二区三区杨幂在线观看| 精品视频一区二区三区| 成人精品一区二区不卡视频| 无码人妻精品一区二区三区久久| 麻豆精品人妻一区二区三区蜜桃 | 国产综合精品一区二区| 少妇无码AV无码一区| 天天爽夜夜爽人人爽一区二区| 中文字幕日韩丝袜一区| 色老头在线一区二区三区 | 一区二区在线视频免费观看| 欲色aV无码一区二区人妻 | 久久无码精品一区二区三区| 波多野结衣一区二区免费视频 | 无码国产精品一区二区免费式影视 | 天天综合色一区二区三区| 精品视频一区二区三区四区| 久久久91精品国产一区二区三区| 国产伦一区二区三区高清| 亚洲性日韩精品国产一区二区| 国产一区二区三区不卡在线看 | 久久青青草原一区二区| 波多野结衣AV一区二区三区中文| 无码人妻一区二区三区免费手机| 在线播放国产一区二区三区| 91精品一区二区三区在线观看| 色欲综合一区二区三区| 亚洲视频在线一区二区三区| 乱色熟女综合一区二区三区| 国产精品一区二区三区久久| 国产精品亚洲综合一区在线观看 | 亚洲毛片αv无线播放一区| 精品国产亚洲一区二区在线观看 | 亚洲国产精品乱码一区二区| 一区二区精品在线| 国产一区二区久久久| 老熟妇高潮一区二区三区| 欧洲亚洲综合一区二区三区| 无码毛片一区二区三区中文字幕|