내가 만든 마크 업 언어에 대한 파서를 작성하고 있습니다 (파이썬으로 작성하지만 실제로는이 질문과 관련이 없습니다. 사실 이것이 나쁜 생각처럼 보인다면 더 나은 길에 대한 제안을 좋아합니다) .
파서에 대해 읽고 있습니다 : http://www.ferg.org/parsing/index.html , 나는 lexer를 작성하고 있는데, 올바르게 이해하면 내용을 토큰으로 분할해야합니다. 내가 이해하는 데 어려움이있는 것은 사용해야하는 토큰 유형 또는 생성 방법입니다. 예를 들어, 내가 연결 한 예제의 토큰 유형은 다음과 같습니다.
- 끈
- 식별자
- 번호
- 화이트 스페이스
- 논평
- EOF
- {및 (와 같은 많은 기호는 자체 토큰 유형으로 계산
내가 겪고있는 문제는보다 일반적인 토큰 유형이 약간 임의적 인 것입니다. 예를 들어 왜 독자적인 토큰 유형과 IDENTIFIER를 STRING하고 있습니까? 문자열은 STRING_START + (IDENTIFIER | WHITESPACE) + STRING_START로 표시 될 수 있습니다.
이것은 또한 언어의 어려움과 관련이있을 수 있습니다. 예를 들어, 변수 선언은로 작성 {var-name var value}
되고 배포됩니다 {var-name}
. 그것은 것 같습니다 '{'
과 '}'
자신의 토큰을해야하지만, var_name 반 및 VAR_VALUE 자격이 토큰 유형은, 또는 IDENTIFIER에서 이러한 것 모두 가을? 또한 VAR_VALUE에는 실제로 공백이 포함될 수 있습니다. 이후 공백 var-name
은 선언에서 값의 시작을 나타내는 데 사용됩니다. 다른 공백은 값의 일부입니다. 이 공백이 자체 토큰이됩니까? 공백은이 문맥에서만 의미가 있습니다. 또한 {
변수 선언의 시작이 아닐 수도 있습니다. 문맥에 따라 다릅니다 (다시 그 단어가 있습니다!). {:
이름 선언을 시작하고{
어떤 가치의 일부로도 사용될 수 있습니다.
내 언어는 들여 쓰기로 블록이 만들어 졌다는 점에서 파이썬과 비슷합니다. 파이썬은 들여 쓰기 (무엇으로 어느 정도 역할을 DEDENT 토큰을 생성하는 렉서 사용하는 방법에 대해 읽고 있었다 {
및 }
다른 언어을 많이 할 것을). 파이썬은 컨텍스트가 없다고 주장합니다. 즉, 적어도 어휘 분석기는 토큰을 만드는 동안 스트림의 어디에 있는지 신경 쓰지 않아야한다는 것을 의미합니다. 파이썬의 어휘 분석기는 어떻게 이전 문자에 대해 알지 못하고 특정 길이의 INDENT 토큰을 만들고 있다는 것을 어떻게 알 수 있습니까? 나도 이것을 알아야하기 때문에 묻습니다.
마지막 질문은 어리석은 질문입니다. 왜 어휘 분석기가 필요한가? 파서는 문자별로 이동하여 위치와 예상 위치를 파악할 수 있습니다. 어휘 분석기는 단순성의 이점을 추가합니까?