例如,我试图编写语法来解析DNS区域文件。资源记录通常由换行符分隔。但是,可以使用括号在多行中分割记录。例如:
record1 part1 part2 part3 part4
或
record1 part1 ( part 2
part3
part4
)
我无法想出如何允许括号存在于记录中的任何位置。
答案 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):