Как сказано в заголовке, какой тип данных должен возвращать / передавать синтаксический анализатор? Читая статью о лексическом анализе, которая есть в Википедии, она заявила, что:
В информатике лексический анализ - это процесс преобразования последовательности символов (например, в компьютерной программе или веб-странице) в последовательность токенов ( строк с определенным «значением»).
Однако, в полном противоречии с приведенным выше утверждением, когда на другой вопрос, который я задал на другом сайте ( Code Code, если вам интересно), ответивший сказал, что:
Лексер обычно читает строку и преобразует ее в поток ... лексем. Лексемы должны быть только потоком чисел .
и он дал это визуальное:
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 возвращает строки ключевых слов \ токенов. Но это может быть возвращение констант, которые равны определенным числам.
Если лексер собирался возвращать числа, как бы он читал строковые литералы? возвращение числа хорошо для отдельных ключевых слов, но как бы вы справились со строкой? Если бы лексеру не пришлось преобразовывать строку в двоичные числа, то парсер преобразовывал бы числа обратно в строку. Для лексера кажется гораздо более логичным (и более простым) возвращать строки, а затем позволить анализатору преобразовать любые числовые строковые литералы в реальные числа.
Или может ли лексер вернуть оба? Я пытался написать простой лексер на c ++, который позволяет вам иметь только один тип возврата для ваших функций. Таким образом, побуждает меня задать свой вопрос.
Чтобы сжать мой вопрос в абзаце: при написании лексера и предположении, что он может возвращать только один тип данных (строки или числа), что было бы более логичным выбором?