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