2015-01-27 5 views
1

잘 모르겠습니다. Go, 나는 방금 다양한 언어 구문을 공부하고 있습니다.Go lexer에서 문장의 끝 부분이 어떻게 감지됩니까?

From Go 자주 묻는 질문 : "Go는 BCPL의 속임수를 사용합니다 : 분리 된 문장은 공식 문법에 있지만 세미콜론은 미리보기없이 자동으로 삽입됩니다. 줄 끝 부분의 렉서가 자동으로 삽입합니다. 성명서. "

나는 그것이 어떻게되는지 궁금하다. 나는 lex.go을 보았지만, 충분히 잘 모르지만 (실제로는 거의 안된다.) "statement"나 "semicolon"에 대한 참조를 찾지 못했다.

그렇다면 사전 검토없이 올바른 구문의 렉서 단계 끝에서 어떻게 감지 할 수 있습니까?

답변

5

당신은 언어 사양에서 볼 수 :

공식 문법 세미콜론을 사용합니다 ";" 수많은 작품에서 터미네이터로 사용됩니다. 프로그램은 다음과 같은 두 가지 규칙을 사용하여이 세미콜론의 대부분을 생략 할 수 있습니다 이동 입력이 토큰으로 깨진 경우

는, 세미콜론이 자동으로 공백이 아닌 줄의 끝에서 토큰 스트림에 삽입 인을 라인의 경우 최종 토큰이

  • 식별자
  • 정수, 위해 fallthrough, 상상, 룬, 또는 계속 깰 키워드
  • 한 리터럴 문자열 부동 소수점, 또는
  • 을 반환 0
  • 운영자와 분리 ++의 일 -)] 또는}

복잡한 문장은 단일 행을 점유 할 수 있도록하려면 세미콜론 폐쇄 ")"또는 "전 생략 수도 } ".

http://golang.org/ref/spec#Semicolons

2

이동 파서는 이동 문법에 따라 문장 구조 (예를 들어, 문장, 표현)를 인식합니다. 파서는 스캐너 (어휘 분석기)에서 생성 된 토큰을 사용합니다.

세미콜론이 스캐너에 의해 토큰 스트림에 자동 삽입되므로 파서에 대한 추가 작업 부하가 없습니다. Go 스캐너에서 세미콜론 삽입 코드는 here입니다.

Go 언어 사양은 스캐너가 세미콜론을 다음과 같이 삽입하는 방법을 정의합니다.

Semicolons

공식 문법 세미콜론을 사용합니다 ";" 수많은 작품에서 터미네이터로 사용됩니다.프로그램은 다음 두 가지 규칙을 사용하여이 세미콜론의 대부분을 생략 할 수 있습니다 이동

입력이 토큰으로 손상된 경우 세미콜론은 자동으로 경우 공백이 아닌 줄의 끝에서 토큰 스트림에 삽입
  1. 라인의 마지막 토큰이

    • 식별자
    • 정수, 가상, 룬, 또는 계속 깰 키워드
    • 한 리터럴 문자열, 부동 소수점 위해 fallthrough, 또는 retur N
    • 운영자와 분리 ++의 일 -)] 또는}
  2. 복잡한 문장은 단일 행을 점유 할 수 있도록하려면, 세미콜론 ")는"폐쇄 전에 생략 될 수도 또는 "}".