2010-03-27 7 views
1

Ce que je dois faire est de casser l'atome en jetons. E. g .:SWI-Prolog tokenize_atom/2 remplacement?

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

unifierait L=['Hello',',','World','!']. Exactement comme tokenize_atom/2 faire. Mais quand j'essaie d'utiliser tokenize_atom/2 avec des lettres non latines, cela échoue. Y at-il un remplacement universel ou comment je peux en écrire un? Merci d'avance.

Répondre

3

Eh bien, vous pourriez écrire votre propre lexer. Par exemple, je peux vous montrer un lexer de mon analyseur d'expressions arithmétiques.

:- 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([]) --> []. 

Comment ça marche:

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

Avec quelques modifications ce exactement ce que je avais besoin. Je vous remercie! :) – Shark

+0

Vous lisez la liste caractère par caractère, est-il possible de comparer une chaîne (comme l'un des éléments de la liste) abc avec lexem ("mot") -> "abc". –