当前位置: 首页 > 知识库问答 >
问题:

如何在Perl6中实现递归语法

董和泽
2023-03-14

我正在尝试使用Perl6语法实现Markdown解析器,但被块引号卡住了。块引号段落不能用嵌套大括号表示,因为它是一个特定格式行的列表。但从语义上讲,它是一个嵌套的标记。

基本上可以归结为以下定义:

    token mdBlockquote {
        <mdBQLine>+ {
            my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
        }
    }

mdBQLine令牌的实际实现与此无关。唯一需要注意的是,mdBQLineBody键包含实际引用的带有

> # quote1
> quote2
>
> quote3
quote3.1

$引用标量将包含:

# quote1
quote2

quote3
quote3.1

现在,关键是要对上述数据进行解析,并将其注入到Match对象中。这就是我完全不知道的地方。最明显的解决方案:

    token mdBlockquote {
        <mdBQLine>+ {
            my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
            $<mdBQParsed> = self.parse( $quoted, actions => self.actions );
        }
    }

一次失败有两个原因:第一,$/是只读对象;其次,<代码>。parse有效地修改了它,使其无法向原始树中注入任何内容。

是否有任何解决方案,然后对解析后的数据进行分析,提取并重新解析块引号,重复。。。?


共有1个答案

严扬
2023-03-14

对@HåkonHægland的评论进行一点扩展。。。

是只读对象。。。有效地使其无法向原始树中注入任何内容。

不完全是:

>

但你指的是一个键的赋值。分配的语义由分配给的项决定。如果它们是不是容器的普通对象,那么它们将不支持左值语义,并且您将得到一个不能修改不可变的 错误,如果您尝试分配给他们。在这个意义上,匹配对象是不可变的。

您可以做的是使用. make方法将任意数据挂在任何Match对象上。(make例程在$/上调用此方法。)这就是您在解析树中存储自定义数据的方式。

要访问解析树的给定节点中的内容,请调用。在该节点上生成(或同义词ast)。

通常,您为解析树中的较高节点制作的包括为较低级别节点制作的内容。

请尝试以下未经测试的代码,看看您得到了什么,如果它失败得很惨,并且您无法找到使其工作的方法,请发表评论,或者根据上面的最后两段进行构建,并对其工作方式发表评论:

token mdBlockquote {
    <mdBQLine>+ {
        make .parse: [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
    }
}

 类似资料:
  • 考虑一个简单的2人游戏,如下所示:偶数枚硬币排成一行。每个玩家轮流在一行的一端移除硬币。目标是当所有硬币都被拿走时,硬币的价值最高。 玩家1找到所有偶数硬币和所有奇数硬币的总和。如果奇数硬币的总和较高,玩家1拿最左边的硬币;否则他拿最右边的。 玩家2现在有一个选择,有奇数个硬币。选择第一个硬币或最后一个硬币将导致玩家1的硬币列表略有不同。玩家2使用递归搜索的结果来确定是选择第一个还是最后一个硬币。

  • 本文向大家介绍如何在python中实现线性回归,包括了如何在python中实现线性回归的使用技巧和注意事项,需要的朋友参考一下 线性回归是基本的统计和机器学习技术之一。经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需要用到线性模型。建议先学习它,然后再尝试更复杂的方法。 本文主要介绍如何逐步在Python中实现线性回归。而至于线性回归的数学推导、

  • 假设不是将递归调用的结果与来自 convertString 的字符串拼接到 toStr,我们修改了算法,以便在进行递归调用之前将字符串入栈。此修改的算法的代码展示在 ActiveCode 1 中。 from pythonds.basic.stack import Stack rStack = Stack() def toStr(n,base): convertString =

  • 本文向大家介绍在PostgreSQL中实现递归查询的教程,包括了在PostgreSQL中实现递归查询的教程的使用技巧和注意事项,需要的朋友参考一下  介绍 在Nilenso,哥在搞一个 (开源的哦!)用来设计和发起调查的应用。 下面这个是一个调查的例子: 在内部,它是这样表示滴:   一个调查包括了许多问题(question)。一系列问题可以归到(可选)一个分类(category)中。我们实际的数

  • 这个问题和这里问的一样。 给定一个硬币列表,它们的值(c1,c2,c3,... cj,...),以及总和i。找出硬币总数为i的最小数量(我们可以根据需要使用一种类型的硬币),或者报告不可能以总和为S的方式选择硬币。 我昨天刚刚被介绍到动态编程,我试图为它编写一个代码。 这里,C[i]是货币量“i”的最优解。可用的硬币有{c1,c2,…,cj,…}对于这个程序,我增加了递归限制,以避免最大递归深度超

  • 本文向大家介绍C++ 中二分查找递归非递归实现并分析,包括了C++ 中二分查找递归非递归实现并分析的使用技巧和注意事项,需要的朋友参考一下 C++ 中二分查找递归非递归实现并分析 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,又容易写错。因为总是考虑不全边界问题。 用非递归简单分析一下,在编写过程中,如果编写的是以下的代