gpt4 book ai didi

rascal - 访问解析树中的正则表达式子树

转载 作者:行者123 更新时间:2023-12-04 02:17:20 24 4
gpt4 key购买 nike

我有以下 Rascal 模块:

module foo

import IO;
import ParseTree;
extend lang::std::Layout;

lexical CHAR = [ab];
start syntax CharList = CHAR hd (',' CHAR)+ tl ';';

我的问题是如何在解析完某些内容后到达 tl 部分的各个元素。例如:

rascal>import foo;
ok

rascal>pt = parse(#start[CharList], "a, b;");
start[CharList]: `a, b;`
Tree: appl(...
rascal>pt.top.tl;
(',' CHAR)+: `, b`
Tree: appl(regular(...

现在如何访问 , b 元素?pt.top.tl[0] 似乎不是正确的方法。

感谢您的帮助。

最佳答案

可能最简单的做法是使用 Rascal 的内置分离列表构造,如下所示:

start syntax CharList = {CHAR ","}+ chars ';';

(如果您需要单独的头部和尾部,请参阅下面 Jurgen 的回答。您也可以在那里使用相同的符号。)

这定义了 1 个或多个(因为 +)逗号分隔的 CHAR 的列表。如果您需要 0 个或更多,您可以使用 *。 Rascal 允许您遍历分隔的列表,因此您可以像这样取回字符:

rascal> chars = [c | c <- pt.top.chars ];

对于您示例中的列表,这会返回以下内容:

list[CHAR]: [appl(
prod(
lex("CHAR"),
[\char-class([range(97,98)])],
{}),
[char(97)])[
@loc=|unknown:///|(0,1,<1,0>,<1,1>)
],appl(
prod(
lex("CHAR"),
[\char-class([range(97,98)])],
{}),
[char(98)])[
@loc=|unknown:///|(3,1,<1,3>,<1,4>)
]]

如果您想更轻松地查看它们或对它们的字符串值执行某些操作,您也可以将它们转换为字符串:

rascal>charsAsStrings = ["<c>" | c <- pt.top.chars ];
list[str]: ["a","b"]

关于rascal - 访问解析树中的正则表达式子树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33124084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com