如何在条件规则重写中使用ANTLR lexer标记值

如何在条件规则重写中使用ANTLR lexer标记值,antlr,lexer,Antlr,Lexer,我是ANTLR的新手,我想做以下工作: 给出下面的语法片段,我有一个选择规则*comparison_op*,它可以匹配许多标记中的一个。我想做的是编写条件重写规则——例如,如果令牌是DOESNOTENDWITH do something,如果它是DOESNOTCONTAIN do something等等 我就是不能把这件事做好。甚至有可能做到这一点吗?当然,我可以为每个条件编写特定的规则,但这似乎也不是最好的方法 有什么建议吗 试试这个: condition_comparison : (co

我是ANTLR的新手,我想做以下工作:

给出下面的语法片段,我有一个选择规则*comparison_op*,它可以匹配许多标记中的一个。我想做的是编写条件重写规则——例如,如果令牌是DOESNOTENDWITH do something,如果它是DOESNOTCONTAIN do something等等

我就是不能把这件事做好。甚至有可能做到这一点吗?当然,我可以为每个条件编写特定的规则,但这似乎也不是最好的方法

有什么建议吗


试试这个:

condition_comparison
 : (column_name comparison_op v1=valueExpression) 
    -> {$comparison_op.start.getType() == DOESNOTBEGINWITH}? 
       ^(LIKE column_name $v1)
    -> ^(comparison_op column_name $v1)
 ;
但是,我认为这样写没有任何问题:

condition_comparison
 : column_name ( DOESNOTBEGINWITH valueExpression -> ^(LIKE column_name valueExpression)
               | DOESNOTENDWITH valueExpression   -> ^(DOESNOTENDWITH column_name valueExpression)
               | DOESNOTCONTAIN valueExpression   -> ^(DOESNOTCONTAIN column_name valueExpression)
               )
 ;
condition_comparison
 : column_name ( DOESNOTBEGINWITH valueExpression -> ^(LIKE column_name valueExpression)
               | DOESNOTENDWITH valueExpression   -> ^(DOESNOTENDWITH column_name valueExpression)
               | DOESNOTCONTAIN valueExpression   -> ^(DOESNOTCONTAIN column_name valueExpression)
               )
 ;