如何使用antlr语法定义一个固定次数重复的模式规则

saf*_*oul 6 grammar antlr

我知道'+','?' 和'*'.但是,如果我想要一些东西重复,比如5次呢?例如,如果标识符必须是长度为5的十六进制数字的字符串?

更具体地说,我正在考虑定义一个无限长度的一般词法分析器规则,然后,在解析时计算它重复的时间,如果等于5,则将其重命名为另一种类型的令牌,但怎么能我这样做?还是有一些简单的方法?

Bar*_*ers 5

在解析时间时,请计算重复的次数,如果等于5,则将其重命名为另一种令牌,但是我该怎么做?还是有一些简单的方法?

是的,您可以使用歧义的语义谓词说明)来做到这一点:

grammar T;

parse
 : (short_num | long_num)+ EOF
 ;

short_num
 : {input.LT(1).getText().length() == 5}? NUM
 ;

long_num
 : {input.LT(1).getText().length() == 8}? NUM
 ;

NUM
 : '0'..'9'+
 ;

SP
 : ' ' {skip();}
 ;
Run Code Online (Sandbox Code Playgroud)

它将解析输入12345 12345678,如下所示:

在此处输入图片说明

但是您还可以根据匹配文本的某些属性在词法分析器中更改标记的类型,如下所示:

grammar T;

parse
 : (SHORT | LONG)+ EOF
 ;

NUM
 : '0'..'9'+
   {
     if(getText().length() == 5) $type = SHORT;
     if(getText().length() == 8) $type = LONG;
     // when the length is other than 5 or 8, the type of the token will stay NUM
   }
 ;

SP
 : ' ' {skip();}
 ;

fragment SHORT : ;
fragment LONG : ;
Run Code Online (Sandbox Code Playgroud)

这将导致解析相同的输入,如下所示:

在此处输入图片说明