В лексере ANTLR4 как определить негативный взгляд за usecase - PullRequest
1 голос
/ 23 января 2020

В ANTLR4 Java я хотел определить негативный взгляд на сценарий использования. Для вложенной входной функции или простой функции в качестве входных данных, основанных на аргументе, она будет маркировать и использовать шаблон посетителя. Я написал logi c для проверки грамматики.

LEXER:

lexer grammar MyFunctionsLexer;
NAME: [A-Za-z0-9."[\]'$/\\]+;
DOT: '.';
COMMA: ',';
L_BRACKET: '(';
R_BRACKET: ')';
WS : [ \t\r\n]+ -> skip;

PARSER:

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

Здесь на основе COMMA аргумент будет размечен. Но я хотел, чтобы / followed by ,(Commma) был там, он не должен разбивать токены.

Я использовал (?<!\/), в качестве регулярного выражения в лексере COMMA, но он не работает.

Пример ввода:

Functions.substring(Functions.concat(String),input[\"/,$csv.test.a\"][\"in\"],Integer,String,Integer,Integer)

В приведенном выше входном параметре input[\"/,$csv.test.a\"][\"in\"] является аргументом, но при наличии ,(Comma) этот аргумент будет разбит на две части, а при / followed ,(Comma) Я не хотел разбивать это на две части, вместо этого он должен рассматриваться как одна.

Ниже приведена ошибка:

line 1:44 token recognition error at: ','
line 1:53 token recognition error at: ','
com.test.functionvalidate.FunctionInvalidException: line 1:45 at [@6,45:52='input["/',<1>,1:45]: mismatched input 'input["/' expecting {'(?<!\/),', ')'}
    at com.test.functionvalidate.VerboseListener.syntaxError(VerboseListener.java:17)
    at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
    at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
    at org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327)
    at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)
    at com.functionvalidate.validate.MyFunctionsParser.function(MyFunctionsParser.java:231)
    at com.functionvalidate.validate.MyFunctionsParser.functions(MyFunctionsParser.java:133)
    at com.test.functionvalidate.FunctionValidate.main(FunctionValidate.java:43)

Модифицированный лексер, для которого появилась вышеуказанная ошибка:

lexer grammar MyFunctionsLexer;
NAME: [A-Za-z0-9."[\]'$/\\]+;
DOT: '.';
COMMA: '(?<!\\/),';
L_BRACKET: '(';
R_BRACKET: ')';
WS : [ \t\r\n]+ -> skip;
...