Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调车场算法能解析POSIX正则表达式吗?_C_Regex_Algorithm_Parsing - Fatal编程技术网

C 调车场算法能解析POSIX正则表达式吗?

C 调车场算法能解析POSIX正则表达式吗?,c,regex,algorithm,parsing,C,Regex,Algorithm,Parsing,乍一看,这似乎适用于POSIX正则表达式解析,但由于我在编写解析器方面没有太多经验(或理论背景),所以在开始编写一些东西之前,我想先问一下这一点,但这只是半途而废 也许更复杂的问题是:调车场算法可以应用于哪类问题的良好形式陈述 澄清:这个问题是关于是否可以使用分流算法的基本原理将POSIX re语法解析为抽象语法树,而不是是否可以使用正则表达式实现分流算法。很抱歉,我一开始说得不够清楚 我会说,您的问题的答案是“不,您不能使用正则表达式实现调车场算法”。这与您不能使用正则表达式解析任意HTML的

乍一看,这似乎适用于POSIX正则表达式解析,但由于我在编写解析器方面没有太多经验(或理论背景),所以在开始编写一些东西之前,我想先问一下这一点,但这只是半途而废

也许更复杂的问题是:调车场算法可以应用于哪类问题的良好形式陈述


澄清:这个问题是关于是否可以使用分流算法的基本原理将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故障的可能性。