【问题标题】:parsing stdin with dcg用 dcg 解析标准输入
【发布时间】:2020-04-04 09:22:28
【问题描述】:

我在理解如何使用 DCG 将一些文本从标准输入解析为所需变量时遇到了一些困难。

玩家:player1 & player2

棋盘:3 步

1A:播放器1
5D:播放器2
8Z:播放器1

所以一个游戏有两个玩家变量名,然后是每个玩家的一些动作,我希望有一个统一的谓词Players = [player1,player2] , turn1 = [1A,8A] , turn2 = [5D].

我将如何使用 DCG 做到这一点?

我尝试了以下方法:

main :-
    read_string(user_input,"\n","\r",_,FirstLine),
    phrase(readPlayers(Players),FirstLine),
    write(Players).

parsePlayers --> [Players].
parseColon --> [:].
parseSpace --> [ ].
readPlayers([P1,P2]) --> parsePlayers,parseColon,parseSpace,P1,parseSpace,[&], parseSpace,P2.   

但是这在 SWI-Prolog 中不起作用,我该如何实现呢?

【问题讨论】:

  • ":" 代替[:]。同样" " 代替[ ],这与[] 相同。还有parsePlayers 到底是什么意思?至少你在这里得到了警告。

标签: prolog swi-prolog dcg


【解决方案1】:

我会使用库(dcg/basics),它提供了一些相对较低级别的实用程序。它可以与库(dcg/high_order)结合使用,以进一步增强您的解析器。

:- use_module(library(dcg/basics)).
:- use_module(library(dcg/high_order)).

player(P) -->
    code(csymf,C),
    codes(csym,Cs),
    {atom_codes(P,[C|Cs])}.

players(Ps) -->
    "Players",
    sep(":"),
    sequence(player,sep("&"),Ps),
    blanks.

% my utilities
sep(S) --> whites, S, whites.
code(T,C) --> [C], {code_type(C,T)}.
codes(T,Cs) --> sequence(code(T),Cs).

要测试语法,您可以直接调用非终结符。请注意,语法接受超过 2 个玩家并以灵活的方式正确跳过空格。

?- phrase(players(Ps),`Players: player1 & player2&  player3`).
Ps = [player1, player2, player3] ;
false.

【讨论】:

  • 请不要在源文件中使用顶级解释器快捷方式。在这种特殊情况下,更喜欢 use_module/1 指令。
  • @PauloMoura:感谢您的关注。将编辑答案。
  • 谢谢。让我们共同推动更好的编码指南。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多