ANTLR V4 Java语法移位运算符
我正在使用github上提供的ANTLR v4 Java语法 我有一个问题,关于我在一个特殊规则中看到的东西:轮班操作员。这些操作员声明如下:ANTLR V4 Java语法移位运算符,antlr,antlr4,Antlr,Antlr4,我正在使用github上提供的ANTLR v4 Java语法 我有一个问题,关于我在一个特殊规则中看到的东西:轮班操作员。这些操作员声明如下: ('<' '<' | '>' '>' '>' | '>' '>') (''>'|'>'>'>')) 我想他们并不是这样宣布的 ('<<' | '>>>' | '>>') (“>”|“>>”) 因为泛型类型声明可能发生的情况,如 class C<T exten
('<' '<' | '>' '>' '>' | '>' '>')
(''>'|'>'>'>'))
我想他们并不是这样宣布的
('<<' | '>>>' | '>>')
(“>”|“>>”)
因为泛型类型声明可能发生的情况,如
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
注意事项:
- 此实现依赖于不使用
lexer命令的语法,因为这样做会影响分配给标记的索引->skip
- 此实现不直接检查文本,因为没有为
方法实现Unicode转换getText()
@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");
}
}
}