2013-04-12 1 views
0

Je traversais cet exemple sur DCGAnalyser un entier dans une chaîne?

integer(I) --> 
     digit(D0), 
     digits(D), 
     { number_codes(I, [D0|D]) 
     }. 

digits([D|T]) --> 
     digit(D), !, 
     digits(T). 
digits([]) --> 
     []. 

digit(D) --> 
     [D], 
     { code_type(D, digit) 
     }. 

Mais cet exemple parse un entier que si elle est au début de la chaîne (car chiffres (D0) échoue est D0 est pas un numéro de code). Comment procéder pour analyser un entier n'importe où dans la chaîne, par ex. "abc123def"?

Répondre

1

Vous pouvez ajouter quelque chose comme ceci:

non_digits--> [D], {not(code_type(D, digit))}, !, non_digits. 
non_digits-->[]. 

, puis ajoutez un appel à non_digits sauter non chiffres, .: par exemple

integer_skip(I) --> 
     non_digits, 
     digit(D0), 
     digits(D), 
     { 
      number_codes(I, [D0|D]) 
     }, 
     non_digits. 
+0

Merci! C'est exactement ce que je viens de faire! non_digit -> [C], {not (code_type (C, chiffre))}, non_digit. non_digit ->! Je pense que c'est la même chose. – ivt

Questions connexes