如何在语法的不同部分控制布局?

时间:2016-10-06 00:29:15

标签: rascal

我正在看教程中的Exp示例。

是否可以有条件地控制布局?例如,考虑Python表达式:

  • 在括号内的表达式
  • 中,换行符无关紧要
  • 否则,换行符是语句/表达式终止符

例如:  (1 + \ n 3)

是一个有效的表达式,但是  1 + \ n 3

不是。

如果没有,那么实现相同结果的最简单方法是什么,而不是通过我的语法添加换行符?

1 个答案:

答案 0 :(得分:0)

是的,有可能:

  • 如果您在两个正常符号layoutL之间的syntax规则中使用A非终端B,请执行以下操作:syntax NY =“ foo“ALB”bar“,然后Rascal不会在AL之间或LB之间添加更多布局非终端
  • 您可以在语法中添加布局非终端,这些终端不会一直自动插入(在第一点使用),如下所示:layout NoNewLineLayout = @manual [\t\ ]*;

因此,这需要在语法中喷洒NoNewLineLayout符号的实例,而不是洒新线。我通常使用像NNL这样的简短名称来减少干扰。我们使用此解决方法来试验Javascript语法和其他布局敏感语言。一般来说,虽然它并不完美,我们一直在使用更优雅的解决方案,但请参阅http://dl.acm.org/citation.cfm?id=2814242进行预览。

第二种不太灵活的解决方案是使用layout定义的范围(模块作用域)。当前模块中的布局定义优先于任何导入的布局定义。以这种方式,可以影响在哪个规则中编织非终端的布局。当将语言嵌入到可能具有不同注释约定等的其他语言时,这通常非常有用;对于当前的用例,我不建议。