2013-08-10 3 views
0

저는 Flex와 Bison/Lex 및 Yacc를 사용하여 여러분이 어떻게 다중 문자 변수를 구현하는지 궁금합니다. 그렇다면 간단한 예제를 제공 할 수 있습니까?Lex Yacc/Flex Bison 변수

언어에 대한 인터프리터를 쓰려고하는데 변수를 구현하는 좋은 방법을 찾을 수없는 것 같습니다. 지금까지 시도한 방법 중 하나가 실패했거나 많은 프로그램 실행을 유발했습니다. 정말 그렇게 에이다에 대한 ADAIC에서 제공하는 렉서에서 프랜시스

+1

에서 사용할 수 있습니다. 태그를 지정할 때주의하십시오. Flex는 Adobe/Apache UI 프레임 워크에 사용됩니다. Flex-lexer는 어휘 분석기에 사용됩니다. 나는 그 꼬리표를 고쳤다. – JeffryHouser

+1

@ Reboog711 플렉스는 -97 년 이후로 주위에 있었고, 2004 년 이후 어도비 플렉스를 사용했기 때문에 어쨌든 어휘 용 플렉스와 어도비 플렉스가 그 반대입니다. – nic

+1

@nic 태그를 만든 사람이 아닙니다. Flex 태그는 UI 프레임 워크에 대해 많은 질문을하고 어휘 분석기에 대해서는 거의 제공하지 않습니다. – JeffryHouser

답변

0

당신의 시간을

감사 (나는 그냥 천 개 변수를 할당하고 다른 아무것도하지 않는 프로그램을 실행할 수 분이 걸릴 수 있습니다 의미)이 될 변수 다음과 같은 방법을 사용하여, 나는 예약어 및 변수와 같은 다중 문자 리터럴을 렉싱하는 데 유용하다는 것을 알게되었습니다. 그것은 (해당 Bison 문법과 다른 것들과 함께) ADAIC docs

%% 
[a-zA-Z](_?[a-zA-Z0-9])* return(lk_keyword(yytext)); 
%% 
# define NUM_KEYWORDS 69 
KEY_TABLE key_tab[NUM_KEYWORDS] = 
{ 
{"ABORT",  ABORT}, 
{"ABS",   ABS}, 
.... 
.... 
.... 
}; 


lk_keyword(str) 
     char *str; 
{ 
     int min; 
     int max; 
     int guess, compare; 

     min = 0; 
     max = NUM_KEYWORDS-1; 
     guess = (min + max)/2; 
     to_upper(str); 

     for (guess=(min+max)/2; min<=max; guess=(min+max)/2) { 
       if ((compare = strcmp(key_tab[guess].kw, str)) < 0) { 
         min = guess + 1; 
       } else if (compare > 0) { 
         max = guess - 1; 
       } else { 
         return key_tab[guess].kwv; 
     } 
    } 
     return identifier; 
} 
관련 문제