我正在编写一个用于标记化的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。有什么帮助吗?
答案 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].
它只是简短的,我希望你发现它很有用,考虑添加子句来忽略空格。