首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dcg解析stdin

用dcg解析stdin
EN

Stack Overflow用户
提问于 2020-04-04 09:22:28
回答 1查看 125关注 0票数 1

我很难理解如何使用DCG将一些文本从stdin解析到所需的变量。

玩家: player1 & player2 董事会:3次调动 1A : player1 5D : player2 8Z : player1

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

我该如何使用DCG来完成这个任务呢?

我尝试了以下几点:

代码语言:javascript
复制
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.   

但是,这在中是行不通的,我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 15:41:30

我会使用库(dcg/基础),它提供了一些相对较低的实用程序。它可以与库(订单)耦合,以进一步增强解析器。

代码语言:javascript
复制
:- 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).

要测试语法,可以直接调用非终端。注意,语法接受更多的玩家,并以灵活的方式正确地跳过空格。

代码语言:javascript
复制
?- phrase(players(Ps),`Players: player1 & player2&  player3`).
Ps = [player1, player2, player3] ;
false.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61026071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档