2017-01-10 10 views
-1

다음과 같은 yacc/bison 파일의 규칙 섹션 중괄호에 사용 된 언어와 이에 대한 좋은 참조가 무엇인지 궁금합니다. 이 $<stmt>$2를 작성하는 이유를 예를 들어 bison/yacc 파일에 사용 된 언어

stmts : stmt { $$ = new NBlock(); $$->statements.push_back($<stmt>1); } 
    | stmts stmt { $1->statements.push_back($<stmt>2); } 
    ; 

및 위의 코드에서

는 단지 $2

답변

1

실제로 사용자 지정 매크로 전처리와 C 코드입니다.

yacc/bison은 $$의 모든 발생을 규칙의 대상 구성 요소의 의미 값을 참조하는 C 코드로 대체하고 $ n을 규칙 요소 #n의 의미 값으로 대체합니다.

코드는 실제로 C (확장명은 C++)이며 $$ 및 $ n은 bison 자체로 대체되며 C 코드는 규칙 대상 또는 규칙 요소의 의미 값을 참조합니다.

See this chapter of bison's documentation 자세한 내용은

+0

나는이 참고 문헌을 읽을 것이다. 두 번째 부분에 대답 해 주시겠습니까? {$ 1-> statements.push_back ($ 2); } 및 {$ 1-> statements.push_back ($ 2); }. 내가 본 많은 코드에서 그들은 다르게 사용합니다. –

+1

이것은 필자가 제공 한 Bison의 문서에 자세히 설명되어 있습니다. 다른 웹 사이트의 내용을 stackoverflow.com에 복사하여 붙여 넣기 만해도 아무 것도 유용하지 않습니다. –

+0

"사용자 정의 매크로 프로세서"가 프로세스에 대한 최상의 설명이라고 확신하지 못합니다. Bison은 매크로 프로세서로'm4'를 사용합니다 (또는 아마도 템플릿 언어를 말하는 것이 낫습니다). 'm4'는 다소 표준적인 매크로 언어입니다. '$ '와'@'토큰을 적절한 매크로로 대체하는 것은 코드의 어휘 스캔 중에 수행된다.'scan-code.l'의'handle_action_dollar' 함수를 참조하십시오. 당신이 매크로 대체라고 부를 수 있다고 생각합니다.하지만 그것은 제게는 마치 필름처럼 보입니다. 어쨌든, upvoted. – rici