Как я могу разделить правило с Lark EBNF?

Я пишу грамматику для анализа диаграмм состояний PlantUML и сомневаюсь в следующем:

Я имел:

transition: STATE arrow STATE (":" event? guard? action?)? "\n"

arrow: ("->" | "-->" | "-left->" | "-right->" | "-up->" | "-down->")

Но пришлось поменять на:

transition: STATE ("->" | "-->" | "-left->" | "-right->" | "-up->" | "-down->") STATE (":" event? GUARD? action?)? "\n"

Потому что для моего приложения мне не нужно и не заботиться о том, какой тип стрелки используется; достаточно знать, что стрелка была там, чтобы сформировать переход.

Возникает вопрос: есть ли способ разделить transition правило в других более управляемых правилах без того, чтобы тип стрелки появлялся в анализируемом дереве?

Полный файл на https://github.com/thomedes/PlantUML-Lark-EBNF . Не стесняйтесь комментировать / критиковать. Пытаюсь учиться здесь ????


person Toni Homedes i Saun    schedule 24.01.2021    source источник


Ответы (1)


После RTFM я обнаружил, что терминалы, имя которых начинается с подчеркивания, не выводятся в дерево, поэтому я изменил его на:

transition: STATE _ARROW STATE (":" event? GUARD? ACTION?)? "\n"
_ARROW: "->" | "-->" | "-left->" | "-right->" | "-up->" | "-down->"

И теперь работает нормально.

Не отмечать это как принятый ответ, потому что я уверен, что кто-то с большим опытом может дать лучший ответ.

person Toni Homedes i Saun    schedule 24.01.2021
comment
Это хороший способ сделать это. Вы можете разрешить make _arrow правилом (вместо терминала) с аналогичным эффектом. - person Erez; 10.02.2021