Я новичок в antlr4, и я пытаюсь создать грамматику для анализа файлов конфигурации Fluent в дереве. Можете ли вы указать мне, что я делаю неправильно здесь?
Синтаксис fluentd очень похож на синтаксис Apache (псевдо-xml, комментарии в стиле оболочки, kv-пары в теге), например:
# Receive events from 24224/tcp
<source>
@type forward
port 24224
</source>
# example
<match>
# file or memory
buffer_type file
<copy>
file /path
</copy>
</match>
Это моя грамматика до сих пор:
grammar Fluentd;
// root element
content: (entry | comment)*;
entry: '<' name tag? '>' (entry | comment | param)* '<' '/' close_ '>';
name: NAME;
close_: NAME;
tag: TAG;
comment: '#' NL;
param: name value NL;
value: ANY;
ANY: .*?;
NL: ('\r'?'\n'|'\n') -> skip;
TAG: ('a'..'z' | 'A'..'Z' | '_' | '0'..'9'| '$' |'.' | '*' | '{' | '}')+;
NAME: ('a'..'z'| 'A..Z' | '@' | '_' | '0'..'9')+;
WS: (' '|'\t') -> skip;
... И это с треском проваливается на приведенном выше вводе:
line 2:2 mismatched input 'Receive' expecting NL
line 3:1 missing NAME at 'source'
line 4:8 mismatched input 'forward' expecting ANY
line 6:2 mismatched input 'source' expecting NAME
line 8:2 mismatched input 'example' expecting NL
line 9:1 missing NAME at 'match'
line 10:6 mismatched input 'file' expecting NL
line 12:2 mismatched input 'match' expecting NAME