Я полный нуб с ANTLR, поэтому извиняюсь, если это действительно простой вопрос.
Я пытаюсь проанализировать файл со странным JSON-подобным синтаксисом.Эти файлы огромны, сотни МБ, поэтому я избегаю создания дерева разбора и просто использую грамматические действия для манипулирования данными в то, что я хочу.
Как обычно, я отправляю пробелы иНовые строки для скрытого канала.Однако есть пара случаев, когда было бы полезно, если бы я мог обнаружить, что следующий символ является одним из них, потому что он разделяет значение свойства.Вот выдержка из файла
game_speed=4
mapmode=0
dyn_title=
{
title="e_dyn_188785"
nick=nick_the_just hist=yes
base_title="k_mongolia"
is_custom=yes
is_dynamic=yes
claim=
{
title=k_bulgaria
pressed=yes
weak=yes
}
claim=
{
title=c_karvuna
pressed=yes
}
claim=
{
title=c_tyrnovo
}
claim=
{
title=c_mesembria
pressed=yes
}
}
А вот соответствующие части моей грамматики:
property: key ASSIGNMENT value { insertProp(stack[scopeLevel], $key.text, currentVal) };
key: (LOWERCASE | UPPERCASE | UNDERSCORE | DIGIT | DOT | bool)+;
value:
bool { currentVal = $bool.text === 'yes' }
| string { currentVal = $string.text.replace(/\"/gi, '') }
| number { currentVal = parseFloat($number.text, 10) }
| date { currentVal = $date.text }
| specific_value { currentVal = $specific_value.text }
| (numberArray { currentVal = toArray($numberArray.text) }| array)
| object
;
bool: 'yes' | 'no';
number: DASH? (DIGIT+ | (DIGIT+ '.' DIGIT+));
string:
'"'
( number
| bool
| specific_value
| NONALPLHA
| UNDERSCORE
| DOT
| OPEN_CURLY_BRACES
| CLOSE_CURLY_BRACES
)*
'"'
;
specific_value: (LOWERCASE | UPPERCASE | UNDERSCORE | DASH | bool)+ ;
WS: ([\t\r\n] | ' ') -> channel(HIDDEN);
NEWLINE: ( '\r'? '\n' | '\r')+ -> channel(HIDDEN);
Итак, как вы видите, входной синтаксис может иметь значения свойств, которые являются строкамино не разделены "
.И действительно, по какой-то странной причине иногда следующее свойство появляется в той же строке.Игнорирование WS и NEWLINE означает, что анализатор не распознает, что правило specific_value
завершается, поэтому он также захватывает часть следующего ключа.См. Пример вывода ниже:
{
game_speed: 4,
mapmode: 0,
dyn_title:
{
title: 'e_dyn_188785',
nick: 'nick_the_just\t\t\this',
t: true,
base_title: 'k_mongolia',
is_custom: true,
is_dynamic: true,
claim: { title: 'k_bulgaria\n\t\t\t\tpresse', d: true, weak: true },
claim2: { title: 'c_karvuna\n\t\t\t\tpresse', d: true },
claim3: { title: 'c_tyrnovo' },
claim4: { title: 'c_mesembria\n\t\t\t\tpresse', d: true
}
},
Какое подходящее решение здесь для указания того, что specific_value
не должен захватывать символы после достижения WS или NEWLINE?
Заранее спасибо!: D