Algorithm 解析带有转义符或分隔符的嵌套块的最有效算法

Algorithm 解析带有转义符或分隔符的嵌套块的最有效算法,algorithm,parsing,Algorithm,Parsing,我将嵌套块定义为具有单独的开始字符和结束字符的块。例如{和},[和]等。如果开头和结尾字符包含在分隔符中(例如'{或“{),或在注释块中显式转义,则算法必须忽略它们 这不是家庭作业(我不是学生)我的直接目标是按字母顺序重新排列ActionScript代码文件中的函数声明,以帮助调试/比较不同的版本。但真正的问题,对其他读者来说更有用的是上面描述的通用算法。在我的例子中,插件参数只是打开={,closing=},delimiter=“,escape=/..[行尾] 有关解释为什么正则表达式不是解析

我将嵌套块定义为具有单独的开始字符和结束字符的块。例如
{
}
[
]
等。如果开头和结尾字符包含在分隔符中(例如
'{
“{
),或在注释块中显式转义,则算法必须忽略它们

这不是家庭作业(我不是学生)我的直接目标是按字母顺序重新排列ActionScript代码文件中的函数声明,以帮助调试/比较不同的版本。但真正的问题,对其他读者来说更有用的是上面描述的通用算法。在我的例子中,插件参数只是打开=
{
,closing=
}
,delimiter=
,escape=
/..[行尾]

有关解释为什么正则表达式不是解析任意深度嵌套表达式的选项的现有问题,请参见以下内容:


显而易见的直截了当的解决方案是一个字符接一个字符,构建上下文堆栈和状态变量(“inQuote”、“inComment”等)。我以前做过。我只是想知道是否有更正式或更有效的解决方案;或者这是不可还原的。

根据您想要做的事情,您可以使用上下文堆栈解决方案,也可以从语句中构建表达式树。据我所知,如果您只需要一些简单的解析,但是如果您需要复杂的表达式处理或只是多层次的表达式处理,那么您可能需要考虑表达式树,否则称为解析树。http://en.wikipedia.org/wiki/Parse_tree)。在您的情况下,如果操作正确,树不会变得非常复杂。正如我所说的,从我所读到的内容来看,只要您能够获得整个功能块并以某种方式封装它,并且只需按名称排序,树就不会变得非常复杂。

关于更“正式”的问题“解决方案:看起来这是一项解析任务。请看一下Boost Spirit库。不过,我不确定它是否比自制的性能更好(而且可能不太通用)解析算法。无法避免对每个字符进行迭代,因为您必须检查每个字符是否是块的开始/结束。鉴于此,任何其他解决方案最好使用常量因子。