[英]Why we count a string as a single token in lexical analysis of compiler design?
我正在學習編譯器設計。 編譯器中詞法分析器的任務是將代碼轉換為令牌的stream。 但我很困惑為什么我們將字符串視為單個標記。 例如 - printf("%d is integer", x);
在這個語句中printf
, (
, "%d is integer"
, ,
, x
, )
, ;
是標記,但為什么字符串中的%d
不被視為單獨的標記?
因為像%d
(或任何其他字符串內容)這樣的格式說明符在語法上沒有意義——沒有依賴於它們的語言語法元素。 字符串內容(包括像%d
這樣的格式說明符)是數據,而不是代碼,因此對編譯器沒有意義。 字符序列%d
僅在運行時有意義,並且僅對*printf
/ *scanf
系列函數有意義,並且僅作為格式字符串的一部分。
要將%d
識別為不同的標記,您必須標記整個字符串- "
, %d
, is
, integer
, "
。 這會自行打開一大堆蠕蟲,使字符串的解析更加困難。
一些編譯器確實會檢查格式字符串 arguments 到printf
和scanf
調用以進行一些基本的健全性檢查,但這已經發生在標記化之后。 在標記化階段,您不知道這是對printf
庫 function 的調用。 直到在語法分析之后,編譯器才知道這是一個特定的庫調用並且可以執行這種檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.