首页 > 解决方案 > Xtext:为 DSL 定义语法糖

问题描述

是否可以为 Xtext DSL 的语法糖定义某种重写规则?(例如类似于Spoofax 的处理方式)

让我用一个例子来演示一下:假设我们有一个用于布尔值和列表的虚拟表达式语言。非正式地:

  1. 布尔文字:TrueFalse
  2. 布尔否定:not <E>
  3. 条件表达式:if <E> then <E> else <E>
  4. 列出文字:[<E>, ..., <E>]
  5. 检查非空列表:<E> exists

一个示例程序将类似于

if [] exists then [not True] else [if True then False else True, [False, True]]

我可以将三种语法糖添加到这种语言中。

  1. 同义词:写empty而不是[]
  2. 默认值:自动转换if <E> then <E>if <E> then <E> else empty. 即else分支应该默认包含值empty
  3. 根据其他定义新的句法结构:例如定义<E> is absentnot (<E> exists)

这个想法是,在编写代码生成器或类型系统时,我不必担心后续步骤中的这些构造。例如,术语的类型[] is absent应该由 和 的键入规则自动键入not <E><E> exists而不必为此定义单独的键入规则。

使用 Xtext 实现这一目标的最佳方法是什么?

标签: syntaxdslxtextlanguage-designsyntactic-sugar

解决方案


推荐阅读