Я начал работать с ANTLR4, чтобы создать синтаксический анализатор для самостоятельно определенного формата файла шаблона.
Формат в основном состоит из обязательной части, называемой «#settings», и по крайней мере одной части, называемой «#region». Тело частей окружено фигурными скобками.
Я создал образец файла, а также скопировал-вставил-модифицировал файл antlr g4 для его анализа. Пока работает нормально:
Файл:
#settings
{
setting1: value1
setting2: value2
}
#region
{
[Key1]=Value1(Comment1)
[Key2]=Value2(Comment2)
}
Файл G4 для этого примера:
grammar Template;
start
: section EOF
;
section
: settings regions
;
settings
: '#settings' '{' (settingsText)* '}'
;
settingsText
: TEXT
;
regions
: (region)+
;
region
: '#region' '{' (regionText)* '}'
;
regionName
: NOSPACE
;
regionText
: TEXT
;
TEXT
: (~[\u0000-\u001F])+
;
NOSPACE
: (~[\u0000-\u0020])+
;
WS
: [ \t\n\r] + -> skip
;
Это работает, как ожидалось. Теперь я хочу усложнить формат файла и парсер и расширить заголовок #region на #region NAME (атрибуты). Итак, что я изменил в образце и в файле G4:
Образец изменен на
...
#region name (attributes, moreAttributes)
{
...
, а файл g4 изменен на
grammar Template;
start
: section EOF
;
section
: settings regions
;
settings
: '#settings' '{' (settingsText)* '}'
;
settingsText
: TEXT
;
regions
: (region)+
;
region
: '#region' regionName (regionAttributes)? '{' (regionText)* '}'
;
regionName
: NOSPACE
;
regionAttributes
: '(' regionAttribute (',' regionAttribute)* ')'
;
regionAttribute
: NOSPACE
;
regionText
: TEXT
;
TEXT
: (~[\u0000-\u001F])+
;
NOSPACE
: (~[\u0000-\u0020])+
;
WS
: [ \t\n\r] + -> skip
;
Теперь синтаксический анализатор выводит появляется следующая ошибка: Ошибка парсера (7, 1): несоответствующий ввод '#region name (attributes, moreAttributes)' ожидает '# region'
И я не понимаю, почему это ведет себя вот так. Я ожидал, что парсер не объединит всю строку при сравнении. Что я делаю не так?
Спасибо.