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 ;
Код: Выделить всё
grammar Predicate;
import Transformation;
predicate
: transformation EQUALS transformation
;
EQUALS
: '==' ;
WS
: [ \t\n\r]+ -> skip ;
Я пытался сделать это следующим образом:
Код: Выделить всё
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);
}
}
Есть ли чистые способы добиться этого? Я хотел бы сохранить грамматику отдельно.
Я рассматривал возможность повторного анализа строки преобразования внутри PredicateVisitorImpl с помощью TransformationParser, но это кажется неэффективным.
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-grammars
Мобильная версия