В java с использованием ANTLR4, проверьте правильное выражение, тип аргумента - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в 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( ( ). Запятую и круглую скобку следует рассматривать как аргумент, если они находятся между двумя двойными или одинарные кавычки (например, ',' или "," или "(" или ")").

Поэтому, как описано выше, я хотел принять все символы, такие как `! @ # $% ^ & * [] /? <>:; "" \ |. + -} {. Но как круглый брач кеты и запятые являются частью определения выражения, их нужно учитывать только тогда, когда они заключены в одинарные или двойные кавычки, в противном случае выдается ошибка. Как можно изменить мой лексер и парсер для принятия вышеуказанного требования.

1 Ответ

1 голос
/ 10 апреля 2020

Я не понимаю, почему вы не соответствуете строки: " ... ". Это не имеет смысла для меня. Следующая грамматика анализирует весь ваш пример ввода:

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;

enter image description here

...