2009-12-16 93 views
0

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

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

我需要为任意数量的等号完成它,这样就存在这个问题:我如何才能使它匹配相同数量的等号在开放的时候像关闭一样?提供的解析器规则到目前为止似乎没有任何意义,只要帮助。

+0

我敢肯定,我的规则允许你想要什么。 '技巧'在'等于'的递归定义中。 – Arne 2009-12-16 08:43:06

+0

仍然无法弄清楚最后一点点... – RCIX 2009-12-20 07:18:07

回答

2

不能easely写一个词法分析器,你需要解析的规则。两条规则应该是足够的。一个负责匹配大括号,一个匹配等号。

事情是这样的:

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 
    ; 
+0

这是如何支持少于两个等号的括号? – RCIX 2009-12-16 10:05:07

+0

请指出您的意见中未涵盖哪些案例,然后我可以告诉您规则调用的顺序。 例如[= [] =] => [equals](大括号规则2) => [=大括号=](等于规则2) => [= [] =](大括号规则1) – Arne 2009-12-16 10:21:47

+1

但是,我该如何插入'(options {greedy = false;}:。)*'在那里?我明白现在的规则是如何运作的,但我并不了解如何适应。 – RCIX 2009-12-16 11:56:14

0

您的标签提到lexing,但您的问题本身不。你想做的事情是非常规的,所以我不认为这可以作为lexing的一部分来完成(尽管我不记得ANTLR的词法分析器是否严格定期 - 这是自我上一次以来的几年使用ANTLR)。

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

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