ANTLR解析问题

时间:2009-12-16 06:46:16

标签: comments antlr

我需要能够匹配某个字符串('[' then any number of equals signs or none then '['),然后我需要在匹配其他匹配规则后匹配匹配的右括号(']' then the same number of equals signs then ']')。 ((options{greedy=false;}:.)*如果你必须知道)。我不知道如何在ANTLR中做到这一点,我该怎么做?

示例:我需要匹配[===[whatever arbitrary text ]===]而不是[===[whatever arbitrary text ]==]

我需要为任意数量的等号做出这样做,因此存在问题所在:如何让它在开盘时匹配相同数量的等号?到目前为止,提供的解析器规则似乎没有任何帮助。

2 个答案:

答案 0 :(得分:2)

你不能轻松地为它编写词法分析器,你需要解析规则。两条规则就足够了。一个负责匹配大括号,一个用于匹配等号。

这样的事情:

braces : '[' ']'
       | '[' equals ']'
       ;

equals : '=' equals '='
       | '=' braces '='
       ;

这应该涵盖您描述的用例。不是绝对的纯粹,但也许你必须在'等于'的第一个规则中使用谓词来避免含糊不清的解释。

修改

很难整合你的贪婪规则,同时避免词法分析器上下文切换或类似的东西(在ANTLR中很难)。但是如果你愿意在你的语法中集成一点java,你就可以写一个词法分析器。

以下示例语法显示了如何:

grammar TestLexer;

SPECIAL :   '[' { int counter = 0; } ('=' { counter++; } )+ '[' (options{greedy=false;}:.)* ']' ('=' { counter--; } )+ { if(counter != 0) throw new RecognitionException(input); } ']';

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

rule    :   ID
    |   SPECIAL
    ;

答案 1 :(得分:0)

你的标签提到lexing,但你的问题本身没有。你要做的事情是非常规的,所以我不认为它可以作为lexing的一部分完成(虽然我不记得ANTLR的词法分析器是否严格规范 - 自从我持续了几年使用ANTLR)。

但是,在解析时,您所描述的内容应该是可行的。这是你所描述的语法:

thingy : LBRACKET middle RBRACKET;
middle : EQUAL middle EQUAL
       | LBRACKET RBRACKET;