如何逐个元素地分离元素?

时间:2016-03-12 15:59:23

标签: prolog ascii

我正在编写一个用于标记化的Prolog程序。目前,我能够获得ASCII代码列表,但我不知道如何将它们标记为返回令牌列表。

例如,如果我有:

[105,110,116,32,105,110,116,32,97,32,13,10,105,110,116,32],

我如何获得:[int,int,a,int]

我知道关键是按'32'读取列表并在32之前分隔所有内容并将[105,110,116]附加到'int',我是新的列表所以我不熟悉Prolog。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

关于DCG的基本知识在这里很有用。假设您使用read_lines_to_codes/2获取ascii代码,例如read_lines_to_code(user_input,X).,因此您输入{}即可重新X = [123, 125].,因此DCG定义为

lekserr(Tokens) -->
(   ( "{", !, {Token = tkLbrabce }
    ;    "}", !, {Token =  tkRBrace}
    ;    "int", !, {Token = tkInt}
    ),
    !,
    {Tokens = [Token| TokList]},
    lekserr(TokList)
;   [],
    {Tokens = []}
).

当你做

read_line_to_codes(user_input,X), phrase(lekserr(Y),X).
|    int
X = [105, 110, 116],
Y = [tkInt].

它只是简短的,我希望你发现它很有用,考虑添加子句来忽略空格。