
com.alibaba.qlexpress4.aparser.OutVarNamesVisitor Maven / Gradle / Ivy
package com.alibaba.qlexpress4.aparser;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Author: DQinYuan
*/
public class OutVarNamesVisitor extends QLParserBaseVisitor {
private final Set outVars = new HashSet<>();
private ExistVarStack existVarStack = new ExistVarStack(null);
private static class ExistVarStack {
private final ExistVarStack parent;
private final Set existVars = new HashSet<>();
private ExistVarStack(ExistVarStack parent) {
this.parent = parent;
}
public void add(String varName) {
existVars.add(varName);
}
public boolean exist(String varName) {
if (existVars.contains(varName)) {
return true;
}
return parent != null && parent.exist(varName);
}
public ExistVarStack push() {
return new ExistVarStack(this);
}
public ExistVarStack pop() {
return parent;
}
}
// scope
@Override
public Void visitBlockExpr(QLParser.BlockExprContext ctx) {
this.existVarStack = this.existVarStack.push();
super.visitBlockExpr(ctx);
this.existVarStack = this.existVarStack.pop();
return null;
}
@Override
public Void visitIfExpr(QLParser.IfExprContext ctx) {
ctx.condition.accept(this);
this.existVarStack = this.existVarStack.push();
ctx.thenBody.accept(this);
this.existVarStack = this.existVarStack.pop();
this.existVarStack = this.existVarStack.push();
ctx.elseBody.accept(this);
this.existVarStack = this.existVarStack.pop();
return null;
}
@Override
public Void visitTryCatchExpr(QLParser.TryCatchExprContext ctx) {
QLParser.BlockStatementsContext blockStatementsContext = ctx.blockStatements();
if (blockStatementsContext != null) {
this.existVarStack = this.existVarStack.push();
blockStatementsContext.accept(this);
this.existVarStack = this.existVarStack.pop();
}
QLParser.TryCatchesContext tryCatchesContext = ctx.tryCatches();
if (tryCatchesContext != null) {
tryCatchesContext.accept(this);
}
QLParser.TryFinallyContext tryFinallyContext = ctx.tryFinally();
if (tryFinallyContext != null) {
this.existVarStack = this.existVarStack.push();
tryFinallyContext.accept(this);
this.existVarStack = this.existVarStack.pop();
}
return null;
}
@Override
public Void visitTryCatch(QLParser.TryCatchContext ctx) {
this.existVarStack = this.existVarStack.push();
super.visitTryCatch(ctx);
this.existVarStack = this.existVarStack.pop();
return null;
}
// collect exist variable name
/**
* @param ctx int a = 10;
* @return a
*/
@Override
public Void visitVariableDeclaratorId(QLParser.VariableDeclaratorIdContext ctx) {
QLParser.VarIdContext varIdContext = ctx.varId();
existVarStack.add(varIdContext.getText());
return null;
}
@Override
public Void visitLeftHandSide(QLParser.LeftHandSideContext ctx) {
List pathPartContexts = ctx.pathPart();
String leftVarName = ctx.varId().getText();
if (pathPartContexts.isEmpty()) {
existVarStack.add(leftVarName);
} else if (!existVarStack.exist(leftVarName)) {
outVars.add(leftVarName);
}
return null;
}
// collect out variables name
@Override
public Void visitVarIdExpr(QLParser.VarIdExprContext ctx) {
String varName = ctx.varId().getText();
if (!existVarStack.exist(varName)) {
outVars.add(varName);
}
return null;
}
public Set getOutVars() {
return outVars;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy