我正在为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
;
这是输出:
如您所见,第一个和第四个“ no_export”与“ dest”相同。我希望他们是同一个孩子,这个目标有两片叶子:NTT和CNN
有人可以帮助我吗?谢谢
答案 0 :(得分:0)
Antlr是一个主要用于语法分析/解析某些输入(而不是解释语义)的工具。生成的分析树在语法上反映了输入数据的结构,而不是其语义。您正在尝试从输入中的不同位置收集信息,以便从语义上解释它们。
相反,当您有上面的树时,只需使用第二步。如果需要,Antlr会为您生成访问者或侦听器(use the -visitor
or -listener
command line options),通过它您可以轻松地遍历树以提取并收集您希望使用的任何数据结构中的所需数据。