ANTLR + StringTemplate - 创建JavaLike语言并将其转换为PLSql,C和C ++

时间:2013-01-08 08:10:55

标签: translation antlr grammar stringtemplate stringtemplate-4

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

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

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

我需要知道实现任务的最佳解决方案。我想我必须以流水线方式使用你所有的解决方案,但我不想使用试错法来解决这个问题。

我尝试了不同的(分开的)解决方案,但总结起来对我来说很难。

我的最后一个问题是将vector和constant之间的表达式与vector和vector之间的表达式分开。实际上使用plsql我有不同的功能来处理这些情况。即表达式vactor1 + 5(或5 + vector1)必须翻译为PKG_FUN.constant_sum(cursor1,5),而vector1 + vector2必须翻译为PKG_FUN.vector_sum(vector1,vector2)。此外,我可以具有产生向量的函数或表达式以及产生常量的其他函数或表达式,并且在分析表达式时必须考虑这一点(即向量a =向量1 +((5 + var2)* ln(向量2)* 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 ++或其他语言翻译它。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

通过几个步骤得到这个:

1)通过构建一个符号表来记录变量范围中声明的实体的类型

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

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

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

我们的DMS软件再造工具包确实为您提供了这样的额外支持,用于构建符号表,以及使用其属性语法评估器计算树的推断,以及编写显式转换的其他方法,可以轻松地对此类型查找进行条件化。转换从源语言中的树映射到目标语言中的树。然后,您可以对目标语言进行“更简单”的转换,并使用其他显式转换在目标语言中应用优化。这可以大大简化翻译过程。

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