에 지정된 순간에, 내 선돌 문법은 정확히 규칙을 따른다. 표준 Go 파서가 LALR (1)이라는 사실은 그것을 증명합니다.
은 더 많은 변수가있는 변수의 유형 또는 이름의 이름입니까?
기본적으로 문법과 파서는 전체적으로 기호 테이블에서 완전히 분리되어야합니다. do not C – 문법이 모호하지 않으므로 나중에 AST에서 유형 이름을 확인할 수 있습니다.
다음은 관련 규칙입니다 (http://golang.org/ref/spec). 그들은 이미 맞습니다.
Parameters = "(" [ ParameterList [ "," ] ] ")" .
ParameterList = ParameterDecl { "," ParameterDecl } .
ParameterDecl = [ IdentifierList ] [ "..." ] Type .
IdentifierList = identifier { "," identifier } .
내가 당신에게 설명 할 것이다 :
IdentifierList = identifier { "," identifier } .
중괄호은 (는 별표의 POSIX 정규 표현식 표기)를 kleene 폐쇄를 나타냅니다.
ParameterDecl = [ IdentifierList ] [ "..." ] Type .
대괄호
이 널 (NULL)입니다,이 규칙은 "광고 인해서 식별자 이름은 임의로 리터럴 쉼표와 식별자 등 중 & hellip 다음, 리터럴 쉼표와 식별자 다음에"라는; 이는 해당 부분이 존재할 수도 있고 존재하지 않을 수도 있음을 의미합니다. (POSIX 정규식 표기법에서 이것은 의문의 대상이다). 그래서 당신은 "이 어쩌면 유형 다음에 아마 생략 부호 다음에 여기서 identifierList,.
ParameterList = ParameterDecl { "," ParameterDecl } .
당신은 예를 들어 func x(a, b int, c, d string)
같은 목록에 여러 ParameterDecl 수 있습니다.
Parameters = "(" [ ParameterList [ "," ] ] ")" .
이 규칙은 것을 정의 parameterList에 선택적 괄호로 묶어야하는 것입니다 그리고 당신은 같은 것을 쓸 때, 문자 그대로의 유용한 옵션 최종 쉼표를 포함 할 수있다 :
func x(
a, b int,
c, d string, // <- note the final comma
)
의 이동 미국 서부 및 서남부에서 자라는 목초를 r은 휴대용이며 lookahead 토큰 하나를 사용하여 상향식 파서로 구문 분석 할 수 있습니다.
은 관련 편집 "C를하지 말라":이 C is context-sensitive 길 때문에 많은 (? 모두) 컴파일러에서이 문제를 렉서 및 렉싱에 심볼 테이블을 연결하여되고 해결했다 토큰은 형식 이름이나 변수로 정의되는지 여부에 따라 다르게 적용됩니다. 이것은 해킹이며 모호하지 않은 문법을 위해 수행되어서는 안됩니다!
문법은 어떻게 생겼습니까? – thwd
@tomwilde : 적절한 정보로 게시물을 편집했습니다. 코드는 스펙과 동일한 구조를 따릅니다. – gnuvince
가장 간단한 방법은 사전 형식 토큰으로 공백을 (쉼표없이) 처리하는 것입니다. 공백 다음의 토큰 (및 쉼표없이 하나의 공백 만있을 수 있음)이 유형이어야합니다. 공간 앞의 토큰이 현재 범위의 모든 유형 또는 내장 유형과 일치하지 않으면 이름이 지정된 변수 여야합니다. 이것은 아마도 지나치게 순진 할 것입니다. – Intermernet