Como dito no título, que tipo de dados um lexer deve retornar / fornecer ao analisador? Ao ler o artigo de análise lexical que a Wikipedia possui, afirmou que:
Na ciência da computação, a análise lexical é o processo de conversão de uma sequência de caracteres (como em um programa de computador ou página da web) em uma sequência de tokens ( strings com um "significado" identificado).
No entanto, em completa contradição com a afirmação acima, quando outra pergunta que fiz em um site diferente ( Revisão do código, se você estiver curioso) foi respondida, a pessoa que respondeu afirmou que:
O lexer geralmente lê a string e a converte em um fluxo ... de lexemes. Os lexemas precisam apenas ser um fluxo de números .
e ele deu esse visual:
nl_output => 256
output => 257
<string> => 258
Mais adiante, no artigo, ele mencionou Flex
um lexer já existente e disse que escrever "regras" com ele seria mais simples do que escrever um lexer à mão. Ele passou a me dar este exemplo:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Para aprofundar meus conhecimentos e obter mais informações, li o artigo da Wikipedia sobre o Flex . o artigo Flex mostrou que você pode definir um conjunto de regras de sintaxe, com tokens, da seguinte maneira:
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
Parece-me que o Flex lexer está retornando seqüências de palavras-chave \ tokens. Mas poderia estar retornando constantes iguais a determinados números.
Se o lexer retornasse números, como ele leria literais de string? retornar um número é adequado para palavras-chave únicas. Mas como você lida com uma string? O lexer não precisaria converter a string em números binários e, em seguida, o analisador converteria os números novamente em uma string. Parece muito mais lógico (e mais fácil) para o lexer retornar strings e, em seguida, permitir que o analisador converta qualquer literal de string numérico em números reais.
Ou o lexer poderia retornar os dois? Eu tenho tentado escrever um lexer simples em c ++, que permite que você tenha apenas um tipo de retorno para suas funções. Assim, levando-me a fazer minha pergunta.
Para condensar minha pergunta em um parágrafo: Ao escrever um lexer, e assumindo que ele poderia retornar apenas um tipo de dados (strings ou números), qual seria a opção mais lógica?