Pergunta

Eu estou usando Flex e Bison para um gerador de analisador, mas tendo problemas com os estados iniciais no meu scanner.

Eu estou usando regras exclusivos para lidar com comentando, mas esta gramática não parece corresponder símbolos citados:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

Neste exemplo simples da linha:

// a == b

não corresponde inteiramente como um comentário, a menos que eu incluir esta regra:

<COMMENT>"=="             ;

Como faço para contornar isso sem ter que adicionar todos estes sinais em minhas regras exclusivos?

Foi útil?

Solução

comentários correspondência de estilo C em Lex / Flex ou o que está bem documentado:

na documentação , bem como diversas variações em torno da Internet.

Aqui é uma variação do que a encontrada na documentação do Flex:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }

Outras dicas

Tente adicionar um "+" após a regra [^ n]. Eu não sei por que o Estado exclusivo ainda está pegando '==' mesmo em um estado exclusivo, mas aparentemente é. Flex normalmente coincidir com a regra que corresponde a mais de texto, e adicionando os "+" vai pelo menos fazer as duas regras empate em comprimento. Colocando a regra COMENTÁRIO primeira fará com que ele seja usado em caso de empate.

A pista é:

O problema é este 'comer comentário' regra não parece corresponder com fichas mais de um personagem

para adicionar um * para corresponder a zero ou mais não-novas linhas. Você quer Zero caso contrário um comentário vazio não irá corresponder.

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top