ANTLR V4 Java语法移位运算符

时间:2014-01-29 13:23:24

标签: antlr antlr4

我正在使用github上提供的ANTLR v4 Java语法。

我对我在特定规则中看到的内容有疑问:转移运算符。这些运算符声明如下:

('<' '<' | '>' '>' '>' | '>' '>')

我猜他们没有被宣布为

('<<' | '>>>' | '>>')

因为泛型类型声明可能会发生什么,如

class C<T extends I<T>>

最终的&gt;&gt;将被作为一个转变运营商。我对吗 ?现在我想知道的是:这个符号'&lt;' '&LT;'允许空格出现在两个“小于”的标志之间?

int a = 1 < < 2;

这是一个有效的输入?

提前致谢!

1 个答案:

答案 0 :(得分:0)

解析器将接受1 < < 2作为表达式,但是在生成解析树之后执行的侦听器将检查解析树中的移位运算符的每个实例,以确保该节点实际上是正确的结果源代码中使用的运算符。

@Override
public void enterShiftOperator(ShiftOperatorContext ctx) {
  for (int i = 1; i < ctx.getChildCount(); i++) {
    if (ctx.getChild(i).getTokenIndex() != ctx.getChild(i - 1).getTokenIndex() + 1) {
      throw new UnsupportedOperationException("TODO: report error about incorrect operator in the source code");
    }
  }
}

备注:

  • 此实现依赖于不使用-> skip lexer命令的语法,因为这样做会影响分配给标记的索引。
  • 此实现不会直接检查文本,因为JavaUnicodeInputStream没有为getText()方法实现Unicode转换。