匹配正则表达式的有限闭包模式({x,y})

时间:2017-02-18 18:07:01

标签: antlr4

我正在尝试编写一个与正则表达式的有限闭合模式匹配的语法(即foo {1,3}匹配1到3' o'出现在' fo&#39之后;前缀)

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

我编写了以下词法分析器和解析器文件,但我不确定这是否是最佳解决方案。我正在使用词法模式用于闭包模式,当正则表达式与有效的闭包表达式匹配时,该模式被激活。

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;

有没有更好的方法来处理这种情况? 提前致谢

1 个答案:

答案 0 :(得分:0)

对于这么简单的任务来说,这看起来相当复杂。您可以轻松地让您的词法分析器与一个构造匹配(最好是没有空格,如果您通常跳过它们)并且解析器与另一个形式匹配。你甚至不需要词法模式。

定义关闭规则:

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

此规则与任何包含例如空格。因此,如果您的词法分析器与CLOSURE不匹配,您将获得所有单个标记,例如大括号和整数,最终在您的解析器中进行匹配(然后您可以将它们视为不同的东西)。

NB:关闭定义也不允许{,n}(与{n}相同)?这需要在CLOSURE规则中增加一个alt。

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