使用 Javacc 的中间表示
Intermediate Representations using Javacc
我正在尝试为以下表达式编写中间表示:
a= 1+2-3*5/6
a= 1+2-3
a= 5/6+3
我是 JavaCC
的新手,但我有使用 JJTree
生成 AST
的基本知识。我没有为 IR
单独制作 class,也没有用 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)
我的问题是:
如何消除上述问题?
如果我在语法 file/class 中执行 IR
的方式不合适,那么 在 JavaCC
中执行 IR
的更好方法是什么[= =49=]?**
我会做的是使用字符串缓冲区、输出流或可变列表来累积四元组和 return 表示每个非终结符值的值或中间值作为结果。
例如,例如
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 ;
}
我正在尝试为以下表达式编写中间表示:
a= 1+2-3*5/6
a= 1+2-3
a= 5/6+3
我是 JavaCC
的新手,但我有使用 JJTree
生成 AST
的基本知识。我没有为 IR
单独制作 class,也没有用 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)
我的问题是:
如何消除上述问题?
如果我在语法 file/class 中执行 IR
的方式不合适,那么 在 JavaCC
中执行 IR
的更好方法是什么[= =49=]?**
我会做的是使用字符串缓冲区、输出流或可变列表来累积四元组和 return 表示每个非终结符值的值或中间值作为结果。
例如,例如
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 ;
}