2017-11-09 11 views
0

I과 유사한 YAML 구문의 제한된 집합에 대한 파서를 구축을 위해 노력하고 ANTLR 4.7 사용하여 아래에 표시되는 내용 : 나는 문법이Antlr4 처리가

name: 
    last: Smith 
    first: John 
    address: 
    street: 123 Main St 
      Suite 100 
    city: Boston 
    state: MA 
    zip: 12345 

을 (에서 파생 된 파이썬 3 문법)은 "값"문자열 주위에 따옴표를 넣었을 때 제대로 작동하지만 제거하면 실패합니다. 새 블록의 다음 "태그 :"부분 또는 새 assign 문의 "tag :"부분이 트릭이되기 전에 "value"문자열을 정의하여 일치가 종료되는 것 같습니다.

누구든지이 사용 사례를 처리 할 아이디어 나 작업 샘플이 있습니까?

답변

0

평범한 스칼라의 일치를 종료해야하는 비어 있지 않은 행의 들여 쓰기입니다. 해당 들여 쓰기가 현재 매핑의 들여 쓰기보다 크지 않으면 스칼라가 끝납니다. 예를 들어

: 그것은 (위의 mapping: 즉, 값)의 현재 매핑 더 들여 쓰기되어 있지 않기 때문에 여기

mapping: 
    key: value with 
     multiple lines 
    key2: 
    other value 

상기 value with multiple lineskey2:있는 라인에서 종료한다. 물론, 마지막 개행 문자와 들여 쓰기가 key2: 인 것은 스칼라 내용의 일부가 아닙니다. 당신의 스칼라가

plain-scalar-part (s-indent(3) s-white* plain-scalar-part)* 
같은 것을 일치 될 수 있도록 YAML 사양에서

이, 이것은 생산 우리의 경우 이제

s-indent(n) ::= s-space × n 

에 의해 처리되고, 내부 매핑, n=2의 들여 쓰기를 가지고

(Antlr 구문을 모르겠다. 모든 터미널이 아닌 것으로 가정한다.) (아마도 비어있는) 첫 번째 줄 다음에 부모 매핑보다 많은 들여 쓰기 (이 경우 3 개의 공백)가 일치하면 더 많은 공백 (내용의 일부가 아닌)이있을 수 있습니다. 그러면 더 많은 내용이 이어집니다 . 간단히하기 위해 가능한 빈 줄을 무시했습니다.

들여 쓰기가 너무 적어서 스칼라 일치가 종료되는 방식이므로 일치하지 않습니다. key2:.

이제는 Antlr에서 s-indent(n)과 같은 작업을 수행하는 방법을 모르지만 Python 문법은 올바른 포인터를 제공해야합니다.