2009-10-23 6 views
2

yacc/bison을 사용하여 #define 매크로를 구현하려면 어떻게해야합니까?yacc/bison lex에서 매크로 정의 #

나는 모든 정의 된 문자가 일반 변수와 일치해야한다고 생각했습니다. 변수는 [a-zA-Z_][a-zA-Z0-9_]*으로 정의되었으므로 변수가 정의되어 있는지 확인하기 위해 거기에 수표를 넣을 수 있습니다. 그런 다음 텍스트를 대체해야합니다.

어떻게 할 수 있습니까? 지금 나는 완전히 불의 단어를 무시하고 싶다. 내가 C로 #define BAD으로 정의한 것 같다. 아래는 그 렉스 규칙에 대한 코드이지만 잘못된 것이다. 또한 lex는 스트림에있는 "BA"에 대해 불평합니다. 나는 아래 내가 2)에서 검출의 정의 정의) 내가

if(strcmp(yytext, "BAD")==0) { 
     int i, l = strlen(yytext); 
     for(i=0; i<l; i++) { REJECT } 
     return; 
    } 
    return VAR; } 

내가 주요 단계 1 알고 플로트처럼 무언가로 대체 어떻게 다음 BAD 무시하고 어떻게 그렇게 완전히 잘못하고 비논리적 알고 소스 3) make lex가 매크로 문자를 잊어 버린다. 4) 새로운 올바른 문자를 삽입한다.

답변

2

정의를 찾으려면 lex에 규칙을 넣으십시오. 그런 다음 unput을 사용하여 대체 텍스트를 삽입하십시오. 텍스트는 뒤로 삽입됩니다.

[a-zA-Z0-9_]* { 
     if(strcmp(yytext, "HARDCODED_DEFINE")==0) { 
      const char s[]="int replacement_text"; 
      int z; 
      for(z=strlen(s)-1; z>=0; z--) 
       unput(s[z]); 
     } 
     else 
      return VAR_TOK; 
     }