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



我正在尝试编写语法,但我发现了一个问题,我不太确定如何"优雅地"解决。

问题是,我将"bro"作为一个保留的指令关键字,它后面可以跟(或不跟(一个谓词语句。IE:"bro_t"或"bro"。

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

语法:

predicate
: '_t' '<' register '>' | '_f' '<' register '>' | ;
operation
: 'bro' predicate ;
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_$.]*;

最新更新