Эту задачу можно выполнить, выполнив два основных шага:
1 ) Разобрать заданные входные данные и построить Абстрактное синтаксическое дерево (AST).
2 ) Обходите дерево и проверяйте каждую функцию, каждый аргумент, один за другим, используя шаблоны Listener или Visitor.
К счастью, ANTLR предоставляет инструменты для реализации обоих шагов.
Вот простая грамматика, которую я написал на основе вашего примера. Это делает рекурсивный анализ и строит AST. Возможно, вы захотите расширить его функциональность в соответствии с вашими потребностями.
Lexer :
lexer grammar MyFunctionsLexer;
FUNCTION: 'FUNCTION';
NAME: [A-Z]+;
DOT: '.';
COMMA: ',';
L_BRACKET: '(';
R_BRACKET: ')';
WS : [ \t\r\n]+ -> skip;
Parser :
parser grammar MyFunctionsParser;
options {
tokenVocab=MyFunctionsLexer;
}
function : FUNCTION '.' NAME '('(function | argument (',' argument)*)')';
argument: (NAME | function);
Важное замечание: синтаксический анализатор несделайте различие между действительными (с вашей точки зрения) и недействительными функциями, аргументами, количеством аргументов и т. д. Таким образом, функция типа Function.whatever(InvalidArg)
также является действительной конструкция с точки зрения парсера . Чтобы дополнительно проверить входные данные и проверить, соответствует ли оно вашим требованиям (которые представляют собой предопределенный список функций и их аргументов), вы должны пройти по дереву, используя Listener или Visitor (я думаю, что Visitor идеально подходит здесь).
Чтобы лучше понять, что это такое, я бы порекомендовал прочитать это и это . Но если вы хотите углубиться в предмет, вы должны обязательно взглянуть на " Книга драконов ", в которой подробно рассматривается тема.