【问题标题】:ANTLR V4 Java Grammar shift operatorsANTLR V4 Java 语法移位运算符
【发布时间】:2014-01-30 02:57:06
【问题描述】:

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

我有一个关于我在特定规则中看到的问题:移位运算符。这些运算符声明如下:

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

我猜他们没有像这样声明

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

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

class C<T extends I<T>>

最后的 >> 将被用作移位运算符。我对吗 ?现在我想知道的是:这个符号 '

int a = 1 < < 2;

这将是一个有效的输入?

提前致谢!

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    解析器将接受1 &lt; &lt; 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");
        }
      }
    }
    

    注意事项:

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

    【讨论】:

    • 谢谢山姆,我明白了。我正在为我的 java 语法添加泛型支持,并且遇到了移位标记 ('>>') 的问题。如果我按照上述方式拆分令牌,则可以,除了我必须拆分移位赋值运算符('>>=' 必须变为 '>' '>' '='),我不明白这一点。为什么赋值运算符会给我带来问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多