필자는 (대략적으로) 재귀 적 파서 (예 : 스칼라의 파서 연결자)가 작동하는 방식을 이해한다고 생각합니다. 한 파서로 입력 문자열을 구문 분석하고 파서가 전체 입력의 각 "부분"에 대해 다른 작은 파서를 호출합니다. 입력 문자열의 조각으로부터 직접 AST를 생성하는 저수준 파서에 도달 할 때까지재귀 하강 대 Lex/파스?
또한 Lexing/Parsing 작동 방식을 이해할 수 있다고 생각합니다. 먼저 전체 입력을 플랫 목록으로 분리하는 렉서를 실행합니다. 토큰을 가져 와서 구문 분석기를 실행하여 토큰 목록을 가져와 AST를 생성합니다.
그러나 Lex/Parse 전략이 정확하게 토큰 화하는 방법이 이전에 토큰 화 된 토큰에 따라 어떻게 달라지는 지 이해할 수 없습니다. 나는 XML의 덩어리를 가지고 예를 들어, :
"<tag attr='moo' omg='wtf'>attr='moo' omg='wtf'</tag>"
재귀 하강 파서가 이것을 가지고 그것을 파괴 할 수
"<tag attr='moo' omg='wtf'>attr='moo' omg='wtf'</tag>"
-> "<tag attr='moo' omg='wtf'>"
-> "<tag"
-> "attr='moo'"
-> "attr"
-> "="
-> "moo"
-> "omg='wtf'"
-> "omg"
-> "="
-> "wtf"
-> ">"
-> "attr='moo' omg='wtf'"
-> "</tag>"
그리고 (이후의 각 들여 쓰기는 상위 문자열의 분해를 나타냄) <tag
, attr="moo"
등을 개별적으로 구문 분석하는 작은 파서는 XML 태그의 표현을 구성하고 속성을 추가합니다.
그러나 단일 단계 Lex/Parse는 어떻게 작동합니까? Lexer는 <tag
이후의 문자열과 >
이전의 문자열을 별도의 속성으로 토큰 화해야하며 >
과 </tag>
사이의 문자열은 반드시 필요하지 않음을 어떻게 알 수 있습니까? 파서가 첫 번째 문자열이 태그 본문 내에 있고 두 번째 사례가 태그 본문 밖에 있다고 말할 필요는 없을까요?
EDIT : 그것은 명확
lexer는 'LEFTANGLE IDENT = tag IDENT = attr EQ STRING = moo IDENT = omg' 등을 생성합니다. –
@ SK-logic : 명확한 질문을 편집했습니다. 태그 몸체의 외부에 'attr ='moo''이 있으면 혼란 스럽습니다. 렉서가 어떻게 IDENT = 태그로 분해해서 하나의 빅 텍스트 노드로 토큰화할 수 있는지 어떻게 알 수 있습니까? –
좋아, 알 겠어. 렉서가있는 하나의 큰 문자열로 그 물건을 토큰 화하지 않을 것이다. 물론 문자열을 해체해야한다. 물론 모든 공백을 잃어 버릴 것이다. –