내 렉스 파일이 있습니다추가 오른쪽 중괄호는
word [^{}"=,\t\[email protected]\\ ]+
\{ {
return(LBRACE);
}
\} {
return(RBRACE);
}
{word} {
yylval = yytext; printf("WORD=%s",yytext); return(WORD);
}
내 Yacc에 파일이 있습니다 입력에
phrase: LBRACE WORD RBRACE {printf("LBRACE %s RBRACE\n",$2);};
:
{FooBar}
를 내가 얻을 :
WORD=FooBar
LBRACE FooBar} RBRACE
나는 내가 단지 $ 2 인쇄하고있어 비록 여분의 오른쪽 중괄호을 받고 있어요 왜 확실 해요 어떤해야
답변 해 주셔서 감사합니다! 나는 당신이 글로벌 변수 yyleng을 의미한다고 생각 하죠, 그렇죠? 또한,'strncpy'가'yyleng + 1' 문자를 넘겨서 종료 null을 얻지 않아야합니까? 'strndup'가 사용되면 자체적으로 종료 null을 추가합니다. –
@crypto : 그렇습니다. 나는 lex가 제공 한 글로벌 yylen을 의미합니다. 반환 된 기본 메모리가 null 인 것을 보장하는 calloc()을 사용하기 때문에 strncpy가 yylen +1을 복사 할 필요가 없습니다. 따라서 strncpy가 '\ 0'을 추가하는 것처럼 '\ 0'을 추가할지 여부는 중요하지 않습니다. –