如何创建除树叶以外的同一棵树?

时间:2019-06-17 20:36:14

标签: parsing antlr antlr4

我正在为BGP社区创建解析器。我决定与Antlr合作,但我是一个全新的人。这是我的输入:

NO_EXPORT不要加入NTT

NO_EXPORT设置为CNN

除CNN之外,NO_EXPORT优先

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 :(得分:0)

Antlr是一个主要用于语法分析/解析某些输入(而不是解释语义)的工具。生成的分析树在语法上反映了输入数据的结构,而不是其语义。您正在尝试从输入中的不同位置收集信息,以便从语义上解释它们。

相反,当您有上面的树时,只需使用第二步。如果需要,Antlr会为您生成访问者或侦听器(use the -visitor or -listener command line options),通过它您可以轻松地遍历树以提取并收集您希望使用的任何数据结构中的所需数据。