Як сказано в заголовку, який тип даних повинен лексеру повернути / надати парсер? Читаючи статтю про лексичний аналіз, яку має Вікіпедія, було зазначено, що:
У інформатиці лексичний аналіз - це процес перетворення послідовності символів (наприклад, у комп’ютерній програмі чи веб-сторінці) у послідовність лексем ( рядків із визначеним «значенням»).
Однак, в повній суперечності з вищезазначеним твердженням, коли відповіли на інше запитання, яке я задав на іншому веб-сайті ( Перегляд коду, якщо вам цікаво), людина, відповідаючи, заявила, що:
Лексер зазвичай зчитує рядок і перетворює це в потік ... лексеми. Лексеми повинні бути лише потоком чисел .
і він зробив це наочне:
nl_output => 256
output => 257
<string> => 258
Пізніше у статті, яку він згадав Flex
, вже існуючий лексем, і сказати, що писати з ним «правила» було б простіше, ніж писати лексер вручну. Він продовжував наводити мені такий приклад:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Для подальшого розуміння та отримання додаткової інформації я прочитав статтю Вікіпедії про Flex . стаття Flex показала, що ви можете визначити набір правил синтаксису з лексемами таким чином:
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; }
Мені здається, що Flex lexer повертає рядки ключових слів \ лексем. Але це можуть бути повертаючі константи, які дорівнюють певним числам.
Якщо лексер збирається повертати числа, як би він читав рядкові літерали? повернення числа добре для окремих ключових слів, але як би ви мали справу з рядком? Чи не повинен би лексеру перетворити рядок у двійкові числа, і тоді аналізатор перетворив би числа назад у рядок. Лексеру здається набагато логічнішим (і простіше) повернути рядки, а потім дозволити аналізатору перетворити будь-які літеральні рядки чисел у фактичні числа.
Чи міг лексер повернути обидва? Я намагався написати простий лексер на c ++, який дозволяє мати лише один тип повернення для своїх функцій. Таким чином, ведучи мене ставити своє запитання.
Щоб узагальнити моє запитання на абзац: Коли пишуть лексеми та припускають, що він може повернути лише один тип даних (рядки чи числа), що було б більш логічним вибором?