我正在看教程中的Exp示例。
是否可以有条件地控制布局?例如,考虑Python表达式:
例如: (1 + \ n 3)
是一个有效的表达式,但是 1 + \ n 3
不是。
如果没有,那么实现相同结果的最简单方法是什么,而不是通过我的语法添加换行符?
答案 0 :(得分:0)
是的,有可能:
layout
和L
之间的syntax
规则中使用A
非终端B
,请执行以下操作:syntax NY =“ foo“ALB”bar“,然后Rascal不会在A
和L
之间或L
和B
之间添加更多布局非终端layout NoNewLineLayout = @manual [\t\ ]*;
因此,这需要在语法中喷洒NoNewLineLayout符号的实例,而不是洒新线。我通常使用像NNL这样的简短名称来减少干扰。我们使用此解决方法来试验Javascript语法和其他布局敏感语言。一般来说,虽然它并不完美,我们一直在使用更优雅的解决方案,但请参阅http://dl.acm.org/citation.cfm?id=2814242进行预览。
第二种不太灵活的解决方案是使用layout
定义的范围(模块作用域)。当前模块中的布局定义优先于任何导入的布局定义。以这种方式,可以影响在哪个规则中编织非终端的布局。当将语言嵌入到可能具有不同注释约定等的其他语言时,这通常非常有用;对于当前的用例,我不建议。