使用Javacc的中间表示

时间:2016-04-10 05:13:13

标签: javacc

我正在尝试为以下表达式编写中间表示:

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的更好方法是什么?**

1 个答案:

答案 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 ;
}