使用 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 ;
}