68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | :- object(url). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	:- info([ | ||
|  | 		version is 1.0, | ||
|  | 		date is 2003/7/7, | ||
|  | 		author is 'Paulo Moura', | ||
|  | 		comment is 'Simple example of URL parsing.']). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	:- public(parse/2). | ||
|  | 
 | ||
|  | 	:- mode(parse(@list, -list), zero_or_one). | ||
|  | 
 | ||
|  | 	:- info(parse/2, [ | ||
|  | 		comment is 'Parses a URL into its components.', | ||
|  | 		argnames is ['URL', 'Components']]). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	parse(URL, [protocol(Protocol), address(Address), path(Path), file(File)]) :- | ||
|  | 		phrase(url(Protocol, Address, Path, File), URL). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	url(Protocol, Address, Path, File) --> protocol(Protocol), "://", address(Address), path(Path), file(File). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	protocol(ftp) --> "ftp". | ||
|  | 	protocol(http) --> "http". | ||
|  | 	protocol(https) --> "https". | ||
|  | 	protocol(rtsp) --> "rtsp". | ||
|  | 
 | ||
|  | 
 | ||
|  | 	address(Address) --> ip_number(Address). | ||
|  | 	address([Identifier| Identifiers]) --> identifier(Identifier), dot_identifiers(Identifiers). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	ip_number([N1, N2, N3, N4]) --> ip_subnumber(N1), ".", ip_subnumber(N2), ".", ip_subnumber(N3), ".", ip_subnumber(N4). | ||
|  | 
 | ||
|  | 	ip_subnumber(N) --> [N1, N2, N3], {N is N3 - 0'0 + 10*(N2 - 0'0) + 100*(N1 - 0'0), N >= 0, N =< 255}. | ||
|  | 	ip_subnumber(N) --> [N1, N2], {N is N2 - 0'0 + 10*(N1 - 0'0), N >= 0, N =< 255}. | ||
|  | 	ip_subnumber(N) --> [N1], {N is N1 - 0'0, N >= 0, N =< 255}. | ||
|  | 
 | ||
|  | 
 | ||
|  | 	identifier(Identifier) --> characters(Codes), {atom_codes(Identifier, Codes)}. | ||
|  | 
 | ||
|  | 
 | ||
|  | 	characters([]) --> []. | ||
|  | 	characters([Code| Codes]) --> [Code], {character(Code)}, characters(Codes). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	character(Code) :- Code @>= 0'a, Code @=< 0'z, !. | ||
|  | 	character(Code) :- Code @>= 0'A, Code @=< 0'Z. | ||
|  | 
 | ||
|  | 
 | ||
|  | 	dot_identifiers([]) --> []. | ||
|  | 	dot_identifiers([Identifier| Identifiers]) --> ".", identifier(Identifier), dot_identifiers(Identifiers). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	path([]) --> []. | ||
|  | 	path([Identifier| Path]) --> "/", identifier(Identifier), path(Path). | ||
|  | 
 | ||
|  | 
 | ||
|  | 	file('') --> []. | ||
|  | 	file(File) --> "/", identifier(Name), ".", identifier(Extension), {atom_concat(Name, '.', Aux), atom_concat(Aux, Extension, File)}. | ||
|  | 
 | ||
|  | 
 | ||
|  | :- end_object. |