上下文相关的ANTLR4 ParseTreeVisitor实现

问题描述 投票:1回答:1

我正在一个项目中,我们将大量]](超过12000个)视图从Oracle迁移到Hadoop / Impala。我编写了一个小的Java实用程序来从Oracle提取视图DDL,并希望使用ANTLR4遍历AST并生成与Impala兼容的视图DDL语句。

大多数工作是相对简单的,仅涉及将一些Oracle特定的语法古怪改写为Impala样式。但是,我面临一个问题,即我不确定我是否有最好的答案:我们有许多特殊情况,其中日期字段中的值是在多个嵌套函数调用中提取的。例如,以下内容从“日期”字段中提取日期:

TO_NUMBER(TO_CHAR(d.R_DATE , 'DD' ))

我为Oracle SQL声明了ANTLR4语法,因此在到达TO_NUMBERTO_CHAR时也获得了访问者回调,但是我想对此特殊情况进行特殊处理。

除了为外部函数实现处理程序方法,然后采用手动遍历嵌套结构以查看方法之外,没有其他方法>

我在生成的Visitor类中有类似的东西:

    @Override
    public String visitNumber_function(PlSqlParser.Number_functionContext ctx) {

        // FIXME: seems to be dodgy code, can it be improved? 
        String functionName = ctx.name.getText();
        if (functionName.equalsIgnoreCase("TO_NUMBER")) {

            final int childCount = ctx.getChildCount();
            if (childCount == 4) {

                final int functionNameIndex = 0;
                final int openRoundBracketIndex = 1;
                final int encapsulatedValueIndex = 2;
                final int closeRoundBracketIndex = 3;

                ParseTree encapsulated = ctx.getChild(encapsulatedValueIndex);
                if (encapsulated instanceof TerminalNode) {
                    throw new IllegalStateException("TerminalNode is found at: " + encapsulatedValueIndex);
                }

                String customDateConversionOrNullOnOtherType =
                        customDateConversionFromToNumberAndNestedToChar(encapsulated);

                if (customDateConversionOrNullOnOtherType != null) {
                    // the child node contained our expected child element, so return the converted value
                    return customDateConversionOrNullOnOtherType;
                }
                // otherwise the child was something unexpected, signalled by null
                // so simply fall-back to the default handler
            }
        }

        // some other numeric function, default handling
        return super.visitNumber_function(ctx);
    }

    private String customDateConversionFromToNumberAndNestedToChar(ParseTree parseTree) {
        // ...
    }

我正在一个项目中,我们将大量(超过12000个)视图从Oracle迁移到Hadoop / Impala。我写了一个小的Java实用程序来从Oracle中提取视图DDL,并希望...

parsing antlr abstract-syntax-tree visitor visitor-pattern
1个回答
0
投票

对于遇到相同问题的任何人,解决方法似乎是:

  1. 更改语法定义并引入自定义子类型嵌套函数的封装表达式。

© www.soinside.com 2019 - 2024. All rights reserved.