2015-08-24 2 views
0

мне нужна идея, как выразить заявление вроде следующего:Рекурсивный правило в ANTLR

Int<Double<Float>> 

Таким образом, в абстрактной форме, мы должны иметь:

1.(easiest case): a<b> 
2. case: a<a<b>> 
3. case: a<a<a<b>>> 
4. ....and so on... 

Дело в том, что я должен позволяют встраивать в форму < .. инструкцию типа a <b> - знаки, чтобы я имел вложенный оператор. Другими словами: я должен заменить b на a<b>. Второе: количество открытий и закрытых окон должно быть одинаковым.

Как я могу это сделать в ANTLR?

+0

Я забыл написать, что я использую новейшую версию, Antlr4 – user3097712

ответ

2

Правило может ссылаться на себя без каких-либо проблем¹. Скажем, у нас есть правило type, который описывает ваш случай, в минималистском подходе:

type: typeLiteral ('<' type '>')?; 
typeLiteral: 'Int' | 'Double' | 'Float'; 

Обратите внимание на ('<' type '>') не является обязательным, обозначается символом ?, поэтому использование только в typeLiteral является действительным type. Вот Synta деревья, порождаемые этими правилами в вашем примере Int<Double<Float>>:

Syntax tree for Int<Double<Float>>

¹: До тех пор, некоторые терминалы (например, «<» или «>») может diferentiate когда рекуррентное остановку.

Изображение генерируется http://ironcreek.net/phpsyntaxtree/

+1

И можно найти пример «реальной жизни» [в этой Java грамматике] (https: // GitHub. ком/ANTLR/грамматик-v4/блоб/ведущий/Java/Java.g4 # LC254). См. Правило classOrInterfaceType. –

+0

Спасибо вам обоим – user3097712

+0

@Mephy: Когда я тестирую решение ура, например. Int >, тогда он говорит: msgstr "ожидаемый '>'. – user3097712

Смежные вопросы