2016-11-23 5 views
0

시작/끝 문자와 같은 문자도 허용하는 구문 분석기를 만드는 방법은 무엇입니까? 다음 예를 사용 :시작 부분과 끝 부분에있는 문자를 사용하는 파서를 만드는 방법은 무엇입니까?

'Isn't it hot' 

두 번째 작은 따옴표가 시작과 작은 따옴표 끝 사이에있는 내용의 한 부분으로 인정되어야한다. 나는이 같은 파서 만든 :

char("'").seq((word()|char("'")|whitespace()).plus()).seq(char("'")) 

을하지만 같은 실패

Failure[1:15]: "'" expected 

내가 사용하는 경우는 "어떤() | 숯불 (" ' ") 다음은 탐욕의 원인이 끝 따옴표를 소비 뿐만 아니라 오류.

은 내가 하나를 작성하려고했지만 탐욕 끝 마커를 소비하지 않는 파서를 만드는 방법을 알아낼 수 없습니다? 실제 문법 클래스를 만들어야합니다.

+0

이 문제에 대한 일반적인 해결책은 중간에 작은 따옴표를 인용해야한다는 것입니다. 예를 들어 C#의 축 어적 구문을 참조하십시오. https://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx –

답변

2

plus()은 욕심 많고 눈이 멀습니다. 즉, 반복은 가능한 한 많은 입력을 소모하지만 나중에 오는 것을 고려하지 않습니다. 귀하의 예제에서, 입력의 끝까지 모든 것이 소비되지만, 순서의 마지막 인용 부호는 더 이상 일치 할 수 없습니다.

대신 비 맹검 변화 plusGreedy(Parser)를 사용하여 문제를 해결할 수 있습니다 :

char("'") 
    .seq((word() | char("'") | whitespace()).plusGreedy(char("'"))) 
    .seq(char("'")); 

이것은 한 후 소비 할 수있는 char("'") 왼쪽이 여전히 존재로 입력을 소비한다.