自定义正则表达式解析器

时间:2013-12-16 14:59:39

标签: regex context-free-grammar

我想使用自定义命令在自定义字母表上进行正则表达式匹配。目的是研究气象学中出现的方程式和表达式。

所以例如我的alpabet是[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/dxdp/dydp/dz,但不匹配dp/df。 (某处会有p = p(x,y,z))。

我也希望能够回溯。

现在,我已经用D调查了PCRE和ragel,我发现前两个问题是可解的,多个角色对象被定义为固定对象。而不是一个角色类。

但是我如何解决第三个问题?

我没有看到PCRE或RAGEL承认使用自定义命令的方法。 此外,由于我想使用回溯,我不确定Ragel是否是正确的选项,因为这个wouuld需要一个堆栈,这意味着我将使用CFG。

是否可能是一种域特有的语言来构建这样的regex / cfg机器(如果重要的话,对于linux 64位)

1 个答案:

答案 0 :(得分: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'")

一个简单的通知:

latex equation

有来源:\mathrm{d}y=\frac{\mathrm{d}y}{\mathrm{d}t}\mathrm{d}t,并且:

latex equation

dy=\frac{dy}{dt}dt,最后:

latex equation

dy=(dy/dt)dt

具有正则表达式的乳胶方程的推广问题是人为输入因子。它只是一个符号,作者可以选择各种输入方式。

最好和最精确的方法是分析公式内容并创建计算三。在这种情况下,您不仅会搜索差异或派生词的符号,还会搜索计算差异和派生词的说明,但无论如何它都与详细分析公式字符串有多种写作方式。

还有一件事,对你来说是个好消息!没有必要定义魔法正则表达式乳胶多字节字母希腊字母表。 UTF-8可以在用户界面中使用ρ - GREEK SMALL LETTER RHO,但在搜索方法中将其视为\rho,并使用/\\frac{d\\rho}{dx}/正则表达式。

还有一个例子:

enter image description here

// 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