анализатор на персонализирани регулярни изрази

Бих искал да направя съвпадение на регулярни изрази на персонализирани азбуки, като използвам персонализирани команди. целта е да се изследват уравнения и изрази, които се появяват в метеорологията.

Така например моята азбука an be [p, rho, u, v, w, x, y, z, g, f, phi, t, T, +, -, /] ЗАБЕЛЕЖКА: rho и phi са множество символи, които трябва да се третират като един знак.

Бих искал също да използвам персонализирани команди, като \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 да допускат начин за използване на персонализирани команди. Освен това, тъй като бих искал да използвам backtrack, не съм сигурен дали Ragel е правилната опция, тъй като това ще се нуждае от стек, което означава, че ще използвам CFG.

Има ли може би специфичен за домейн език за изграждане на такива regex/cfg машини (за linux 64 бита, ако има значение)


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

Проблемът с обобщаването на латексните уравнения, които означават с регулярни изрази, е човешкият фактор. Това е само нотация и авторът може да избере различни начини на въвеждане.

Най-добрият и точен начин е да се анализира съдържанието на формулата и да се създаде три изчисления. В този случай ще търсите не само нотации на диференциали или производни, но инструкции за изчисляване на диференциали и производни, но така или иначе това е свързано с подробен анализ на низа на формулата с множество случаи на начин на писане.

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

Още един пример:

въведете описание на изображението тук

// 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
благодаря, въпреки че не търсих само latex, но преди всичко друго разбирам ли това правилно: трябва да маскирам собствения си синтаксис с функция, която ще върне нещо, което обикновена машина за regex може да обработва? - person Sean; 17.12.2013