собственный парсер регулярных выражений

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

Так, например, мой алфавит должен быть [p, rho, u, v, w, x, y, z, g, f, phi, t, T, +, -, /] ПРИМЕЧАНИЕ: ро и фи — это несколько символов, которые следует рассматривать как один символ.

Я также хотел бы использовать пользовательские команды, такие как \v для переменной, то есть не арифметические операторы.

Я хотел бы использовать другие команды, такие как (\v). обратите внимание, что точка должна соответствовать dx/dt, где x — это переменная. аналогично, учитывая p=p(x,y,z), p' будет соответствовать dp/dx, dp/dy и dp/dz, но не dp/df. (где-то было бы указано, что p = p(x,y,z)).

Я также хотел бы иметь возможность вернуться назад.

Теперь, когда я исследовал PCRE и ragel с помощью D, я вижу, что первые две проблемы решаемы с несколькими символьными объектами, определенными как фиксированные объекты. а не класс персонажа.

Однако как мне обратиться к третьему?

Я не вижу ни PCRE, ни RAGEL, позволяющих использовать пользовательские команды. Более того, поскольку я хотел бы использовать возврат, я не уверен, что Ragel является правильным вариантом, так как для этого потребуется стек, а это означает, что я буду использовать CFG.

Существует ли возможно предметно-ориентированный язык для создания таких машин regex/cfg (для 64-разрядной версии Linux, если это имеет значение)


person Sean    schedule 16.12.2013    source источник
comment
Какая третья проблема? Это сбивает с толку то, что вы хотите ... Не могли бы вы опубликовать ввод и ожидаемый результат?   -  person HamZa    schedule 16.12.2013
comment
третья проблема: я хотел бы использовать другие команды, такие как (\ v). обратите внимание, что точка должна соответствовать dx/dt, где x — переменная. аналогично, учитывая p=p(x,y,z) , p' будет соответствовать dp/dx, dp/dy и dp/dz, но не dp/df. (где-то будет указано, что p = p(x,y,z).so string[] test= [dp/df, dp/dx]; char[] p_depends = ['x','y','z ']; теперь заданы: regexmatch(test, p', p_depends) должен возвращать dp/dx. обратите внимание на штрих (') с p во втором аргументе, указывающем шаблон   -  person Sean    schedule 16.12.2013


Ответы (1)


Нет ничего невозможного. Просто напишите новый класс с регулярным выражением внутри вашего языка программирования и определите новый синтаксис. Это будет ваш личный синтаксис регулярных выражений. Например, как:

result = latex_string.match("p'(x,y,z)", "full"); // match dp/dx, dp/dy, dp/dz
result = latex_string_array.match("p'(x,y,z)", "partial"); // match ∂p/∂x, ∂p/∂y, ∂p/∂z
. . .

Метод match обработает новое псевдорегулярное выражение внутри вашего класса и вернет результат в нужной форме. Вы можете просто сделать определение ввода в виде строки и/или формы массива. На самом деле, если какой-то функции должны соответствовать все производные, вы должны упростить нотацию поиска до .match("p'").

Одно простое уведомление:

уравнение латекса,

иметь источник: \mathrm{d}y=\frac{\mathrm{d}y}{\mathrm{d}t}\mathrm{d}t и:

уравнение латекса,

dy=\frac{dy}{dt}dt, и наконец:

уравнение латекса,

is dy=(dy/dt)dt

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

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

Еще одна вещь, и хорошие новости для вас! Нет необходимости определять волшебный регулярный латексный многобайтовый алфавит греческого алфавита. UTF-8 имеет ρ - GREEK SMALL LETTER RHO, который вы можете использовать в пользовательском интерфейсе, но в методе поиска обрабатывайте его как \rho и используйте просто /\\frac{d\\rho}{dx}/ нотацию регулярного выражения.

Еще один пример:

введите здесь описание изображения

// search string
equation = "dU= \left(\frac{\partial U}{\partial S}\right)_{V,\{N_i\}}dS+ \left(\frac{\partial U}{\partial V}\right)_{S,\{N_i\}}dV+ \sum_i\left(\frac{\partial U}{\partial N_i}\right)_{S,V,\{N_{j \ne i}\}}dN_i";
. . .
// user input by UI 
. . .
// call method
equation.equation_match("U'");// example notation for all types of derivatives for all variables
. . .
// inside the 'equation_match' method you will use native regex methods
matches1 = equation.match(/dU/); // dU
matches2 = equation.match(/\\partial U/); // ∂U
   etc.
return(matches);// combination of matches
person Ruben Kazumov    schedule 17.12.2013
comment
спасибо, хотя я не искал только латекс, но, прежде всего, я правильно понимаю: я должен замаскировать свой собственный синтаксис функцией, которая вернет что-то, что может обработать обычная машина регулярных выражений? - person Sean; 17.12.2013