2017-02-08 16 views
0

나는 domainlabeltoplabel 아무 문제가 없습니다 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를 표현할 수있는 방법이 있습니까? 방금 유효성을 검사해야하는 경우

답변

1

, 당신이 이런 식으로 작업을 수행 할 수 있습니다 자신의 첫 번째 문자로 구별

/* Unchanged */ 
toplabel  = alpha | alpha *(alphanum | "-") alphanum 
/* Diff with above */ 
nontoplabel = digit | digit *(alphanum | "-") alphanum 
/* Rephrase */ 
hostname  = 1*(*(nontoplabel ".") toplabel) [ "." ] 

nontoplabel 이후와 toplabel, 마지막 표현에는 가능한 모호성이 없습니다.

변환이 많은 가능한 정규식 아이덴티티 중 하나 :

(a | b)* a ==> (b* a)+ 

넌 항상 b-a (차 집합 연산자 - 사용)에 a|bb를 대체 할 수있다.

+0

'a | b'를 다시 쓸 때 마지막 점에 관심이 있습니다. 참조 할 수 있니? – Seki

+0

@seki :'|'는 두 세트의 합집합이므로 단순한 세트 이론입니다. 집합에 중복 요소가 없으므로 A와 B의 합집합을 계산할 때 A에 들어 있기 때문에 B에 이미 포함 된 요소를 B에서 제거 할 수 있습니다. – rici

+0

설명 주셔서 감사합니다 :) – Seki