繁体   English   中英

ANTLR4解析RegEx

[英]ANTLR4 parsing RegEx

我正在尝试解析RegEx,尤其是以下内容:

[A-Z0-9]{1,20}

问题是,由于Char和Int令牌都识别出数字,我不知道如何使以下语法起作用。

grammar RegEx;            

regEx : (character count? )+ ;

character : Char 
          | range ;

range  : '[' (rangeChar|rangeX)+ ']' ;
rangeX : rangeStart '-' rangeEnd ;
rangeChar : Char ;
rangeStart : Char ;
rangeEnd : Char ;

count : '{' (countExact | (countMin ',' countMax) ) '}' ;
countMin : D+ ;
countMax : Int ;
countExact : Int ;

channels {
  COUNT_CHANNEL,
  RANGE_CHANNEL
}

Char : D | C ; 
Int : D+ -> channel(COUNT_CHANNEL) ;

Semicolon : ';' ;
Comma : ',' ;
Asterisk : '*' ;
Plus : '+' ; 
Dot : '.' ;  
Dash : '-' ;
//CourlyBracketL : '{' ;
//CourlyBracketR : '}' ;

WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines, \r (Windows)

fragment D : [0-9] ;
fragment C : [a-zA-Z] ;

现在,我是一个菜鸟,如果我尝试使用词法分析器模式,引导一些if或这里的“正常”方法是什么,我就会迷路了。 谢谢!

将令牌放在默认通道以外的任何其他通道上会将其从解析器的常规操作中隐藏起来。

尽量不要在词法分析器中组合标记-结束丢失可能在解析器中有用的信息。

尝试这个:

grammar RegEx;

regEx   : ( value count? )+ ;

value   : alphNum | range ;
range   : LBrack set+ RBrack ;
set     : b=alphNum ( Dash e=alphNum)? ;

count   : LBrace min=num ( Comma max=num )? RBrace ;

alphNum : Char | Int ;
num     : Int+   ;

Char    : ALPHA  ;
Int     : DIGIT  ;

Semi    : ';' ;
Comma   : ',' ;
Star    : '*' ;
Plus    : '+' ;
Dot     : '.' ;
Dash    : '-' ;
LBrace  : '{' ;
RBrace  : '}' ;
LBrack  : '[' ;
RBrack  : ']' ;

WS : [ \t\r\n]+ -> skip ;

fragment DIGIT : [0-9] ;
fragment ALPHA : [a-zA-Z] ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM