2014-06-25 3 views
0

일부 추가 문자 가져옵니다렉스 정규식은 내 렉스 파일에 다음과 같은 정의가

L [a-zA-Z_]           
A [a-zA-Z_0-9] 
%% 
{L}{A}*     { yylval.id = yytext; return IDENTIFIER; } 

을 그리고 난 내 YACC 파일에서 다음을 수행하십시오

primary_expression 
    : IDENTIFIER   { puts("IDENTIFIER: "); printf("%s", $1); } 

내 소스 코드 (하나 명의 I printf("%s", $1); 부분 인쇄가 있음 어떤 이유로

ab= 10; 

'm 분석)은 다음과 같은 과제를 갖고 ab=뿐만 아니라 ab.

나는 을 삭제할 때 식별자가 전혀 인쇄되지 않기 때문에 ab=을 인쇄하는 섹션이라고 확신합니다.

나는 정말 아이디어가 부족했다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

더 명확히 할 수 있는지 알려주세요.

답변

3

내가 뭘 잘못하고 있니?

yytext이 가리키는 문자열이 일정하다고 가정하고 있습니다. 그렇지 않습니다.

yytext이 가리키는 문자열의 유효 기간은 관련 규칙의 어휘 동작입니다. 해당 규칙이 끝나면 yytext은 다음 번에 yylex이 호출 될 때까지 생존합니다. 그리고 그게 다야.

bison 생성 된 파서에는 1 기호 미리보기가 있습니다. 따라서 구문 분석기가 의미 론적 동작을 수행 할 때까지 yylex이 다시 호출됩니다 (미리보기 용). 따라서 규칙의 마지막 (또는 유일한) 토큰에 대해서도 저장된 값 yytext을 사용할 수 없습니다.

해결 방법 : 문자열을 복사하십시오. (나는 strdup을 사용하지만 어떤 이유로 malloc과 strcpy를 좋아한다. NUL 터미네이터를 잊지 마라.) 그리고 복사가 끝나면 free()을 기억하자.

참조 용 : what the flex manual says.