Java 如果编译器可以';你不能证实吗?

Java 如果编译器可以';你不能证实吗?,java,grammar,dsl,Java,Grammar,Dsl,即使编译器无法验证给定代码的正确性,在嵌入式DSL的语法中定义规则是否常见?我所说的规则是在运行时适用的规则 下面是一个例子: 我有一个函数,可以读取任意类并在其中搜索标有特定。此外,这些方法必须具有boolean返回类型。我还没有找到一种方法将注释类定义为仅对具有特定返回类型的方法有效,因此我在运行时检查它,如果该方法不返回布尔值,则会引发错误 现在我想为该工具提供的内部/嵌入式DSL指定语法。因此,基本上,带有返回类型为int的带注释方法的类是无效的 那么语法是否应该包含一条规则,禁止除布尔

即使编译器无法验证给定代码的正确性,在嵌入式DSL的语法中定义规则是否常见?我所说的规则是在运行时适用的规则

下面是一个例子:

我有一个函数,可以读取任意类并在其中搜索标有特定。此外,这些方法必须具有
boolean
返回类型。我还没有找到一种方法将注释类定义为仅对具有特定返回类型的方法有效,因此我在运行时检查它,如果该方法不返回
布尔值
,则会引发错误

现在我想为该工具提供的内部/嵌入式DSL指定语法。因此,基本上,带有返回类型为
int
的带注释方法的类是无效的

那么语法是否应该包含一条规则,禁止除
布尔值
之外的其他返回类型

关于这个主题的论文和/或文章也会有所帮助

提前谢谢

即使编译器无法验证给定代码的正确性,在嵌入式DSL的语法中定义规则是否常见?我所说的规则是在运行时适用的规则

我认为您指的是DSL中编写的代码的“编译器”——即对DSL代码求值并将其转换为其他表示形式的程序——而不是用于构建该程序的Java编译器。在这种情况下,这是一个语义学问题,不止一个方面

首先,如果DSL的编译器无法验证规则,那么根据定义,它不是语法规则。从这个意义上说,你的问题的答案是微不足道的“不”——不仅是你描述的不常见,甚至没有意义

另一方面,你似乎在描述你的语言的语义规则,而有这种规则的语言并没有任何错误或不寻常之处。大多数复杂的语言都是这样。然而,我不谈论你的具体例子,因为这在很大程度上似乎是一个意见问题,这是离题的

即使编译器无法验证给定代码的正确性,在嵌入式DSL的语法中定义规则是否常见?我所说的规则是在运行时适用的规则

我认为您指的是DSL中编写的代码的“编译器”——即对DSL代码求值并将其转换为其他表示形式的程序——而不是用于构建该程序的Java编译器。在这种情况下,这是一个语义学问题,不止一个方面

首先,如果DSL的编译器无法验证规则,那么根据定义,它不是语法规则。从这个意义上说,你的问题的答案是微不足道的“不”——不仅是你描述的不常见,甚至没有意义


另一方面,你似乎在描述你的语言的语义规则,而有这种规则的语言并没有任何错误或不寻常之处。大多数复杂的语言都是这样。但是,我不谈论您的具体示例,因为这在很大程度上似乎是一个意见问题,这在这里是离题的。

语言规范通常包含文本(具有不同程度的形式),这些文本以超出语法分析可能性的方式约束正确的程序。你不必找太远的例子;C、C++和ECMAScript标准都是完整的。
但是,如果不能在编译时验证约束,那么显然不可能在语法中包含约束。即使理论上可以在编译时检测到的约束也很难包含在正式的上下文无关语法中(例如,使用前需要声明变量,或者更一般地坚持正确的类型)。存在其他形式主义,但它们并不真正符合语法。

语言规范通常包含文本(具有不同程度的形式),这些文本以超出语法分析可能性的方式约束正确的程序。你不必找太远的例子;C、C++和ECMAScript标准都是完整的。
但是,如果不能在编译时验证约束,那么显然不可能在语法中包含约束。即使理论上可以在编译时检测到的约束也很难包含在正式的上下文无关语法中(例如,使用前需要声明变量,或者更一般地坚持正确的类型)。存在其他形式主义,但它们不是真正的语法。

内部DSL的语法?那没有道理。内部DSL是一组特定于问题的API;他们有签名,但没有语法。您是否认为要为这些定义一个独立的语法?或者您想扩展Java语法本身?据我所知,嵌入式/内部DSL也可以是主机编程语言的子集。那么,描述DSL子集的语法部分不是嵌入式/内部DSL的有效语法吗?您的“嵌入式”DSL必须遵循宿主语言的语法。不要混淆“语言”(一组有效字符串)和“语法”(这些字符串的结构描述,不一定完全接受该语言。在“添加”之前,解析该语言所使用的语法嵌入式DSL仍然使用添加的DSL解析语言。但语法不一定只接受有效的语言字符串;实际上,它必须接受超过所有有效的语言字符串,因为解析器/语法组合无法消除语义错误。这意味着在实践中,DSL引入的约束是当然超出了语法的范围。内部DSL?T的语法