2016-08-14 3 views
0

Я пишу пользовательский парсер, используя регулярные выражения, но я не могу понять, как совместить функции.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; 
} 

я хочу, чтобы иметь возможность разделить аргументы запятой.

  • Я мог бы сделать запятой требуется после параметра, а затем последний параметр будет заканчиваться запятой.

  • Я мог бы сделать запятую опциональной после параметра, а затем пользователь сможет не поставить запятую в.

мне нужно, чтобы быть в состоянии требует только запятой между параметрами, в противном случае это испортит мой парсер позже. Как я могу изменить свое выражение для поиска запятой между аргументами?

Большое спасибо за ваше время.

+0

Можете ли вы сказать мне, в какой именно функции вы хотите добавить запятую. –

+0

Забудьте об этом.Вы можете использовать регулярное выражение, чтобы вытащить отдельные токены из строки, но я бы даже не попытался разобрать целые конструкции, используя регулярное выражение. Во-первых, нет возможности использовать регулярное выражение для анализа переменного количества параметров и извлечения всей информации. – ajb

+0

Я просто хочу совместить '(int num1, int num2)'. Это просто '\ (([\ s] * [a-zA-Z] [a-zA-Z0-9] * [\ s] + [a-zA-Z] [a-zA-Z0-9] * [\ s] *) * \) '. Мне нужно проверить, что параметры разделены запятой. –

ответ

1

Это регулярное выражение должно работать на (int num1, int num2) часть строки:

(\((?:\s*[^\s,]+\s+[^\s,]+\s*,)*\s*[^\s,]+\s+[^\s,]+\s*\)) 

легче читать, когда пространство его:

(\(
(?:  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s*, 
)*  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s* 
\)) 
0

Вы могли бы думать о нем, как имеющие 3 разные возможности : нулевые параметры, один параметр и несколько параметров. Затем просто проверьте с помощью оператора или для каждой другой возможности.

Один параметр:

(?:\\w+\\s+\\w+) 

более одного параметра:

(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+ 

Ноль Параметры:

\\s* 

При использовании или заявление (все выше):

((?:\\w+\\s+\\w+)|(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+|\\s*) 
Смежные вопросы