Мне нужна помощь с ANTLR. У меня есть следующее правило:Правило ANTLR с несколькими элементами
datasource
@init{boolean joinexpr = false;}
:
(s1=datasourceelement (joinclause1=joinclause joinelement1=datasourceelement onclause1=onclause (multijoinexpression)* {joinexpr=true;})?)
-> {joinexpr}? ^(JOINEXPRESSION
^(LEFTEXPR $s1?)
$joinclause1?
^(RIGHTEXPR $joinelement1?) $onclause1? multijoinexpression*
)
-> $s1
;
multijoinexpression
:
joinclause datasourceelement onclause
->
^(MULTIJOINEXPRESSION
joinclause
^(RIGHTEXPR datasourceelement) onclause
)
;
Что для разбора из присоединиться выражения: Он съедает
(таблица/запрос) (присоединиться (таблица/запрос) (поле = поле)) *
, но мне нужно обрабатывать "()" вокруг каждого соединения, поэтому он может разобрать что-то вроде этого:
(((table1 JOIN table2 ON field1 = field2) РЕГИСТРИРУЙТЕСЬ Таблица3 ON field2 = field3) РЕГИСТРИРУЙТЕСЬ ...)
без скобок он работает нормально, но я не могу понять, как добавить левый и правый кронштейн к правилу, из-за multijoineexpression *