使用ANTLR4检查嵌套函数中数组的最大出现次数

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

我有以下语法文件用于解析嵌套函数。Grammer:

grammar FunctionTokenizer;

parse     : function* EOF;
function  : ID '(' expr_list? ')';
expr_list : expr (',' expr)*;
expr      : function | STRING | NUMBER | ID;

STRING    : '"' ~'"'* '"';
NUMBER    : [0-9]+ ('.' [0-9]+)?;
ID        : [a-zA-Z_] [a-zA-Z_0-9]*;
SPACES    : [ \t\r\n]+ -> skip;

输入失败,因为它有方括号。我将词法分析器的正则表达式更改为:

ID        : [a-zA-Z_] [a-zA-Z_0-9\\[\\]]*;

但是它给出了错误。

input:

split(mul(add(input["data"][0]["name"][]["node"],input["data"][0]),input["data"][0]["name"][]["node"][]),",")

对于上述输入,我正在检查哪个参数的方括号中的最大括号为[](empty) or [0-9]方括号,而数字忽略了具有单引号和双引号的方括号,例如["1234"]['data']

对于上述输入,最大数组为:3,因为参数input["data"][0]["name"][]["node"][]具有最大数组。

因此,我正在尝试实现访客模式实现,但是表达式列表未达到visitExpr_list方法。

以下是该项目的GitHub链接:

https://github.com/VIKRAMAS/CheckMaxArrayInNestedFunction/tree/master

VisitorImplementation类:

public class FunctionValidateVisitorImpl  extends FunctionTokenizerBaseVisitor<String>  {


    @Override
    public String visitParse(FunctionTokenizerParser.ParseContext ctx) {

        System.out.println("visitParse======================================");
        return "true";

    }


    @Override
    public String visitFunction(FunctionTokenizerParser.FunctionContext ctx) {
            ParseTree name = ctx.getChild(0);
            System.out.println("visitFunction======================================"+name);
            String v = visit(name);
            System.out.println("if===========================");
           return "true";
    }


    @Override
    public String visitExpr_list(FunctionTokenizerParser.Expr_listContext ctx) {
        System.out.println("visitExpr_list======================================");
        return "true";
    }

    @Override
    public String visitExpr(FunctionTokenizerParser.ExprContext ctx) {
        System.out.println("visitExpr======================================");
        return "true";
    }



}

测试类:

public class FunctionValidate {


    public static void main(String[] args) {
        try {
            String input = "mul(add(input[\"data\"][0][\"name\"][][\"node\"],input[\"data\"][0]),input[\"data\"][0][\"name\"][][\"node\"][])";
            ANTLRInputStream str = new ANTLRInputStream(input);
            FunctionTokenizerLexer lexer = new FunctionTokenizerLexer(str);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            FunctionTokenizerParser parser = new FunctionTokenizerParser(tokens);
            parser.removeErrorListeners(); // remove ConsoleErrorListener 
            parser.addErrorListener(new VerboseListener());
             FunctionContext tree = parser.function();
            FunctionValidateVisitorImpl visitor = new FunctionValidateVisitorImpl();
            visitor.visit(tree);
            System.out.println("-->"+tree.toStringTree( parser ));
            AST ast=new AST(tree);
            System.out.println( "Improved ParseTree:\n" + ast.toString() );
            JFrame frame = new JFrame("Antlr AST");
            JPanel panel = new JPanel();
            TreeViewer viewr = new TreeViewer(Arrays.asList(
            parser.getRuleNames()),tree);
            viewr.setScale(1.5);
            panel.add(viewr);
            frame.add(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500,500);
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }



}
java antlr antlr4
1个回答
0
投票

我想这不是您想要粘贴到标识符的内容。

如何这样:

expr      : expr subscript | function | STRING | NUMBER | ID;
subscript : '[' expr? ']';
© www.soinside.com 2019 - 2024. All rights reserved.