我正在尝试解析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 : [ trn]+ -> skip ; // skip spaces, tabs, newlines, r (Windows)
fragment D : [0-9] ;
fragment C : [a-zA-Z] ;
现在,我是一个傻瓜,我不知道我应该尝试lexer模式、频道一些if还是这里的"正常"方法。谢谢
在默认通道之外的任何通道上放置标记都会使它们隐藏在解析器的正常操作之外。
尽量不要在lexer中组合标记——最终会丢失在解析器中有用的信息。
试试这个:
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 : [ trn]+ -> skip ;
fragment DIGIT : [0-9] ;
fragment ALPHA : [a-zA-Z] ;