2016-11-10 12 views
0

Я использую рамки ANTLR4 и это фрагмент моего языка:ANTLR как получить тип маркеров с рекурсией

r 
    : RN             #RNName 
    | 'DLRRelationIntersectionOf' LPAREN r COMMA r RPAREN #RIntersection 
    | 'DLRRelationUnionOf' LPAREN r COMMA r RPAREN   #RUnion 

Как вы можете видеть, RN является терминальным узлом, так что я могу легко обрабатывать его. Но r - это нетерминальный узел, поэтому он может быть очень сложным, например DLRRelationUnionOf (RN1, DLRRelationIntersectionOf (RN2, RN3)). Моя цель - обработать узел r и рекурсивно искать RN. Проблема заключается в том, что когда-то retrive правилу г в коде, как:

DLRParser.RContext recursiveRule = ctx.r(); 

как я могу смотреть в recursiveRule выяснить RNs?

ответ

1

Во время выполнения анализатор создает дерево разбора (если включено, что является значением по умолчанию). Дерево разбора представляет собой представление дерева элементов, сопоставленных. Это дерево состоит из ParserRuleContext экземпляров, каждый из которых имеет дочерние элементы, которые представляют согласованные элементы в этом правиле в порядке совпадения. Итак, для вашего r контекста, при совпадении второго alt, вы можете найти 6 дочерних узлов (один для литерала, один для LPAREN, один для первого sub r и т. Д.). Вы можете использовать эти дочерние контексты для доступа к подстатьям. Если был сопоставлен RN, у вас есть конечный узел в первой дочерней записи.

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

  • Нет связанных вопросов^_^