Antlr4指令关键字和最长语句匹配

Antlr4指令关键字和最长语句匹配,antlr,antlr4,lexer,Antlr,Antlr4,Lexer,我正试图写语法,但我发现了一个问题,我不太确定如何“优雅地”解决 问题是我将'bro'作为保留指令关键字,它后面可以(或不可以)跟一个谓词语句。例如:“兄弟”或“兄弟” 现在的问题是,当前“bro_t”与ID的定义匹配,而“bro”本身就是一个标记,而且“bro_t”显然比“bro”长,因此解析器将该语句与ID匹配,解析失败。我提出的解决方案是同时保留“bro_t”和“bro_f”,但对于整个指令集来说,这将相对耗时。我正在研究的另一个解决方案是通配符运算符,但我不知道它们是否适用于这里,如果适

我正试图写语法,但我发现了一个问题,我不太确定如何“优雅地”解决

问题是我将'bro'作为保留指令关键字,它后面可以(或不可以)跟一个谓词语句。例如:“兄弟”或“兄弟”

现在的问题是,当前“bro_t”与ID的定义匹配,而“bro”本身就是一个标记,而且“bro_t”显然比“bro”长,因此解析器将该语句与ID匹配,解析失败。我提出的解决方案是同时保留“bro_t”和“bro_f”,但对于整个指令集来说,这将相对耗时。我正在研究的另一个解决方案是通配符运算符,但我不知道它们是否适用于这里,如果适用,如何应用它们

语法:

predicate
        : '_t' '<' register '>' | '_f' '<' register '>' | ;

operation
    : 'bro' predicate ;

ID: ('a' .. 'z' | 'A' .. 'Z' | '_') ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' | '.')* ;

谓词
:“|t”“|”“|f”“|”;
活动
:'bro'谓词;
ID:('a'..'z'|'a'..'z'|'|')('a'..'z'|'a'..'z'|'0'..'9'|'|'$'|')*;
为什么不:

operation
 : BRO '<' register '>'
 ;

BRO : 'bro' ( '_' [a-z]+ )?
ID  : [a-zA-Z_] [a-zA-Z0-9_$.]*;
操作
:兄弟“
;
兄弟:'兄弟'('.'[a-z]+)?
ID:[a-zA-Z][a-zA-Z0-9.]*;
为什么不:

operation
 : BRO '<' register '>'
 ;

BRO : 'bro' ( '_' [a-z]+ )?
ID  : [a-zA-Z_] [a-zA-Z0-9_$.]*;
操作
:兄弟“
;
兄弟:'兄弟'('.'[a-z]+)?
ID:[a-zA-Z][a-zA-Z0-9.]*;
?