【问题标题】:ANTLR4 parsing RegExANTLR4 解析正则表达式
【发布时间】:2015-12-09 11:17:48
【问题描述】:

我正在尝试解析 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 或这里的“正常”方法是什么? 谢谢!

【问题讨论】:

    标签: regex parsing antlr4


    【解决方案1】:

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

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

    试试这个:

    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] ;
    

    【讨论】:

    • 工作并产生更清晰的结果:-D 非常感谢。我会试着在不破坏它的情况下稍微调整一下:-)
    • 您能否指向详细手册中解释 min=、max= 表示法的页面,因为它没有出现在解析树中?
    • 在 TDAR 中,查找标签。
    • 本例中 Star 是如何使用的?
    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2012-07-08
    • 2010-10-23
    相关资源
    最近更新 更多