Jak wspomniano w tytule, jaki typ danych leksyker powinien zwrócić / przekazać analizator składni? Czytając artykuł z analizy leksykalnej, który ma Wikipedia, stwierdził:
W informatyce analiza leksykalna to proces przekształcania sekwencji znaków (np. W programie komputerowym lub na stronie internetowej) w sekwencję tokenów ( ciągów o zidentyfikowanym „znaczeniu”).
Jednak w zupełnej sprzeczności z powyższym stwierdzeniem, gdy na inne witryny ( Przegląd kodu, jeśli jesteś ciekawy) udzielono odpowiedzi na inne pytanie, odpowiadający stwierdził, że:
Lexer zwykle odczytuje ciąg znaków i konwertuje go na strumień ... leksemów. Leksemy muszą być tylko strumieniem liczb .
i dał ten obraz:
nl_output => 256
output => 257
<string> => 258
W dalszej części artykułu wspomniał Flex
, że już istnieje leksykon, i powiedział, że pisanie „reguł” z nim byłoby prostsze niż pisanie leksemu ręcznie. Podał mi ten przykład:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Aby uzyskać więcej informacji i uzyskać więcej informacji, przeczytałem artykuł w Wikipedii na temat Flex . artykuł Flex pokazał, że można zdefiniować zestaw reguł składniowych z tokenami w następujący sposób:
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; }
Wydaje mi się, że leksykon Flex zwraca ciągi słów kluczowych \ tokenów. Ale może to być zwracanie stałych, które są równe pewnym liczbom.
Gdyby lekser miał zwrócić liczby, to jak odczytałby literały łańcuchowe? zwracanie liczby jest w porządku dla pojedynczych słów kluczowych, ale jak poradziłbyś sobie z ciągiem znaków? Czy leksykon nie musiałby konwertować ciągu na liczby binarne, a następnie parser przekształciłby liczby z powrotem na ciąg. Wydaje się o wiele bardziej logiczne (i łatwiejsze), aby leksykon zwracał ciągi, a następnie pozwalał analizatorowi konwertować dowolne literały ciągu liczbowego na liczby rzeczywiste.
A może leksykon może zwrócić oba? Próbowałem napisać prosty leksykon w c ++, który pozwala mieć tylko jeden typ zwracanych funkcji. Skłoniło mnie to do zadania pytania.
Aby zawęzić moje pytanie do akapitu: pisząc leksykę i zakładając, że może on zwrócić tylko jeden typ danych (ciągi lub liczby), co byłoby bardziej logicznym wyborem?