【发布时间】: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++或其他语言。
任何帮助将不胜感激。
【问题讨论】:
-
您好,我只需要知道如何扩展答案:stackoverflow.com/questions/13817046/… 用于处理向量常量表达式和向量向量表达式,以便对它们进行不同的翻译。此外,我想知道 ANTLR+StringTemplate 是否是实现我想要做的事情的最佳方式。
标签: translation antlr grammar stringtemplate stringtemplate-4