나는 domainlabel
과 toplabel
아무 문제가 없습니다 RFC 2396RFC 2396 (URI에 관한)의 문법을 어떻게 PEG로 표현할 수 있습니까?
hostname = *(domainlabel ".") toplabel [ "." ]
domainlabel = alphanum | alphanum *(alphanum | "-") alphanum
toplabel = alpha | alpha *(alphanum | "-") alphanum
의 다음 BNF에 따라 호스트 이름을 분석 할 것 PEG 문법을 마련하려합니다.
그러나 hostname
에 대한 규칙은 PEG에서 표현 될 수없는 것처럼 보입니다. 여기
내가 그렇게 생각하는 이유입니다 :
우리가 toplabel [ "." ]
가 구별 때문에 중지 할 때 모르는 모든 입력이 *(domainlabel ".")
에 의해 소비되는 BNF에 작성된 문법을 가지고가는 경우에
단순화 자체에 포함 된 그림 :
h = (d '.')* t '.'?
d = [dt]
t = [t]
이 구문 분석 t
, d.d.t
완전히 예상된다 d.d.d
에 실패하지만 t.
모두 유효한 경우입니다 d.d.t.
을 구문 분석하는 데 실패합니다.
미리보기를 추가하면 t.
과 d.d.t.
을 소비하지만 d.t.t.
은 실패합니다.
h = (!(t '.'?)d '.')* t '.'?
d = [dt]
t = [t]
그래서 아이디어가 없습니다. PEG에서이 BNF를 표현할 수있는 방법이 있습니까? 방금 유효성을 검사해야하는 경우
'a | b'를 다시 쓸 때 마지막 점에 관심이 있습니다. 참조 할 수 있니? – Seki
@seki :'|'는 두 세트의 합집합이므로 단순한 세트 이론입니다. 집합에 중복 요소가 없으므로 A와 B의 합집합을 계산할 때 A에 들어 있기 때문에 B에 이미 포함 된 요소를 B에서 제거 할 수 있습니다. – rici
설명 주셔서 감사합니다 :) – Seki