2017-03-08 14 views
1

peg.js를 사용하여 파서를 작성하는 방법을 배우고 있으며 고유 한 문제가 발생했습니다. 나는 ;을 구분 기호로 사용하여 키 값 쌍의 문자열을 범주화합니다.Peg.js 파서의 구분 기호를 구문 분석 할 수 없습니다.

: 구문 분석 할 문자열이 name=prabesh;city=Bangalore 인 경우. 파서는 현재 name을 키로 사용하고 prabesh을 값으로 사용하고 city을 키로 사용하고 bangalore을 값으로 사용합니다.

구분 기호가 문자열의 일부인 경우 질문은 무엇입니까? city=bangalore;address=#12/1;santacruz

어떻게 당신이 그것을 구문 분석 할 수 있습니다 : 예를 들어

?

접근 : 연속 ;에 대한 첫 = 검색에서 연속 ;의 즉 검색 한 후 값으로 = 마지막 ; 사이에있는 텍스트를 고려한다.

이 방법의 문제점은 값 자체에 =이 있으면 올바르게 파싱하지 못한다는 것입니다.

예를 들어,이 실패 token=crbz23;4=134;

어떤 제안?

답변

1

PEG 문법을 사용하면 일치하지 않으려는 항목에 대해 구체적으로 설명해야합니다. 예를 들어, 에 대한 미리보기를 원하지 않으면 세미콜론이 발생할 경우이 새 키와 일치하지 않게하십시오. 이 문제를 푸는 일반적인 PEG 관용구는 다음과 같습니다 : (!(id) .)+.

start = 
    exp+ 

exp = 
    key '=' val ';'? 

key = 
    $([a-z]+) 

val = 
    $((!(';' key '=') .)+) 

입력 :

city=bangalore;address=#12/1;santacruz 

출력 :

[ 
    [ 
     "city", 
     "=", 
     "bangalore", 
     ";" 
    ], 
    [ 
     "address", 
     "=", 
     "#12/1;santacruz", 
     null 
    ] 
] 
다음 입력을 사용하여 예제