Я пишу пользовательский парсер, используя регулярные выражения, но я не могу понять, как совместить функции.Java RegEx - сопоставление списка аргументов
Пример функции в моем пользовательском языке:
function int add(int num1, int num2){
return num1 + num2;
}
Мой токенизатор использует регулярные выражения, чтобы получить следующий маркер и удалить его из исходного кода строки поставляемой ранее. Это означает, что когда дело доходит до разбора функции, я могу быть уверен, что код начнется с оператора функции. я в настоящее время имеют следующее выражение:
^([\s]*function[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*\(([\s]*[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*)*\)[\s]*\{.*\}.*)$
Это очень долго, но он успешно соответствует эти две функции:
function void log(string msg){
Console.log(msg);
}
и
function int add(int num1 int num2){
return num1 + num2;
}
я хочу, чтобы иметь возможность разделить аргументы запятой.
Я мог бы сделать запятой требуется после параметра, а затем последний параметр будет заканчиваться запятой.
Я мог бы сделать запятую опциональной после параметра, а затем пользователь сможет не поставить запятую в.
мне нужно, чтобы быть в состоянии требует только запятой между параметрами, в противном случае это испортит мой парсер позже. Как я могу изменить свое выражение для поиска запятой между аргументами?
Большое спасибо за ваше время.
Можете ли вы сказать мне, в какой именно функции вы хотите добавить запятую. –
Забудьте об этом.Вы можете использовать регулярное выражение, чтобы вытащить отдельные токены из строки, но я бы даже не попытался разобрать целые конструкции, используя регулярное выражение. Во-первых, нет возможности использовать регулярное выражение для анализа переменного количества параметров и извлечения всей информации. – ajb
Я просто хочу совместить '(int num1, int num2)'. Это просто '\ (([\ s] * [a-zA-Z] [a-zA-Z0-9] * [\ s] + [a-zA-Z] [a-zA-Z0-9] * [\ s] *) * \) '. Мне нужно проверить, что параметры разделены запятой. –