2

您好我正在尝试实现翻译。由于它变得越来越复杂,我将尝试更好地解释我想要实现的内容。

我需要指定一种新的类似 java 的语言。这种语言必须实现 java 方法的所有结构:变量声明、表达式、条件表达式、括号表达式等......该语言将使用向量、常量和布尔值。它具有不同的功能:log、avg、sqrt 以及 sum、diff、shift 等。这种语言必须翻译成plsql和其他语言。因此,定义的方法将成为 StoredProcedure 或 c++ 函数或其他任何东西。我还需要考虑数学约束,例如运算符的优先级(+、-、*、/、<<、>> 等等......)。

我已经得到这个提示:Decompose expression in base operation: ANTLR + StringTemplate

我需要知道完成任务的最佳解决方案。我想我必须以流水线方式使用您的所有解决方案,但我不想对解决方案使用试错法。

我尝试了不同的(分离的)解决方案,但把所有的东西放在一起对我来说很难。

我的最后一个问题是将向量和常量之间的表达式以及向量和向量之间的表达式分开。事实上,使用 plsql 我有不同的功能来处理这些情况。即表达式 vactor1+5(或 5+vector1)必须翻译为 PKG_FUN.constant_sum(cursor1, 5) 而不是 vector1+vector2 必须翻译为 PKG_FUN.vector_sum(vector1, vector2)。此外,我可以拥有产生向量的函数或表达式,以及产生常量的其他函数或表达式,这在分析表达式时必须考虑(即向量 a = vector1 +((5+var2)*ln(vector2)*2)^2)。

这种语言的一个例子可以是:

DEFINE my_new_method(date date_from, date date_to, long variable1, long variable2){
   vector result;
   vector out1;
   vector out2; 
   int max = -5+(4);    

   out1 = GET(date_from, date_to, variable1, 20);
   out2 = GET(date_from, date_to, variable2);

   if(avg(out1) > max)
   {
       result = sqrt(ln(out2) + max)*4; 
   }else
   {
       result = out1 + ln(out1) + avg(out2);
   }

       for(int i=0; i<result.length ; i++)
       {
          int num = result.get(i);
          result.set(num*5, i);
       }

       return result;

}

我应该把它翻译成 plsql、c 或 c++ 或其他语言。

任何帮助,将不胜感激。

4

1 回答 1

1

您需要的是“类型推断”。对于每个表达式,您需要知道其操作数的类型,以及每个运算符符号的结果类型。

你可以通过几个步骤得到这个:

1)通过建立一个符号表,记录你的变量范围内声明的实体的类型

2)通过遍历每个表达式,计算叶节点的类型:对于表达式,在您的语言中,至少所有常量值都是标量,并且任何标识符都有您可以在符号表中查找的类型。对于大多数语言,运算符结果的类型可以根据运算符的语言规则计算,给定其操作数类型。(某些语言需要通过约束传播来计算类型)。计算完所有这些类型后,您需要将每个树节点与其类型相关联(或者至少能够按需计算节点的类型)。

使用此计算的类型信息,您可以区分不同的运算符(例如,向量上的 +,向量第一个操作数和标量第二个等),从而选择要生成的目标语言结构。

除了为您提供树之外,ANTLR 在构建和管理符号表或计算类型信息方面不为您提供任何支持。获得树和所有类型信息后,您可以选择使用哪个字符串模板来生成代码,从而为您提供即时风格的翻译器。所以这样做只是很多汗水。(做一个即时翻译器有一个缺点:你最好在那个地方生成你想要的确切代码,因为你没有机会优化生成的结果,这可能意味着对树进行大量案例分析来选择要做什么产生)。

我们的 DMS Software Reengineering Toolkit 确实为您提供了对构建符号表的额外支持,以及使用属性语法评估器计算对树的推理,以及编写显式转换的额外方法,这些方法很容易以此类类型查找为条件。转换从源语言中的树映射到目标语言中的树。然后,您可以“更简单”地翻译到目标语言,并使用额外的显式转换在目标语言中应用优化。这可以大大简化翻译过程。

但无论如何,为一种语言(更不用说 3 种语言)构建一个完整的翻译器对于那些有经验和背景的人来说是一项艰巨的工作。您提出这个问题的事实表明您可能不了解与分析和转换代码相关的许多问题。我建议您在继续之前阅读一本好的编译器书籍(例如,Aho/Ullman/Sethi “编译器”),否则您可能会遇到类似的其他问题。

于 2013-01-08T09:27:12.730 回答