是否可以解析字符串,好像在Raku中被<<和>>包围一样?

时间:2019-11-21 19:11:53

标签: raku

我想在字符串上重用<< ... >>的解析逻辑以返回列表。说,我已经将字符串包含在变量$input中,如何在不使用EVAL(例如EVAL "<< $input >>")的情况下解析它?

一个更普遍的问题可能是:如何重用各种引用结构(例如qqww:v:!c)使用的任何解析逻辑?

1 个答案:

答案 0 :(得分:5)

对于您的特定示例,您可以使用val

my $a = 42;
say << $a b c       >>.perl;       # (IntStr.new(42, "42"), "b", "c")
say ("$a", "b", "c")>>.&val.perl;  # same
say << "$a b" c     >>.perl;       # ("42 b", "c")
say ("$a b", "c"   )>>.&val.perl;  # same

但是您必须了解val

  

我想在字符串上重用<< ... >>的解析逻辑以返回列表。

您可以拼写Rakudo编译器的源代码以放大正在调用的函数。因此,您可能会发现val是与您的示例相关的功能。

语言结构的解析从Grammar.nqp开始。

<<的页内搜索会产生很多匹配项。我碰巧知道<< ... >>构造是一个“ circumfix”运算符。所以几秒钟后,我来到了the line in Grammar.nqp where its parsing starts。重新格式化为几行,行可以归结为

token circumfix:sym«<< >>» {

  :dba('shell-quote words')

  '<<' ~ '>>'

  <nibble(
    self.quote_lang(
      self.slang_grammar('Quote'),
      "<<", ">>", ['qq', 'ww', 'v']
    )
  )>

}

然后,这条小径立即变冷。在同一个源文件中有一个quote_lang方法,但是它显然太高了。 slang_grammar在哪里定义?

如果遇到这样的死胡同,下一个要看的地方是NQP。确实可以找到matches there

但是现在呢?真的,这太复杂了。

  

一个更普遍的问题可能是:如何重用各种引用结构(例如qqww:v:!c)使用的任何解析逻辑?

确实。

阅读文档是另一种方法,通常比窃取源代码更好。但是在这种情况下,我找不到从qq:ww:vval的明显路径。

这会导致第三条路线-发表SO问题。 :)


此答案是...不完整。但无论如何,我将按原样发布它,以期对它有所帮助,并且/或者我今晚或明天将有时间对其进行改进。或者,更好的是,也许有人有更好的答案。