Как делегировать посетителей ANTLR4 в двух отдельных грамматиках?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как делегировать посетителей ANTLR4 в двух отдельных грамматиках?

Сообщение Anonymous »

Я работаю над проектом ANTLR4, в котором у меня есть две отдельные грамматики:
Transformation.g4: содержит правила для преобразования объектов в строки с помощью таких операций, как toString, строчные и прописные буквы.

Код: Выделить всё

grammar Transformation;

transformation
: toStringExpr
| lowercaseExpr
| uppercaseExpr
| nestedTransformation
;

toStringExpr
: 'toString' '(' object ')'
;
lowercaseExpr
: 'lowercase' '(' transformation ')'
;

uppercaseExpr
: 'uppercase' '(' transformation ')'
;

nestedTransformation
: '(' transformation ')'
;

object
: IDENTIFIER
;

IDENTIFIER
: [a-zA-Z_][a-zA-Z_0-9]*
;

WS
: [ \t\n\r]+ -> skip ;
Predicate.g4: содержит правила для предикатов, которые сравнивают преобразования. Например: предикат: трансформация == трансформация;.

Код: Выделить всё

grammar Predicate;

import Transformation;

predicate
: transformation EQUALS transformation
;

EQUALS
: '==' ;

WS
: [ \t\n\r]+ -> skip ;
Я хочу скомпилировать эти грамматики в Java и реализовать посетителей для обоих. PredicateVisitorImpl должен полагаться на TransformationVisitorImpl для оценки преобразований, но я хочу сохранить грамматики отдельно.
Я пытался сделать это следующим образом:

Код: Выделить всё

public class PredicateVisitorImpl extends PredicateBaseVisitor {
private final TransformationVisitor transformationVisitor = new TransformationVisitor();

@Override
public Boolean visitTransformationComparison(PredicateParser.TransformationComparisonContext ctx) {
String left = transformationVisitor.visit(ctx.transformation(0));
String right = transformationVisitor.visit(ctx.transformation(1));

return left.equals(right);
}
}
Однако оба вызова TransformVisitor.visit возвращают значение NULL, поскольку ctx.transformation относится к контексту Predicate, а не к Transformation
Есть ли чистые способы добиться этого? Я хотел бы сохранить грамматику отдельно.
Я рассматривал возможность повторного анализа строки преобразования внутри PredicateVisitorImpl с помощью TransformationParser, но это кажется неэффективным.


Подробнее здесь: https://stackoverflow.com/questions/790 ... e-grammars
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»