我有以下语法文件用于解析嵌套函数。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();
}
}
}
我想这不是您想要粘贴到标识符的内容。
如何这样:
expr : expr subscript | function | STRING | NUMBER | ID;
subscript : '[' expr? ']';