ANTLR V4 Java语法移位运算符

ANTLR V4 Java语法移位运算符,antlr,antlr4,Antlr,Antlr4,我正在使用github上提供的ANTLR v4 Java语法 我有一个问题,关于我在一个特殊规则中看到的东西:轮班操作员。这些操作员声明如下: ('<' '<' | '>' '>' '>' | '>' '>') (''>'|'>'>'>')) 我想他们并不是这样宣布的 ('<<' | '>>>' | '>>') (“>”|“>>”) 因为泛型类型声明可能发生的情况,如 class C<T exten

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

我有一个问题,关于我在一个特殊规则中看到的东西:轮班操作员。这些操作员声明如下:

('<' '<' | '>' '>' '>' | '>' '>')
(''>'|'>'>'>'))
我想他们并不是这样宣布的

('<<' | '>>>' | '>>')
(“>”|“>>”)
因为泛型类型声明可能发生的情况,如

class C<T extends I<T>>
C类

最后一个>>将作为一个移位运算符来执行。我说得对吗?现在我想知道的是:这个符号“解析器会接受
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");
    }
  }
}
@覆盖
公共无效输入Shift-Operator(Shift-Operator上下文ctx){
对于(int i=1;i
注意事项:

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

谢谢你,山姆,我明白了。我正在为我的java语法添加泛型支持,并且在使用shift标记(“>>”)时遇到问题。如果我像上面所描述的那样分割令牌,它是可以的,除了我还必须分割移位赋值操作符('>>='必须变成'>'>'='),我不明白这一点。为什么作业操作员给我出了问题?
@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");
    }
  }
}