有没有一种方法可以在转换时选择可选术语列表的头部,以便如果它存在,您将获得该元素,否则您将获得一个空字符串,或者调用该函数的结果不会返回任何内容?例如,如果您有 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
会起作用
目前我们还没有一个非常干净的解决方案,但正在使用以下 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;
这可以很容易地应用于您的示例。希望这能解决您的问题。