Java 编译器代码翻译的形式化表示法

Java 编译器代码翻译的形式化表示法,java,compiler-construction,dsl,formal-languages,Java,Compiler Construction,Dsl,Formal Languages,我正在设计一个DSL,它可以翻译成Java源代码。它们的符号是否通常用于指定编译器的语义/翻译 例如: 数字用户线: 翻译成: Integer temp0 = 4; Integer a = temp0; Integer b = temp0; Integer c = temp0; 提前感谢, Jeroen模式匹配语言可用于将小树变换形式化。关于这种DSL的示例,请看一看。一种更通用的方法是将树变换视为术语重写的一种形式 这样的转换足够正式,例如,它们可以被认证,如。模式匹配语言可用于将小树转换正

我正在设计一个DSL,它可以翻译成Java源代码。它们的符号是否通常用于指定编译器的语义/翻译

例如:

数字用户线:

翻译成:

Integer temp0 = 4;
Integer a = temp0;
Integer b = temp0;
Integer c = temp0;
提前感谢,


Jeroen

模式匹配语言可用于将小树变换形式化。关于这种DSL的示例,请看一看。一种更通用的方法是将树变换视为术语重写的一种形式


这样的转换足够正式,例如,它们可以被认证,如。

模式匹配语言可用于将小树转换正式化。关于这种DSL的示例,请看一看。一种更通用的方法是将树变换视为术语重写的一种形式


这样的转换足够正式,例如,它们可以被认证,如。

有正式的语言来定义语义;您可以在编程语言会议记录中的几乎任何技术论文中看到此类语言和定义。关于这个主题的文本是可用的:你需要有一些意愿阅读简明的数学符号

实际上,这些语义不用于驱动翻译/编译器;这仍然是一个研究课题。要阅读这些,您通常需要花一些时间阅读上述介绍性文本

在定义翻译方面有更多的实际工作;最实用的是。 有了这些工具,人们可以使用源语言的符号(如DSL)和目标语言的符号(如Java或汇编程序等)编写转换规则 形式如下:

 replace source_language_fragment by target_language_fragment if condition
这些工具由源语言和目标语言的语法驱动,并将转换规则从可读形式解释为AST到AST重写。将复杂的DSL完全翻译成另一种语言通常需要数百条规则,但关键是它们比手写翻译器的典型过程代码更容易阅读

尝试按照OP的例子,假设有OP的MyDSL和Java语法作为目标,并使用我们的DMS软件再工程工具包的转换规则风格:

  source domain dsl;
  target domain Java;

  rule translate_single_assignment(t: dsl_IDENTIFIER, e: dsl_expression):
     " \t = \e "  -- MyDSL syntax
     ->           -- read as "rewrites to"
     " int \JavaIdentifier\(\t\)=\e;
     ".

 rule translate_multi_assignment(t1: dsl_IDENTIFIER, t2: dsl_IDENTIFIER, e: dsl_expression):
     " \t1 = \t2 = \e "  -- MyDSL syntax
     ->           -- read as "rewrites to"
     " \>\dsl \t2 = \e \statement
       int \t1;
       \t1=\t2;
     ".
您需要两条规则:一条用于简单赋值t=e的基本情况;还有一个用来处理多重赋值的情况。多重分配案例剥离了最外层的分配, 并为其生成代码,并以原始DSL形式将多个赋值的其余部分插入,由两个规则之一重新处理


您可以看到另一个用于重构源语言==目标语言的例子,在

有正式的语言来定义语义;您可以在编程语言会议记录中的几乎任何技术论文中看到此类语言和定义。关于这个主题的文本是可用的:你需要有一些意愿阅读简明的数学符号

实际上,这些语义不用于驱动翻译/编译器;这仍然是一个研究课题。要阅读这些,您通常需要花一些时间阅读上述介绍性文本

在定义翻译方面有更多的实际工作;最实用的是。 有了这些工具,人们可以使用源语言的符号(如DSL)和目标语言的符号(如Java或汇编程序等)编写转换规则 形式如下:

 replace source_language_fragment by target_language_fragment if condition
这些工具由源语言和目标语言的语法驱动,并将转换规则从可读形式解释为AST到AST重写。将复杂的DSL完全翻译成另一种语言通常需要数百条规则,但关键是它们比手写翻译器的典型过程代码更容易阅读

尝试按照OP的例子,假设有OP的MyDSL和Java语法作为目标,并使用我们的DMS软件再工程工具包的转换规则风格:

  source domain dsl;
  target domain Java;

  rule translate_single_assignment(t: dsl_IDENTIFIER, e: dsl_expression):
     " \t = \e "  -- MyDSL syntax
     ->           -- read as "rewrites to"
     " int \JavaIdentifier\(\t\)=\e;
     ".

 rule translate_multi_assignment(t1: dsl_IDENTIFIER, t2: dsl_IDENTIFIER, e: dsl_expression):
     " \t1 = \t2 = \e "  -- MyDSL syntax
     ->           -- read as "rewrites to"
     " \>\dsl \t2 = \e \statement
       int \t1;
       \t1=\t2;
     ".
您需要两条规则:一条用于简单赋值t=e的基本情况;还有一个用来处理多重赋值的情况。多重分配案例剥离了最外层的分配, 并为其生成代码,并以原始DSL形式将多个赋值的其余部分插入,由两个规则之一重新处理


您可以在

上看到重构源语言==目标语言时使用的另一个例子,我不知道是否有定义语义的正式语言,但如果您想了解这通常是如何实现的,请参阅的第6章或。我不知道是否有定义语义的正式语言,但是,如果您想了解通常是如何做到这一点的示例,请参阅的第6章或。