Como se dice en el título, ¿qué tipo de datos debe devolver un lexer / darle al analizador? Al leer el artículo de análisis léxico que Wikipedia tiene, declaró que:
En informática, el análisis léxico es el proceso de convertir una secuencia de caracteres (como en un programa de computadora o página web) en una secuencia de tokens ( cadenas con un "significado" identificado).
Sin embargo, en completa contradicción con la declaración anterior, cuando se respondió otra pregunta que hice en un sitio diferente ( Revisión de Código si tiene curiosidad), la persona que respondió declaró que:
El lexer generalmente lee la cadena y la convierte en una secuencia ... de lexemas. Los lexemas solo necesitan ser una corriente de números .
y le dio este visual:
nl_output => 256
output => 257
<string> => 258
Más adelante en el artículo que mencionó Flex
, un lexer ya existente, y dijo que escribir "reglas" con él sería más simple que escribir un lexer a mano. Él procedió a darme este ejemplo:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Para ampliar mi visión y obtener más información, leí el artículo de Wikipedia sobre Flex . El artículo de Flex mostró que se podía definir un conjunto de reglas de sintaxis, con tokens, de la siguiente manera:
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; }
Me parece que Flex lexer está devolviendo cadenas de palabras clave \ tokens. Pero podría estar devolviendo constantes que son iguales a ciertos números.
Si el lexer iba a devolver números, ¿cómo leería los literales de cadena? devolver un número está bien para palabras clave individuales, pero ¿cómo lidiaría con una cadena? El lexer no tendría que convertir la cadena a números binarios y luego el analizador volvería a convertir los números a una cadena. Parece mucho más lógico (y más fácil) que el lexer devuelva cadenas y luego permita que el analizador convierta cualquier literal de cadena de números en números reales.
¿O podría el lexer posible devolver ambos? He estado tratando de escribir un simple lexer en c ++, que le permite tener solo un tipo de retorno para sus funciones. Así me lleva a hacer mi pregunta.
Para condensar mi pregunta en un párrafo: al escribir un lexer, y suponiendo que solo pudiera devolver un tipo de datos (cadenas o números), ¿cuál sería la opción más lógica?