【问题标题】:ANTLR + StringTemplate -Create a JavaLike language and translate it into PLSql, C and C++ [closed]ANTLR + StringTemplate - 创建 JavaLike 语言并将其翻译成 PLSql、C 和 C++ [关闭]
【发布时间】:2013-01-08 08:10:54
【问题描述】:

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

我需要指定一种新的类似 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++或其他语言。

任何帮助将不胜感激。

【问题讨论】:

  • 对于这样的论坛来说,这是一个很大的问题。请阅读FAQ,了解您canshouldn't 提出的问题。
  • 您好,我只需要知道如何扩展答案:stackoverflow.com/questions/13817046/… 用于处理向量常量表达式和向量向量表达式,以便对它们进行不同的翻译。此外,我想知道 ANTLR+StringTemplate 是否是实现我想要做的事情的最佳方式。

标签: translation antlr grammar stringtemplate stringtemplate-4


【解决方案1】:

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

您只需几步即可获得:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多