图形 DSL 工作台使用什么方法:解析器还是投影?

What approach graphical DSL workbenches use: Parsers or projections?

据我所知,DSL 编辑器使用两种方法:

1- 基于解析器的方法 开发文本 DSL:用户指定语法,workbench 生成识别该语法的解析器。解析器构建一个抽象语法树,供代码生成器等使用。

2- 投影方法:这里没有解析器。抽象语法树由用户的手势直接编辑,投影规则指定如何呈现抽象语法树。这允许同时使用不同的符号(文本、图形、表格...)

现在,当我查看仅图形化的 DSL workbenches(例如 Microsoft 的 DSL 工具)时,我想知道他们使用什么方法以及 DSL 定义背后涉及的步骤是什么。如果它是投影方法,那么为什么它仅限于图形符号?

我的想法是两者都用。使符号图形化的投影方法,但模型以特定格式保存(例如XML)并进行解析。

谢谢。

嗯,严格来说,任何 "graphical" 编辑器都是投影的。一种语言 workbench 具有不同符号的能力,就像在 MPS 中一样,是由于该工具内置了这些符号,以及为同一模型定义多个编辑器的能力。在 MPS 的情况下,甚至可以创建新的符号作为插件(因此无需更改 MPS 本身)。

我想说的是,将模型保存到任何存储介质最终只能是文本或二进制文件。任何想要保存模型的编辑器都将序列化为这两个选项之一,甚至是 MPS。因此,既然说有一种投影方式来保存模型是没有意义的,您可以说 DSL 工具和 MPS 都具有用于保存的文本方法和投影编辑器,或者(我的首选选项)简单地说DSL 工具和 MPS 都可以生成投影编辑器。

此外,我不同意将 DSL 工具称为语言 workbench。正如您在 https://homepages.cwi.nl/~storm/publications/lwc13paper.pdf 中所读到的那样,一个程序必须满足一系列标准(在我看来,DSL 工具可以满足的条件比 DSL 工具多)才能成为一种语言 workbench。

一般来说,我会说任何 "graphical" 语言 workbench(即产生非纯文本编辑器的语言 workbench)都使用投影方法。

An important difference between source and projectional editing environment is the split between persistent storage and editing. Projectional editing systems can choose any persistence mechanism that they choose, while source systems need to have some universal storage mechanism - which is why they are almost always text files Martin Fowler

因此,如果您正在编辑的内容与其存储的格式不同,则您使用的是投影编辑器。所有 non-textual 符号(表格、符号、图形)本质上都不能完全按照它们看起来的样子存储,因此它们 必须 被投影。

示例:本网站上的 Markdown

从技术上讲(您不会那样想)使用投影编辑器的常用工具的示例可能是 MS Word,因为您不能只在记事本中快速打开 .docx 文件并更改header 的大小。您总是编辑通过投影显示给您的抽象表示。

WYSIWYG word processing systems such as Word, which appear to edit formatted text directly, are essentially structure editors for the underlying marked-up text. [wikipedia]


一个无关紧要的术语是说明性编程[Fowler],它具有so-called世界上最常见的“编程语言”Excel.