我是ANTLR的新手,我列出了大多数嵌套类型的函数。
下面是功能示例:
1. Function.add(Integer a,Integer b)
2. Function.concat(String a,String b)
3. Function.mul(Integer a,Integer b)
如果输入具有:
Function.concat(Function.substring(String,Integer,Integer),String)
因此,通过将ANTLR与Java程序配合使用,如何定义和验证函数名称是否正确以及参数计数和数据类型是否正确,而该函数必须是深度嵌套格式,因此必须递归?
可以通过执行两个主要步骤来完成此任务:
1)解析给定的输入并构建一个Abstract Syntax Tree(AST)。
2)使用侦听器或访客模式遍历树并逐个验证每个函数,每个参数。
幸运的是,ANTLR提供了用于实现这两个步骤的工具。这是我根据您的示例编写的一个简单语法。它会进行递归解析并构建AST。您可能需要扩展其功能以满足您的需求。
Lexer:
lexer grammar MyFunctionsLexer;
FUNCTION: 'FUNCTION';
NAME: [A-Z]+;
DOT: '.';
COMMA: ',';
L_BRACKET: '(';
R_BRACKET: ')';
WS : [ \t\r\n]+ -> skip;
解析器:
parser grammar MyFunctionsParser;
options {
tokenVocab=MyFunctionsLexer;
}
function : FUNCTION '.' NAME '('(function | argument (',' argument)*)')';
argument: (NAME | function);
这里要注意的重要事项:解析器不会区分valid(从您的角度来看)和invalid函数,参数,参数数量等。因此,从解析器的角度来看,类似Function.whatever(InvalidArg)
的功能也是valid构造。为了进一步验证输入并测试其是否满足your要求(这是函数及其参数的预定义列表),您必须使用Listener或Visitor(遍历树)来遍历树(我认为Visitor非常适合此处)。
为了更好地理解它是什么,建议阅读this和this。但是,如果您想更深入地研究该主题,则绝对应该看一下“ The Dragons Book”,它详尽地涵盖了该主题。