Я новичок в antlr4, использую antl4 и java, как мы можем написать синтаксический анализ вложенного выражения. проверьте аргумент, является ли он int, строковым, десятичным или логическим, и выражение является допустимым выражением.
Пример:
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","");
Таким образом, используя приведенную выше карту, мы должны проверить, является ли имя правильным и тип возвращаемого значения верным в случае вложенного выражения, поскольку это будет аргумент для другого выражения. , И если имя выражения правильное, мы должны проверить, правильны ли аргументы или нет. Я написал лексер и парсер, который работает, но для некоторых входных данных, таких как [, ] , ", ' и запятая, как эти входы, которые он терпит неудачу, так как в выражении у нас есть запятая (,) для разделения аргумента. Ниже приведены лексер и парсер.
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 );
Я написал шаблон посетителя для проверки имени выражения и аргумента. Но я столкнулся с проблемой при определении лексера и анализатора для Принятие обязательных аргументов.
Как я могу изменить лексер и парсер на синтаксический анализ для принятия всех символов, кроме comma(,)
, round brackets( ( )
. Запятую и круглую скобку следует рассматривать как аргумент, если они находятся между двумя двойными или одинарные кавычки (например, ',' или "," или "(" или ")").
Поэтому, как описано выше, я хотел принять все символы, такие как `! @ # $% ^ & * [] /? <>:; "" \ |. + -} {. Но как круглый брач кеты и запятые являются частью определения выражения, их нужно учитывать только тогда, когда они заключены в одинарные или двойные кавычки, в противном случае выдается ошибка. Как можно изменить мой лексер и парсер для принятия вышеуказанного требования.