Как собрать JSON с помощью рекурсивного слушателя дерева разбора ANTLR4 - PullRequest
0 голосов
/ 04 мая 2018

Я использую ANTLR4 для анализа файла структурированных данных и, похоже, попал в стену. Я знаю, что это очень конкретный вопрос, но, возможно, кто-то может направить меня в правильном направлении.

Я анализирую файлы, которые выглядят так:

MSH
[  PD1  ]
[{ ROL }]
[
  { ROL }
]
[
    {
        PR1
        [{ ROL }]
    }
]
[
    {
        IN1
        [  IN2  ]
        [{ IN3 }]
    }
]
[ ACC ]

Где:

  • 3 одинарные буквенно-цифровые цифры представляют СЕГМЕНТ
  • [SEGMENT] представляет необязательный сегмент
  • {SEGMENT} представляет повторяющийся сегмент
  • [{SEGMENT}] представляет необязательный повторяющийся сегмент
  • Любой из вышеперечисленных профилей СЕГМЕНТА может быть сгруппирован во вложении Необязательные и / или повторяющиеся группы.
  • Примерами вложенных повторяющихся групп являются строки 4–19 в приведенном выше коде.

Мой ANTLR4 Lexer / Parser работает хорошо, давая следующее дерево разбора:

Parse Tree

Конечная цель - перевести любой набор данных с использованием вышеуказанных правил в формат JSON. Пример использования нескольких строк из файла набора данных выше:

{
  "MSH": {
    "name": "placeholder",
    "opt": false,
    "rep": false,
    "description": "Plain Segment"
  },
  "PD1": {
    "name": "placeholder",
    "opt": true,
    "rep": false,
    "description": "Optional Segment"
  },
  // some segments here
  "group": {
    "opt": true,
    "rep": false,
    "description": "Optionals group placeholder text",
    "segment0": {
      "ROL": {
        "name": "placeholder",
        "opt": false,
        "rep": true,
        "description": "Repeating Segment"
      }
    }
  }
}

Я сгенерировал что-то похожее на вышеприведенный json с помощью прослушивателя ANTLR4 , реализованного здесь. Но вложенные группы, которые продолжают приводить меня в замешательство, я нахожу трудным делать со слушателем. Возможно, другой набор глаз поможет.

...