В 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;