Saya mencoba memahami kompilasi dan interpretasi, langkah demi langkah mencari gambaran total. Jadi saya mengajukan pertanyaan saat membaca http://www.cs.man.ac.uk/~pjj/farrell/comp3.html artikel ini
Ia mengatakan :
Tahap selanjutnya dari kompiler disebut Parser. Bagian kompiler ini memiliki pemahaman tentang tata bahasa bahasa. Ia bertanggung jawab untuk mengidentifikasi kesalahan sintaksis dan untuk menerjemahkan program bebas kesalahan ke dalam struktur data internal yang dapat ditafsirkan atau ditulis dalam bahasa lain.
Tapi saya tidak tahu bagaimana tokenizer dapat dengan benar tokenize aliran yang diberikan yang memiliki kesalahan sintaksis.
Ini harus macet di sana atau memberikan informasi yang salah kepada pengurai. Maksud saya bukankah tokenizing juga semacam penerjemah?
Jadi bagaimana itu hanya mengatasi baris kode yang rusak leksikal sementara tokenizing.
Ada contoh token di dalam tautan di atas di tajuk The Tokenizer .
Seperti yang saya mengerti bentuk token sepertinya, jika ada sesuatu yang salah dalam kode token juga akan rusak.
Bisakah Anda jelaskan kesalahpahaman saya?
and
atau&&
atau sesuatu yang lain. Ini (kebanyakan) terpisah dan berbeda dari parsing. Optimalisasi (jika ada) adalah efek samping yang hampir tidak disengaja.Anda biasanya mengharapkan sebagian besar kesalahan sintaksis berasal dari parser, bukan lexer.
Lexer akan menghasilkan kesalahan jika (dan sebagian besar hanya jika) ada sesuatu dalam input yang tidak dapat di token. Namun, dalam banyak bahasa, hampir semua urutan karakter dapat diubah menjadi token, jadi kesalahan di sini cukup tidak biasa.
Parser akan menghasilkan kesalahan jika input berisi token yang valid, tetapi token tersebut tidak diatur sehingga mereka membentuk pernyataan / ekspresi yang valid dalam bahasa target. Ini jauh lebih umum sebagai suatu peraturan.
sumber
Tokenizer hanya membagi aliran karakter menjadi token. Dari tokenizer POV ini benar-benar valid:
dan diterjemahkan menjadi sesuatu seperti:
["1", MULTIPLY, MULTIPLY, "1"]
Hanya parser yang dapat menolak ekspresi seperti itu - ia tahu operator gandakan tidak dapat mengikuti operator gandakan lainnya. Misalnya dalam JavaScript ini menghasilkan:Ada kesalahan yang mungkin terdeteksi oleh tokenizer. Misalnya literal yang belum selesai tali:
"abc
atau nomor tidak valid:0x0abcdefg
. Meskipun demikian, mereka mungkin dilaporkan sebagai kesalahan sintaks:Namun perlu dicatat bahwa token tidak dikenali dan dilaporkan sebagai
ILLEGAL
.sumber