C 调车场算法能解析POSIX正则表达式吗?
乍一看,这似乎适用于POSIX正则表达式解析,但由于我在编写解析器方面没有太多经验(或理论背景),所以在开始编写一些东西之前,我想先问一下这一点,但这只是半途而废 也许更复杂的问题是:调车场算法可以应用于哪类问题的良好形式陈述C 调车场算法能解析POSIX正则表达式吗?,c,regex,algorithm,parsing,C,Regex,Algorithm,Parsing,乍一看,这似乎适用于POSIX正则表达式解析,但由于我在编写解析器方面没有太多经验(或理论背景),所以在开始编写一些东西之前,我想先问一下这一点,但这只是半途而废 也许更复杂的问题是:调车场算法可以应用于哪类问题的良好形式陈述 澄清:这个问题是关于是否可以使用分流算法的基本原理将POSIX re语法解析为抽象语法树,而不是是否可以使用正则表达式实现分流算法。很抱歉,我一开始说得不够清楚 我会说,您的问题的答案是“不,您不能使用正则表达式实现调车场算法”。这与您不能使用正则表达式解析任意HTML的
澄清:这个问题是关于是否可以使用分流算法的基本原理将POSIX re语法解析为抽象语法树,而不是是否可以使用正则表达式实现分流算法。很抱歉,我一开始说得不够清楚 我会说,您的问题的答案是“不,您不能使用正则表达式实现调车场算法”。这与您不能使用正则表达式解析任意HTML的原因相同。这可以归结为: 正则表达式没有堆栈。因为调车场算法依赖于堆栈(在从中缀转换为RPN时推送和弹出操作数),所以正则表达式没有执行此任务的计算“能力” 这掩盖了许多细节,但“正则表达式”是定义正则语言的一种方法。当你“使用”一个正则表达式时,你要求计算机说:“看一段文本,告诉我这些字符串是否在我的语言中。我用正则表达式定义的语言。”关于正则语言的更多信息,我将指出 因此,现在您需要一些数学概念来扩充“常规语言”,以便创建更强大的语言。如果将调车场算法描述为计算能力模型的实现,那么您可能会说该算法将被描述为(嘿,您知道什么,该链接使用表达式解析树作为示例。)a。有一堆的东西 如果你对自动机理论和复杂性类不太熟悉,那么如果不从头开始解释,这些维基百科文章可能就没有多大帮助
重点是,您可以使用正则表达式来帮助编写调车场。但是regex不太擅长执行任意深度的操作,这就是问题所在。所以我不会花太多时间在regex大道上解决这个问题。我不明白为什么它不合适。看看一些旧代码,我似乎对上一个regexp解析器使用了完全不同的解析策略(基本上,从一开始就进行了一次演练,通过一些前瞻和递归调用来实现正则表达式的分组)。我确信它可以。如果您看看Henry Spencer的正则表达式包:
这是Perl正则表达式的基础,您会注意到他将程序描述为“铁路正常形式”。我想您会遇到一些问题,因为不同的字符在不同的上下文中有不同的含义,例如
^[^a-z][asd-]
^
有两种不同的含义,-
也有两种不同的含义。我想我应该选择递归下降解析器。我想你误解了我的问题。我不是要用正则表达式实现调车场。我想问的是,是否有可能使用分流算法的一个变体来解析正则表达式(转换成AST)。无论如何,你已经写了一个很好的答案,尽管是针对一个不同的问题,所以我希望你不要只是删除它@poundifdef,这是一个对你的回答表示敬意的问题。提示:当您谈到解析正则表达式时,您的意思是将描述常规语言的字符串标记化吗?还是说执行它所代表的有限状态自动机?或者别的什么?我的意思是构建一个表示正则表达式的AST。我知道,将AST转换为自动机以匹配正则表达式是另一个问题。这是我最初的想法,但如果可以从堆栈/队列状态有效地确定上下文,那么处理这些特殊情况应该不是什么大问题,对吗?顺便说一下,[^a-z]
和[asd-]
都是单独的标记。没有理由在解析器级别将它们视为更复杂的东西。他们有机会在建造FA时变得特别。@R。。我并不是说这是不可能的,甚至不是说真的很难,但一旦你发现自己不得不走这条路,你可能走错了路。我只是觉得它作为递归下降解析器会更干净。@R..:如果您是在那个级别进行标记化,那么我的问题可能就不存在了,分流算法的实现也变得相当简单。我喜欢分流场的性能和内存使用非常可预测。这一切都在一个缓冲区中(4*strlen(regex)
应该足够了),失败案例纯粹是初始分配失败或无效语法。不存在堆栈使用失控或必须回溯并释放部分构建的AST on故障的可能性。