Как создать такое же дерево, кроме листьев? - PullRequest
0 голосов
/ 17 июня 2019

Я делаю парсер для BGP-сообществ.Я решил сделать это с Antlr, но я совершенно новый.Это мой ввод:

NO_EXPORT не для NTT

NO_EXPORT установлен на CNN

NO_EXPORT предварительно, кроме CNN

NO_EXPORT не на CNN

LOCAL_PREFERENCE не для NTT

LOCAL_PREFERENCE не для CNN

Это мой код:

expression
   :   action*
   ;
action   
   :   no_export+
   |   local_preference+
   |   as_padding+
   ;
no_export
   :   'NO_EXPORT' sentencenevdn+
   |   'NO_EXPORT' sentencenevs+
   |   'NO_EXPORT' sentencenevp+
   ;
local_preference
   :   ('LOCAL_PREFERENCE' sentencelp)+
   ;
as_padding
   :   ('AS_PADDING' sentenceap)+
   ;


sentencenevdn
   :   'do not' prepdest+
   ;
sentencenevs
   :   ('set' prepdest)+
   ;
sentencenevp
   :   ('prepend' prepdest)+
   ;
sentencelp
   :   (verbs prepdest)+
   ;
sentenceap
   :   (verbs prepdest)+ 
   ;

verbs
   : ('do not'|'set'|'prepend')+
   ;

prepdest
   : 'to' dest+
   | 'except' dest+
   ;

dest
   :  DESTINATION
   ;

Это вывод: a busy cat

Как вы можете видеть, первый и четвертый "no_export" одинаковы, за исключением "dest".Я хотел бы, чтобы они были одним и тем же ребенком, и у этого дест есть два листа: NTT и CNN

Кто-нибудь может мне помочь?Спасибо

1 Ответ

0 голосов
/ 19 июня 2019

Antlr - это инструмент, предназначенный главным образом для лексического / синтаксического анализа некоторого ввода (синтаксически), а не для интерпретации семантики.Результирующее дерево разбора синтаксически отражает структуру ваших входных данных, а не их семантическое значение.Однако вы пытаетесь собрать фрагменты информации из разных мест ввода, чтобы интерпретировать их семантически.

Вместо этого просто используйте второй шаг, когда у вас есть дерево выше.При желании Antlr будет генерировать посетителей или слушателей ( использовать параметры командной строки -visitor или -listener ), с помощью которых вы можете легко перемещаться по дереву для извлечения и сбора нужных данных в любой структуре данных.тебе удобно для тебя.

...