我是antlr4的新手,使用antl4和java如何编写解析嵌套表达式。检查参数是int、string、十进制还是布尔值,表达式是有效表达式。
示例:
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","");因此,通过使用上面的映射,我们必须检查名称是否正确,如果是嵌套表达式,返回类型是否正确,因为它将是另一个表达式的参数。如果表达式名是正确的,我们必须检查参数是否正确。我已经编写了它正在工作的词法和解析器,但是对于一些输入,如[,],",'和逗号,它的输入失败了,因为表达式中有逗号(,)E 211,用于分隔参数。下面是词法和解析器。
Lexer: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 );我编写了用于表达式、名称和参数验证的访问者模式。但是,我在为接受所需参数而定义lexer和解析器方面遇到了问题。
如何更改词法和解析器以接受除comma(,)、round brackets( ( )以外的所有字符。逗号和圆括号在两个双引号或单引号(如',‘或“(或)”)之间时应被视为参数。
因此,如前所述,我希望接受所有字符,如`!@#$%^&*/?<>:;“\x{e76f}。{ .但是,由于方括号和逗号是表达式定义的一部分,因此只有在单引号或双引号之间时才必须考虑它们,否则抛出错误。如何修改我的词法和解析器来接受上面的要求。
发布于 2020-04-10 08:22:29
我不明白为什么您不匹配字符串:" ... "。这对我来说毫无意义。以下语法分析了所有示例输入:
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;

https://stackoverflow.com/questions/61128232
复制相似问题