在 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;
我是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;