Проверьте максимальное появление массива в вложенной функции, используя ANTLR4JAVA

Программисты JAVA общаются здесь
Anonymous
Проверьте максимальное появление массива в вложенной функции, используя ANTLR4

Сообщение Anonymous »

У меня есть грамматический файл ниже для анализа вложенных функций. < /p>
Грамматика: < /p>

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

grammar FunctionTokenizer;

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

STRING    : '"' ~'"'* '"';
NUMBER    : [0-9]+ ('.' [0-9]+)?;
ID        : [a-zA-Z_] [a-zA-Z_0-9]*;
SPACES    : [ \t\r\n]+ -> skip;
< /code>
Ввод сбой, поскольку у него есть квадратный кронштейн. Я изменил регулярность для Lexer как: < /p>
ID        : [a-zA-Z_] [a-zA-Z_0-9\\[\\]]*;
< /code>
Но я получаю ошибку. < /p>
Ввод: < /p>
split(mul(add(input["data"][0]["name"][]["node"],input["data"][0]),input["data"][0]["name"][]["node"][]),",")
Для приведенного выше ввода я проверяю, какой аргумент имеет максимальные кронштейны либо [,] (пусто), либо [0-9] квадратных кронштейнов с номером, пренебрегая теми, кто имеет одиночные и двойные цитаты, такие как ["1234"] или ['data'] . input ["data"] [0] ["name"] [] ["node"] [] имеет максимальный массив. />https://github.com/vikramas/checkmaxarr ... ree/master

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

VisitorImplementation
класс:

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

public class FunctionValidateVisitorImpl  extends FunctionTokenizerBaseVisitor  {

@Override
public String visitParse(FunctionTokenizerParser.ParseContext ctx) {
ParseTree name = ctx.getChild(2);
String visit = visit(name);
System.err.println("visit1:::::::::::"+visit);
return visit(name);
}

@Override
public String visitFunction(FunctionTokenizerParser.FunctionContext ctx) {
ParseTree name = ctx.getChild(2);
String visit = visit(name);
System.err.println("visit2:::::::::::"+visit);
return visit;
}

@Override
public String visitExpr_list(FunctionTokenizerParser.Expr_listContext ctx) {
String s="";
for (int i = 0; i < ctx.getChildCount(); i+=2) {
if(ctx.getChild(i) instanceof FunctionTokenizerParser.Expr_listContext ) {
String g=visit(ctx.getChild(i));
System.err.println("visit3:::::::::::if "+i+"    "+g);
s=s+g;
}
else {
System.err.println("visit4:::::::::::else  "+i+"    "+ctx.getChild(i).getText());
s=s+ctx.getChild(i).getText();
}
}
return s;
}

public String visitSubscript(FunctionTokenizerParser.SubscriptContext ctx) {
System.err.println("visit5:::::::::::");
String s="";
for (int i = 0; i < ctx.getChildCount(); i++) {
if(ctx.getChild(i) instanceof FunctionTokenizerParser.SubscriptContext) {
String g=visit(ctx.getChild(i));
s=s+g;
}
else {
s=s+ctx.getChild(i).getText();
}
}
return s;
}

@Override
public String visitExpr(FunctionTokenizerParser.ExprContext ctx) {
System.err.println("visit6:::::::::::");
String s="";
for (int i = 0; i < ctx.getChildCount(); i++) {
if(ctx.getChild(i) instanceof TerminalNodeImpl ) {
s=s+ctx.getChild(i).getText();
}
else {
String g=visit(ctx.getChild(i));

s=s+g;
}
}

return s;
}
}
< /code>
тестовый класс: < /p>
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();
}
}
}

Реализация для посетителей работает для одного аргумента, но если я прохожу несколько аргументов, это проваливает.split(rrr(test(input[\"data\"][0]),input[\"data\"]),input[\"data\"])[]
< /code>
output: < /p>
visit4:::::::::::else 0 rrr(test(input["data"][0]),input["data"])
visit4:::::::::::else 2 input["data"]
visit2:::::::::::rrr(test(input["data"][0]),input["data"])input["data"]
< /code>
После метода списка выражений, непосредственно, иное, что цикл выполняется, но он должен вызвать метод посещения. Экземпляр условия списка выражений сбои, поэтому вызов метода напрямую достигает другого.

Подробнее здесь: https://stackoverflow.com/questions/612 ... ing-antlr4

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