Вопрос

Как мне реализовать макросы #define с помощью yacc / bison?

Я думал, что все определяемые символы должны соответствовать обычной переменной. Переменные определены как [a-zA-Z _] [a-zA-Z0-9 _] * , поэтому я решил поставить там проверку, чтобы увидеть, сработала ли переменная define или нет , Затем замените текст таким, каким он должен быть.

Как я могу это сделать? Сейчас я хочу полностью игнорировать слово BAD, как если бы я определил его как #define BAD в C. Ниже приведен код для этого правила lex, но я делаю это неправильно. Также Лекс жалуется на «BA» быть в потоке Я знаю, что приведенное ниже абсолютно неверно и нелогично, поэтому как мне игнорировать ПЛОХО, а затем как заменить его чем-то вроде float

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

Я знаю, что основные шаги: 1) определить определение, 2) определить его в источнике 3) заставить lex забыть символы макросов 4) вставить новые правильные символы.

Это было полезно?

Решение

Поместите правило в 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; 
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top