解析文本时在 DCG 中线程化状态/上下文

ste*_*ten 3 parsing state prolog dcg dcg-semicontext

如何在解析文本时传递状态(并在需要时更改它)!?

https://www.metalevel.at/prolog/dcg

这个例子正在计数..

不知道我应该如何通过初始状态。我是否必须将其作为调用参数或列表中的第一个元素来执行?每当我想使用状态时,我是否必须将状态(S)作为第一个目标?

======

假设我必须解析字符串“add item 5”。

如果状态是 "list" ,假设它应该打印 "5=>list"

如果“设置”则“5=>设置”

或者可能是更复杂的字符串“new list.add 5”...其中解析“new list”应设置 State=list,以便解析下一部分了解上下文,并且解释为“将 5 添加到列表” ” vs “添加 5 个到一组”。

不需要使用这些示例,我只是想弄清楚何时使用半上下文表示法以及如何将上下文作为第一个/顶部规则中的参数传递。

正如你所看到的,我很困惑,但这是我在互联网上能找到的唯一例子,序言文档一如既往地密集、简洁,而且不是很有帮助;(没有例子。


澄清 :

sent([X,Y],Ctx) -->  make(X,Ctx), add(Y,Ctx).
make(V,Ctx) --> [make,V], {say(">make ~w |ctx: ~w", [V,Ctx])}.
add(V,_Ctx) --> [add,V], {say(">add ~w", [V])}.
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我在每个级别传递上下文,即使我不在 add() 中使用它。我可以为 add() 删除它,但如果有子规则,我必须保留它。

我知道使用状态线程只需要在顶部规则中以及每当使用它时声明 Ctx

Cap*_*liC 5

DCG 是一种解析方法,因其与宿主语言(当然是 Prolog)的紧密且轻量级的集成而引起了一些兴趣。事实上,如此轻量级,以至于 DCG 子句中实际上没有任何特定于解析的内容,只有通过差异列表实现的(相当)有效的模式匹配。

如果使用 DCG 进行解析,则无法在不同子句之间线程化状态,因为差异列表用于匹配标记。

因此,请使用传统方式,在参数中手动传递状态,或切换到扩展 DCG - 例如 pack( edcg )。