我需要能够匹配某个字符串('[' 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 ]==]
。
我需要为任意数量的等号做出这样做,因此存在问题所在:如何让它在开盘时匹配相同数量的等号?到目前为止,提供的解析器规则似乎没有任何帮助。
答案 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;