匹配正则表达式的有限闭合图案({x,y})

  • 本文关键字:正则表达式 antlr4
  • 更新时间 :
  • 英文 :


我正在尝试编写一种语法,该语法将与正则表达式的有限闭合图案匹配(即foo {1,3}匹配" fo"前缀之后的1至3'o的外观)

要将字符串{x,y}识别为有限闭合,它不得包含空格,例如{1,3}被识别为七个字符的序列。

我已经写了以下Lexer和Parser文件,但我不确定这是否是最好的解决方案。我正在使用词汇模式进行闭合模式,该模式在正则表达式与有效的闭合表达式匹配时被激活。

lexer grammar closure_lexer;
@header {   using System;
           using System.IO; }
@lexer::members{
              public static bool guard = true;
              public static int LBindex = 0;
}
OTHER : .;
NL : 'r'? 'n' ;
CLOSURE_FLAG :  {guard}?  {LBindex =InputStream.Index; }
                     '{' INTEGER ( ',' INTEGER? )? '}'
    { closure_lexer.guard     = false;
        // Go back to the opening brace
        InputStream.Seek(LBindex);
        Console.WriteLine("Enter Closure Mode");
        Mode(CLOSURE);
        } -> skip
 ;
 mode CLOSURE;
 LB : '{';
 RB : '}' { closure_lexer.guard = true; 
            Mode(0); Console.WriteLine("Enter       Default Mode"); };
 COMMA : ',' ;
 NUMBER : INTEGER ;

 fragment INTEGER : [1-9][0-9]*;

和解析器语法

 parser grammar closure_parser;
 @header {  using System;
        using System.IO; }
 options { tokenVocab = closure_lexer; }
 compileUnit
:     ( other {Console.WriteLine("OTHER: {0}",$other.text);} |
     closure {Console.WriteLine("CLOSURE: {0}",$closure.text);} )+
;
 other : ( OTHER | NL )+;
 closure : LB NUMBER (COMMA NUMBER?)? RB;

有更好的方法来处理这种情况吗?预先感谢

这对于这么简单的任务看起来很复杂。您可以轻松地让Lexer匹配一个构造(如果通常跳过,则最好是没有空格),而解析器则与另一个表单匹配。您甚至不需要Lexer模式。

定义您的关闭规则:

CLOSURE
    : OPEN_CURLY INTEGER (COMMA INTEGER?)? CLOSE_CURLY
;

此规则将不匹配任何包含的形式,例如空格。因此,如果您的Lexer不匹配闭合,您将获得所有单独的令牌,例如卷曲牙套和整数,最终在解析器中以进行匹配(然后您可以将它们视为不同的东西)。

nb:闭合定义是否还允许{,n}(与{n}相同)?这需要封闭规则中的额外ALT。

最后一个提示:您的其他规则可能会给您带来麻烦,因为它与任何字符匹配,甚至在其他规则之前。如果您有Whildcard规则,那么它应该是您的语法中的最后一个,将所有其他规则都不匹配的所有内容。

相关内容

  • 没有找到相关文章

最新更新