趙強把筆記本攤在林遠面前的時候,眼睛裡全是血絲。
"十八條。"
"什麼十八條?"
"語法規則。"他翻開筆記本,上面密密麻麻寫滿了字,"你說先做五條,我把C語言常見的語法錯誤全翻了一遍,列了十八條——分號缺失、括號不匹配、字符串未閉合、注釋未閉合、關鍵字拼寫錯誤、變量未使用、死代碼、重複聲明、隱式類型轉換、數組越界、內存泄漏、空指針解引用、格式化字符串不匹配、整數溢出、未初始化變量、函數參數不匹配、返回值未檢查、switch缺少break。"
他指著那十八條,語氣里有一種初生牛犢特有的亢奮:"你覺得哪五條先做?"
林遠掃了一眼。十八條規則,條理清晰,分類合理。這小子用了一個晚上,把C語言編譯器會報的錯誤類型幾乎全覆蓋了。
"先做第一條。分號缺失。"
"我已經在想了。"趙強翻到筆記本的下一頁,上面畫著一個流程圖,"難點在於,你不能簡單看行末是不是分號——注釋行、宏定義、多行語句續行,這些情況都需要特殊處理。"
他頓了頓,指著流程圖說:"我的想法是——把代碼按'上下文'來分層。比如當前在注釋里,就不要檢查分號;在宏定義里,也不檢查。相當於給每一行代碼標一個'狀態標籤',不同狀態下檢查規則不一樣。"
林遠看了他一眼。
這思路……比前世的自己當年還清晰。
"你聽說過有限狀態機嗎?"林遠問。
"聽過。編譯原理課上講過詞法分析的時候用的就是這個。"趙強眼睛亮了,"你的意思是——用狀態機來追蹤代碼的上下文狀態?"
"對。你自己的想法方向是對的,狀態機就是實現路徑。"
趙強已經在筆記本上快速畫了起來——五個圓圈代表五種狀態:普通代碼、注釋內部、字符串內部、續行、宏定義。箭頭標註轉換條件:遇到/*進入注釋、遇到*/退出、遇到#開頭進入宏定義……
畫了不到十分鐘,他抬頭:"轉換條件我大致理清了,每個狀態下要不要檢查分號的判斷邏輯也明確了。我寫代碼試試。"
"去吧。"
趙強坐回電腦前,先花五分鐘把狀態定義和轉換函數在紙上寫清楚,然後開始敲代碼。他的打字速度很快,思路也連貫——定義狀態枚舉、寫狀態轉換函數、處理每種狀態下的分號判斷邏輯、加邊界條件。
大約二十五分鐘,初版寫完。
他跑了一遍測試。
輸出結果出來,趙強皺了皺眉——大部分通過了,但有一處誤報:#define宏定義里嵌套了字符串常量,狀態機把宏定義內部的字符串當成了普通字符串處理,導致後續的注釋行被誤判。
"宏定義里又有字符串又有注釋,狀態疊加了。"他自言自語,手指在鍵盤上敲了兩下又停住,盯著屏幕看了十幾秒。
然後他在狀態轉換函數裡加了一層優先級判斷:宏定義狀態下,內嵌的字符串和注釋不再觸發狀態切換——因為宏定義整體就是一行,不需要檢查分號。
改完又跑。全部通過。
前後用了不到四十分鐘。
他重新跑一遍完整測試——第一個用例,一段有五行代碼的C程序,第四行末尾少了分號。
輸出:Line 4: missing semicolon.
沒有誤報。注釋行沒被標紅,空行沒被標紅,續行沒被標紅,宏定義沒被標紅。
趙強從椅子上彈起來:"過了!"
"第二條用例呢?"
"跑!"
第二段代碼——十行,兩處缺分號,一處有多餘分號。
輸出:Line 3: missing semicolon. Line 7: missing semicolon.
"全對了!"趙強的聲音大得整層樓都能聽見。
蘇明遠從走廊那頭探進頭來:"怎麼了?"
"我寫出了第一個有用的東西!"趙強轉身,臉上的表情像一個孩子拆開了期待已久的禮物。
林遠看著他,沒說話。
趙強的學習能力確實強。前世他自己寫lint工具的時候,光是理解狀態機的應用場景就花了兩天。趙強從提出思路到寫出可運行的代碼,不到一個小時。
"接下來做什麼?"林遠問。
"括號匹配!"趙強毫不猶豫,"第二條規則——圓括號、方括號、花括號必須成對出現,嵌套正確。這個用棧結構應該能搞定。"
"不急。"林遠說,"你先把分號檢測的規則完善到十八條全覆蓋。剛才那兩條測試用例只是最簡單的情況。goto標籤後面的分號、struct定義里的分號、嵌套宏定義——這些邊界情況處理了嗎?"
趙強愣了一下:"……嵌套宏定義還沒考慮。"
"先把一條規則做到極致,再開下一條。"
趙強點了點頭,坐回去繼續改代碼。
蘇明遠今晚出去跑了一趟客戶,回來已經十點多。
"WatchGuard又簽了一單。"他把包甩在床上,"海淀的一家做教育培訓的公司,二十個節點。加上這周其他零散的,一共新增了七單。"
"阿里芭芭那邊呢?"
"穩定了,每周三到四單。有個客戶還主動問能不能介紹朋友來用——口碑開始起來了。"
蘇明遠倒了杯水,看了一眼趙強的屏幕:"他又在搞什麼?"
"語法檢查插件。"
"你那個墨鋒的?"
"嗯。他給自己找了個活——給墨鋒寫一套語法規則引擎。十八條規則,一個晚上全列出來了,分號檢測已經跑通了。"
蘇明遠挑了挑眉:"這麼快?"
"他腦子夠用。"
林遠回到桌前,打開郵箱。
騰迅的張智勇回了郵件。
林遠看著這封郵件,嘴角微微上揚。
QQ郵箱。前世張小龍接手後的翻身之作。2003年的QQ郵箱還是一片爛攤子——但正因為是爛攤子,才是最大的機會。
他關上郵箱,沒有立刻回復。這個方案不是郵件能說清楚的,等解封後當面聊。
窗外開始下雨了。趙強還在調試他的狀態機,屏幕上的光標一閃一閃。旁邊是他的筆記本,十八條規則下面,第二條的標題已經寫好——
"括號匹配。"