如何使用PHP preg_match_all实现简单的CFG解析器?

时间:2011-03-08 01:18:16

标签: php parsing

我正在使用preg_match_all来创建一个简单的解析器。请注意,由于它只会解析几个句子,因此性能无关紧要。是否可以创建一个解析器,通过下面的Context语法解析?

S -> NP VP
PP -> P NP
NP -> 'the' N | N PP | 'the' N PP
VP -> V NP | V PP | V NP PP
N -> 'cat'
N -> 'dog'
N -> 'rug'
V -> 'chased'
V -> 'sat'
P -> 'in'
P -> 'on'

我无法解决的问题是循环。

例如,您是否看到可以存在PP的循环 - > NP - > PP等等?

PHP中有什么像下推自动机一样可以解决这个问题吗?

示例输入:'猫追了狗'

示例输出:

<(>(NP(N cat))(VP(V追逐)(NP(N狗))))

示例输入:'猫在地毯上追逐狗'

示例输出:

(S   (NP(N cat))   (VP(V追逐)(NP(N狗)(PP(P on)(NP(N rug)))))))

(S   (NP(N cat))   (VP(V追逐)(NP(N狗))(PP(P on)(NP(N rug)))))

1 个答案:

答案 0 :(得分:1)

这里通常的方法是编写一个预测解析器。对你而言,这可能意味着使用正则表达式来匹配名词,动词或谓词,然后决定使用哪个生产。你是正确的解析语法需要下推自动机的计算能力(即比单独的正则表达式更多)。模拟下推自动机是一种方法,也是像yacc / bison这样的解析器生成器。对于这样的小语法,您可以隐式使用调用堆栈。