使用 ADT 进行转换时,如何选择可选排序列表中的第一个元素?

问题描述 投票:0回答:1

有没有一种方法可以在转换时选择可选术语列表的头部,以便如果它存在,您将获得该元素,否则您将获得一个空字符串,或者调用该函数的结果不会返回任何内容?例如,如果您有 ADT:

data TakeAction = set(list[OptVal] opt, str expandedId, NumVal numVal)

对应语法:

syntax TakeAction = set: SET OptVal? EXPANDEDID NumVal

你尝试编写一个像这样的函数:

public str prettyTakeAction(TakeAction::set(list[OptVal] opt, str expandedId, NumVal numVal)) = "SET <prettyOptVal(opt)><expandedId> = <prettyNumVal(numVal)>";

哪里

public str prettyOptVal(OptVal::optVal()) = "OPTIONAL"

当我尝试这个时,如果我省略

OPTIONAL
,我会收到错误,例如

SET a = 8
会抛出错误,而
SET OPTIONAL a = 3
会起作用

transformation rascal
1个回答
0
投票

目前我们还没有一个非常干净的解决方案,但正在使用以下 hack。

这个想法是(错了?)使用枚举运算符(

<-
),当选项存在时它将成功,否则它将失败。以下测试说明了这一点:

syntax OptTestGrammar = A? a B b;

syntax A = "a";
syntax B = "b";

layout L = " "*;

test bool optionalNotPresentIsFalse() = !((A)`a` <- ([OptTestGrammar] "b").a);
test bool optionalPresentIsTrue() = (A)`a` <- ([OptTestGrammar] "ab").a;

这可以很容易地应用于您的示例。希望这能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.