Обработка символа, возвращаемого yyless в начальном условии в yacc - PullRequest
1 голос
/ 15 марта 2020

Для приведенного ниже фрагмента кода блок «ASSN: =» для {EQ} не запускается для ввода «CC = gcc \ n» - я не понимаю, почему это так, символ равенства передается , так как он обрабатывается следующим правилом для {CHAR}.

Как я могу гарантировать, что правило {EQ} для обрабатывается, когда символ равенства 'отбрасывается' назад yyless?

Код bya cc практически пуст с одним фиктивным правилом, но с соответствующими строками% токена.

#define _XOPEN_SOURCE 700
#include <stdio.h>
#include "y.tab.h"
extern YYSTYPE yylval;
%}

%x      ASSIGNMENT
%option noyywrap

DIGIT   [0-9]
ALPHA   [A-Za-z]
SPACE   [ ]
TAB     [\t]
WS      [ \t]+
NEWLINE (\n|\r|\r\n)
IDENT   [A-Za-z_][A-Za-z_0-9]+
EQ      =
CHAR    [^\r\n]+

%%

<*>"#"{CHAR}{NEWLINE}

({IDENT}{EQ})|({IDENT}{WS}{EQ}) { 
                        yylval.strval = strndup(yytext, 
                                strlen(yytext)-1);

                        printf("NORM: %s\n", yylval.strval);
                        yyless(strlen(yytext)-1);
                        BEGIN(ASSIGNMENT);
                        return TOK_IDENT;
                    }

<ASSIGNMENT>{

{EQ}                {
                        printf("ASSN: =\n");
                        return TOK_ASSIGN;
                    }

{CHAR}              {
                        printf("ASSN: %s\n", yytext);
                        return TOK_STRING;
                    }

{NEWLINE}           {   
                        BEGIN(INITIAL); 
                    }
}

{WS}
{NEWLINE}

.                   { 
                        printf("DOT : %s\n", yytext);
                    }

<*><<EOF>>          { 
                        printf("EOF\n");
                        return 0;       
                    }

%%

int main()
{
    printf("Start\n\n");
    int ret;
    while( (ret = yylex()) )    {
        printf("LEX : %u\n", ret);
    }
    printf("\nEnd\n");
}

Пример вывода:

Start

NORM: CC
LEX : 257
ASSN: =gcc
LEX : 259
EOF

End

1 Ответ

1 голос
/ 15 марта 2020

Моя проблема заключалась в том, что flex соответствует сначала правилу самое длинное , поэтому {CHAR} всегда выигрывал у {EQ}. Я решил это, введя другое условие запуска для использования {EQ} {WS}? перед переходом на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...