2013-08-10 3 views
0

Мне просто интересно, как любой из вас, ребята, реализует многозначные переменные в c, используя Flex и Bison/Lex и Yacc? Если это возможно, вы можете представить простой пример?Переменные Lex Yacc/Flex Bison

Я пытаюсь написать интерпретатор для языка, и я не могу найти хороший способ реализовать переменные, до сих пор методы, которые я пытался, либо провалили, либо вызвали выполнение любой программы с большим количеством переменных становятся действительно так (я имею в виду, что может занять несколько минут, чтобы выполнить программу, которая просто присваивает 1000 переменных и ничего не делает)

Спасибо за ваше время, Фрэнсис

+1

Будьте осторожны при маркировке. Flex используется для интерфейса Adobe/Apache UI. Flex-lexer используется для лексического анализатора. Я исправил тег. – JeffryHouser

+1

@ Reboog711 Flex существует с -97, adobe flex с 2004 года, так что это действительно должно быть наоборот: Flex для lexer и Adobe Flex для всего, что есть. – nic

+1

@nic Я не тот, кто создал теги; но тег Flex получает множество вопросов о структуре пользовательского интерфейса и очень мало о лексическом анализаторе. – JeffryHouser

ответ

0

в лексере предоставленной ADAIC для Ада в используется следующий метод, я считаю его полезным для лексических многолучевых литералов, таких как зарезервированные слова и переменные. Он (наряду с соответствующей грамматикой 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; 
} 
Смежные вопросы