我目前正在尝试使用SWI Prolog 设置一个小程序来接受DCGs中的IPv4点分四字符串(在假日期间离开舒适区?是的,我可以!)。这可能需要一个小时左右的时间,但也许读者的某个人已经准备好了。在这种情况下,我可以攻击IPv6 address strings。
答案 0 :(得分:2)
我将尝试在this snippet
上回答SWISH以下是代码,以防链接易变...
:- use_module(library(dcg/basics)).
atom_ipv4(A, IPV4) :- atom_codes(A, Cs), phrase(ipv4(IPV4), Cs).
ipv4(D) -->
dotted(D).
ipv4(range(D, R)) -->
dotted(D), "/", integer(R).
dotted(address(A, B, C, D)) -->
octet(A), ".", octet(B), ".", octet(C), ".", octet(D).
octet(A) --> integer(A), {A < 256}.
注意:规范肯定比此代码段捕获的规范更复杂,因为它允许十六进制,更多......我的目的是指出库的可用性(dcg / basics)
答案 1 :(得分:0)
回答#2:
% Is the atom 'X' a valid IPv4 address?
% Transform the atom 'X' into a list of character codes, which is then processed
is_ipv4(X) :- string_codes(X,Codes), phrase(ipv4, Codes).
% Testing the above
test :- is_ipv4('127.0.0.1'),
is_ipv4('255.255.255.255'),
is_ipv4('10.10.10.1'),
is_ipv4('0010.00010.000.0000'),
\+is_ipv4('256.0.0.1'),
\+is_ipv4('12.0.'),
\+is_ipv4('').
% ----------------------
% Use Definite Clause Grammer to parse a list of character codes
% Subelements can be queried like this:
% phrase(quadpart, `255`, []).
% phrase(pdigits(X,Y), `123`, []).
ipv4 --> quadpart, dot, quadpart, dot, quadpart, dot, quadpart.
dot --> `.`.
quadpart --> pdigits(_,Q), { Q < 256 }.
pdigits(UpPower,UpValue) --> pdigit(Value), !, pdigits(DownPower, DownValue), { UpValue is DownPower*Value+DownValue, UpPower is DownPower*10 }.
pdigits(1,0) --> [].
pdigit(Value) --> [D], { code_type(D, digit(Value)) }.
% ---------------------