在 java 中使用 ANTLR4,检查有效的表达式、参数类型

In java using ANTLR4, check valid expression,argument type

我是antlr4的新手,使用antl4和java我们如何编写解析嵌套表达式。检查参数是 int、string、decimal 还是 boolean 以及表达式是否有效。

示例:

1. toString("test")
2. mul(toNumber("1.6"),add(3.14,1.5))
3. getRandomNumber()
4. split(split("1/2,3/4,4/5",","),"/")
5. append("[1,2,3","]")

下面是检查表达式是否有效的表达式名称。

Map<String,String> map=new HashMap<>();
map.put("toString","String");
map.put("mul","decimal,decimal");
map.put("toNumber","String");
map.put("add","decimal,decimal");
map.put("generateRandomNumber","");

因此,通过使用上面的映射,我们必须检查名称是否正确以及 return 类型在嵌套表达式的情况下是否正确,因为它将成为另一个表达式的参数。如果表达式名称正确,我们必须检查参数是否正确。我已经编写了它正在工作的词法分析器和解析器,但对于某些输入,例如 [,]," ,' 和逗号像这些输入一样失败,因为在表达式中我们使用 comma(,) 来分隔参数。下面是词法分析器和解析器。

词法分析器: FunctionValidateLexer.g4

lexer grammar FunctionValidateLexer;
NAME: [A-Za-z0-9."`~!@#+%_-]+;
PERCENT:'%';
ASTERICK:'*';
OPENSQBRKET:'\[';
CLOSEDSQBRKET:'\]';
AMPERSAND:'&';
CAP:'^';
DOT: '.';
COMMA: ',';
L_BRACKET: '(';
R_BRACKET: ')';
HIPHEN:'-';
UNDERSCORE:'_';
DOLLAR:'$';
PLUS:'+';
WS : [ \t\r\n]+ -> skip;

解析器: FunctionValidateParser.g4

parser grammar FunctionValidateParser;
options { tokenVocab=FunctionValidateLexer; }
functions : function* EOF;
function : NAME '(' (argument (COMMA argument)*)? ')';
argument: (NAME | function );

我已经编写了用于表达式名称和参数验证的访问者模式。但是我在定义接受所需参数的词法分析器和解析器时遇到问题。

如何更改词法分析器和解析器以接受除 comma(,)round brackets( ( ) 以外的所有字符。只要逗号和圆括号位于两个双引号或单引号之间(如 ',' 或 "," 或 "(" 或 ")"),它们就应被视为参数。

所以如上所述,我想接受像 ` 这样的所有字符! @#$​​%^&*[]/? < > : ; “”\| . + - } { 。但是由于圆括号和逗号是表达式定义的一部分,因此只有当它们位于单引号或双引号之间时才必须考虑它们,否则会抛出错误。如何修改我的词法分析器和解析器以接受上述要求。

我不明白你为什么不匹配字符串:" ... "。这对我来说毫无意义。以下语法解析您的所有示例输入:

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;