我正在尝试为以下表达式编写中间表示:
a= 1+2-3*5/6
a= 1+2-3
a= 5/6+3
我是JavaCC
的新手,但我掌握了使用AST
生成JJTree
的基本知识。我还没有为IR
创建一个单独的课程,或者使用JJTree
实现了它。我编写了语法并尝试在其中实现IR
。
代码是:
// E -> T (addop T)*
// T -> F (mulop F)*
// F -> intlit | "(" E ")"
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
TOKEN :
{
< ADDOP :
"+"
| "-" >
| < MULOP :
"*"
| "/" >
| < INTLIT : ([ "0"-"9" ])+ >
}
String S() :
{
String s;
}
{
s = E()
{
return "a=" + s;
}
}
String E() :
{
String left, right;
Token op;
}
{
left = T()
(
op = < ADDOP > right = T()
{
left = ("t" + count++) + ": " + left + op.image + right + "\t";
}
)*
{
return left;
}
}
String T() :
{
String left, right;
Token op;
}
{
left = F()
(
op = < MULOP > right = F()
{
left = ("t" + count++) + ": " + left + op.image + right;
}
)*
{
return left;
}
}
String F() :
{
String s;
Token t;
}
{
t = < INTLIT >
{
return t.image;
}
}
我的代码适用于1+2*3;
或1-2/4;
之类的表达式,其中特定运算符不会在表达式中重复。
对于+ -
或* /
中有一个重复或+ -
或/ *
的表达式,它会给出一个混乱的输出,两者都包含在表达式中。例如1+2-4
(+ - 包括两者),1-2-3
(减去重复)等等。 (参阅附件picture for output)
我的问题是:
如何消除上述问题?
如果我在Grammar文件/类中执行IR
的方式不合适,那么在IR
中执行JavaCC
的更好方法是什么?**
答案 0 :(得分:1)
我要做的是使用字符串缓冲区,输出流或可变列表来累积四元组,并返回表示每个非终结符的值的值或中间值。
例如,
String E(StringBuffer buf) :
{
String left, right;
Token op;
}
{
left = T(buf)
(
op = < ADDOP > right = T(buf)
{
left = buildQuad( buf, left, op.image, right ) ;
}
)*
{
return left;
}
}
其中buildQuad定义为
String buildQuad( StringBuffer buf, String left, String op, String right )
{
String register = "t" + count++
buf.append( register + ": " + left + op + right + "\t" );
return register ;
}