У меня пользовательская функция, написанная так. Functionconcat(Functionadd(1,2),1)
.
Ниже приведен грамматик, который я использую. Теперь я изменил грамматику, с которой он работает, и проверяю тип возвращаемого значения для param, если функция существует:
grammar FunctionGrammer;
INT
: [0-9]+
;
ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;
expr : add;
string : 'Functionadd(' INT ',' INT ')' ;
add : 'Functionadd(' INT ',' INT ')' ;
concat : 'Functionconcat(' (string|INT )','INT ')';
Ниже приведен метод теста:
public static void main(String[] args) {
try {
CodePointCharStream input = CharStreams.fromString("Functionconcat(Functionadd(m,2),1)");
FunctionGrammerLexer lexer = new FunctionGrammerLexer(input);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
FunctionGrammerParser parser = new FunctionGrammerParser(tokenStream);
parser.setErrorHandler(new BailErrorStrategy());
ParseTree tree = parser.concat();
FunctionCompilerImpl visitor = new FunctionCompilerImpl();
visitor.visit(tree);
} catch (ParseCancellationException e) {
e.printStackTrace();
}
}
Это исключение, но какмогу ли я дать значимое исключение, такое как исключение несоответствия типа данных параметра / параметра или исключение несоответствия имени функции.
impl посетителя:
public class FunctionCompilerImpl extends FunctionGrammerBaseVisitor<String>{
@Override
public String visitConcat(FunctionGrammerParser.ConcatContext ctx) {
super.visitConcat(ctx);
System.out.println("==================="+ctx);
return null;
}
}
Но vistor не печатает System.out.println("==================="+ctx);
.