用括号代替换行符的语法是什么?

时间:2014-04-21 22:52:18

标签: antlr4

例如,我试图编写语法来解析DNS区域文件。资源记录通常由换行符分隔。但是,可以使用括号在多行中分割记录。例如:

record1 part1 part2 part3 part4

record1 part1 ( part 2 part3 part4 )

我无法想出如何允许括号存在于记录中的任何位置。

1 个答案:

答案 0 :(得分:1)

这个怎么样(没有经过彻底测试)。

语法:

grammar dns;


file : (record|NL)+ EOF ;


record : recordName recordPart+ (NL|EOF)
       ;

recordName : Something;

recordPart
    :   '(' recordPartOrNewLine+ ')'
    |   Something
    ;

recordPartOrNewLine
    :   NL
    |   recordPart
    ;

Something : [a-zA-Z0-9:.]+; // adjust!
WS: [ \t]+ -> skip;
NL : ('\r'? '\n')|'\r';
Comment : ';' ~[\r\n]* -> skip;

测试用例(来自维基百科):

example.com.       1800  IN  SOA  ns1.example.com. mailbox.example.com. (
                                            100   ; Seriennummer
                                            300   ; Refresh Time
                                            100   ; Retry Time
                                            6000  ; Expire Time
                                            600   ; negative Caching Zeit
                                           )
 example.com.       1800  IN  NS ns1.example.com.

 ns1.example.com.   1800  IN  A    172.27.182.17
 ns1.example.com.   1800  IN  AAAA 2001:db8::f:a
 www.example.com.   1800  IN  A    192.168.1.2
 www.example.com.   1800  IN  AAAA 2001:db8::1:2

结果(大图here):

the parse tree