У меня есть следующая грамматика (я показываю только важные разделы)
packageDeclaration
: PACKAGE qualifiedIdentifier SEMI -> ^(PACKAGE qualifiedIdentifier+)
;
qualifiedIdentifier
: ( IDENT -> IDENT
)
( DOT ident=IDENT -> ^(DOT $qualifiedIdentifier $ident)
)*
;
и скажем, у меня есть декларация пакета "package a.b.c" (кстати, синтаксический анализатор Java)
Теперь я получаю что-то вроде (package (. (. a b) c))
я хочу встроить пакет, чтобы получить (пакет a.b.c)
Я бы предпочел не менять переписывание для квалифицированного идентификатора, а только для packageDeclaration.
Как я могу это сделать.
Теперь я понимаю, что вы имеете в виду под псевдонимом и +. Но мне все еще неясна разница между квалифицированным идентификатором и $qualifiedIdentifier в правиле перезаписи.
Что касается моего второго вопроса, я имею в виду, что я удалил правило перезаписи для квалифицированного идентификатора, а для пакета у меня есть следующее:
packageDeclaration
: PACKAGE ident=qualifiedIdentifier SEMI -> ^(PACKAGE $ident+)
;
В результате я получаю вложенные токены, например:
(package
(a) [end:a]
(.) [end:.]
(b) [end:b]
(.) [end:.]
(c) [end:c]
) [end:package]
Each token is represented as "(<token's text property>) [end: <token's text property>]"
Я надеюсь, что в приведенном выше выводе все ясно, но у меня есть один родительский токен (пакет) с 5 дочерними элементами. Теперь они в правильном порядке и все такое. Я хотел бы, чтобы тот же родитель имел только одного ребенка, как в:
(package
(a.b.c) [end:a.b.c]
) [end:package]