아래 문법 스 니펫에서 $<nVal>4
을 명시 적으로 사용해야하는 이유는 무엇입니까?들소 문법 % 유형 및 % 토큰
나는 %type <nVal> expr
라인이 필요하지 않으므로 간단하게 $4
을 넣을 수 있다고 생각 했습니까?
내가 할 수 있도록 expr
에 대해 다른 정의를 사용할 수 있습니까?
%union
{
int nVal;
char *pszVal;
}
%token <nVal> tkNUMBER
%token <pszVal> tkIDENT
%type <nVal> expr
%%
for_statement : tkFOR
tkIDENT { printf("I:%s\n", $2); }
tkEQUALS
expr { printf("A:%d\n", $<nVal>4); } // Why not just $4?
tkTO
expr { printf("B:%d\n", $<nVal>6); } // Why not just $6?
step-statement
list
next-statement;
expr : tkNUMBER { $$ = $1; }
;
업데이트 RICI의 답변을 다음과 같습니다. 이유는 아래의 문법 코드에서 명시 적으로 $<nVal>4
를 사용할 필요가
for_statement : tkFOR
tkIDENT { printf("I:%s\n", $2); }
tkEQUALS
expr { printf("A:%d\n", $5 /* $<nVal>5 */); }
tkTO
expr { printf("A:%d\n", $8 /* $<nVal>8 */); }
step-statement
list
next-statement;
감사합니다. - 당신은 완전히 맞습니다. – SparkyNZ
나는 그것을 얻는다. "중간 규칙 동작"은 끝 부분에 나타나는 것이 아니라 규칙의 중간에 나타나는 중괄호 "얼룩"이다. 그래서 내가 마지막에 하나의 규칙을 가졌다면, 원래의 모든 번호가 작동했을 것입니다. 중간 룰 액션을 사용하여 번호 매기기에 중간 규칙 모양을 포함시켜야합니다. – SparkyNZ