SWI Prolog标记化\u atom/2替换?

SWI Prolog标记化\u atom/2替换?,prolog,tokenize,dcg,Prolog,Tokenize,Dcg,我需要做的是把原子分解成记号。例如: tokenize_string('Hello, World!', L). 将统一L=['Hello'、'、'World'、'!']。正如标记化原子/2所做的那样。但当我尝试将标记化_atom/2与非拉丁字母一起使用时,它失败了。有没有通用的替代品,或者我如何编写?提前谢谢。好吧,你可以自己写词法。例如,我可以向您展示我的算术表达式解析器中的lexer :- use_module(library(http/dcg_basics)). % % lexer %

我需要做的是把原子分解成记号。例如:

tokenize_string('Hello, World!', L).

将统一
L=['Hello'、'、'World'、'!']
。正如
标记化原子/2
所做的那样。但当我尝试将
标记化_atom/2
与非拉丁字母一起使用时,它失败了。有没有通用的替代品,或者我如何编写?提前谢谢。

好吧,你可以自己写词法。例如,我可以向您展示我的算术表达式解析器中的lexer

:- use_module(library(http/dcg_basics)).

%
% lexer
%

lex([H | T]) -->
    lexem_t(H), !,
    lex(T).

lex([]) -->
    [].

lexem_t(L) --> trashes, lexem(L), trashes.

trashes --> trash, !, trashes.
trashes --> [].

trash --> comment_marker(End), !, string(_), End.
trash --> white.

comment_marker("*)") --> "(*".
comment_marker("*/") --> "/*".

hex_start --> "0X".
hex_start --> "0x".

lexem(open) --> "(".
lexem(close) --> ")".
lexem(+) --> "+".
lexem(-) --> "-".
lexem(*) --> "*".
lexem(/) --> "/".
lexem(^) --> "^".
lexem(,) --> ",".
lexem(!) --> "!".

lexem(N) --> hex_start, !, xinteger(N). % this handles hex numbers
lexem(N) --> number(N). % this handles integers/floats
lexem(var(A)) --> identifier_c(L), {string_to_atom(L, A)}.

identifier_c([H | T]) --> alpha(H), !, many_alnum(T).

alpha(H) --> [H], {code_type(H, alpha)}.
alnum(H) --> [H], {code_type(H, alnum)}.

many_alnum([H | T]) --> alnum(H), !, many_alnum(T).
many_alnum([]) --> [].
工作原理:

 ?- phrase(lex(L), "abc 123 привет 123.4e5 !+- 0xabc,,,"), write(L).
[var(abc), 123, var(привет), 1.234e+007, !, +, -, 2748, (,), (,), (,)]

经过一些修改,这正是我所需要的。谢谢!:)您正在逐字读取列表,是否有任何方法可以将字符串(作为列表元素之一)abc与lexem(“word”)-->“abc”进行比较。