This is a notorious problem in C++-like languages. There are possible workarounds, depending on the parser generator you are using. In the P4 compiler, which does parsing using flex and bison, we essentially never parse ">>" as a token [1], but we reconstruct it from two adjacent ">" when used within an expression. This works for any number of ">". I am not as familiar with the JavaCC generator used by Calcite to guess how it should be exactly written. The P4 compiler relies on two features of flex: lookahead [2] and parser states (introduced in this commit [3], used to change the precedence of the "<" operator based on context).
[1] https://github.com/p4lang/p4c/blob/d79e2e8bfa07c7797891d44b7d084910947bf0a7/frontends/parsers/p4/p4parser.ypp#L212 [2] https://github.com/p4lang/p4c/blob/d79e2e8bfa07c7797891d44b7d084910947bf0a7/frontends/parsers/p4/p4lexer.ll#L300 [3] https://github.com/p4lang/p4c/commit/49c4c651a2c00fb89814cae311b34ba42dbf29d9 Mihai -----Original Message----- From: Julian Hyde <jhyde.apa...@gmail.com> Sent: Thursday, October 12, 2023 8:19 AM To: dev@calcite.apache.org Subject: Re: Question about bitwise right operator The problem is that you are making the language ambiguous. To get your desired behavior you probably need the lexical analyzer less eager. That’s a hard thing to do, because you probably need to adjust its behavior based on the syntactic context - whether the parser thinks that it is parsing the name of a type. Every java parser has to solve the same problem, so you should see how they solve it. I question whether we want SQL to look like Java. This includes whether we use < and > for parameterized types, and whether we include every possible operator such as >> and &&. Julian > On Oct 12, 2023, at 02:13, Hongyu Guo <guohongyu...@gmail.com> wrote: > > Hi devs, > > I want to add some new bitwise operators to Babel parser, specifically > the left shift "<<" and the right shift ">>". > > To do this, I add `"< BITWISE_RIGHT_SHIFT: \">>\" >"` to > binaryOperatorsTokens in babel/src/main/codegen/config.fmpp and a new > SqlBinaryOperator to > core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java > , similar to what was done in CALCITE-4980[1]. > > But I have noticed this change causes an error when using SQL like > `select cast(a as map<varchar multiset, map<int, int>>)`. This is > because the SQL contains `>>` string, I want to know how to avoid this > awkward error. > Thanks. > > [1] https://issues.apache.org/jira/browse/CALCITE-4980 > > Best, > hongyu guo