Seperti yang dikatakan dalam judul, tipe data mana yang harus dikembalikan / diberikan parser lexer? Ketika membaca artikel analisis leksikal yang dimiliki Wikipedia, dinyatakan bahwa:
Dalam ilmu komputer, analisis leksikal adalah proses mengubah urutan karakter (seperti dalam program komputer atau halaman web) menjadi urutan token ( string dengan "makna" yang diidentifikasi).
Namun, dalam kontradiksi lengkap dengan pernyataan di atas, Ketika pertanyaan lain saya tanyakan di situs yang berbeda ( Peninjauan Kode jika Anda penasaran) dijawab, Orang yang menjawab menyatakan bahwa:
Lexer biasanya membaca string dan mengubahnya menjadi aliran ... lexeme. Leksem hanya perlu aliran angka .
dan dia memberikan visual ini:
nl_output => 256
output => 257
<string> => 258
Kemudian dalam artikel yang disebutkannya Flex
, seorang lexer yang sudah ada, dan mengatakan menulis 'aturan' dengan itu akan lebih sederhana daripada menulis lexer dengan tangan. Dia kemudian memberi saya contoh ini:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Untuk memajukan wawasan saya dan mendapatkan informasi lebih lanjut, saya membaca artikel Wikipedia tentang Flex . artikel Flex menunjukkan bahwa Anda dapat menetapkan sekumpulan aturan sintaks, dengan token, dengan cara berikut:
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; }
Sepertinya saya bahwa Flex lexer mengembalikan string kata kunci \ token. Tapi bisa jadi konstanta yang dikembalikan sama dengan angka-angka tertentu.
Jika lexer akan mengembalikan angka, bagaimana ia membaca string literal? mengembalikan nomor tidak masalah untuk kata kunci tunggal, tetapi bagaimana Anda akan berurusan dengan string? Bukankah lexer harus mengubah string ke angka biner dan kemudian parser akan mengubah angka kembali menjadi string. Tampaknya jauh lebih logis (dan lebih mudah) bagi lexer untuk mengembalikan string, dan kemudian membiarkan parser mengubah sembarang string angka menjadi angka aktual.
Atau mungkinkah lexer mengembalikan keduanya? Saya sudah mencoba untuk menulis lexer sederhana di c ++, yang memungkinkan Anda hanya memiliki satu tipe pengembalian untuk fungsi Anda. Dengan demikian mengarahkan saya untuk mengajukan pertanyaan saya.
Untuk menyingkat pertanyaan saya menjadi paragraf: Saat menulis lexer, dan dengan asumsi bahwa itu hanya bisa mengembalikan satu tipe data (string atau angka), yang mana yang akan menjadi pilihan yang lebih logis?