2017-05-07 88 views
0

我試圖在Ocaml中實現一個詞法分析器。我最初需要做的一部分是取一個字符串並將它們分割成字符串列表,以便稍後「標記」它們並將其放入解析器中。它需要遵循基本的操作指南,忽略空格,製表符,換行符等。例如:OCaml中的語言詞法分析器

"1 + 25 *(6^2)" 

應該返回

["1"; "+"; "25"; "*"; "("; "6"; "^"; "2"; ")"] 

如果字符串的開頭可以是多件事情,最長的比賽應該是首選,例如:

"1-1" should be split as ["1"; "-1"] since "-1" is a longer match than just "-" 

我試圖與Str.regex做第一步,但它不足以完美分割它。我的代碼:

Str.split (Str.regexp "[ \t\n]+") input 

需要input並根據[ \t\n]+分裂他們,所以這裏的問題是,如果我有像,它會返回["(5"; "+"; "6^8)"],而不是["("; "5"; "+"; "6"; "^"; "8"; ")"]

任何想法我怎麼能做得更好?

回答

1

這是ocamllex的用途。你需要一個更明確的詞法結構列表,而不是想象只是分割空白。

作爲側面評論,請務必閱讀描述正則表達式結構支持的部分。一個常見的問題是嘗試使用來自其他語言的不支持的結構。

對於什麼是值得的,在詞法層面處理負數很棘手,因爲你通常想要支持諸如「x-1」之類的東西。如果你試圖從詞法上處理負數,那麼這就是兩個令牌。

更新

如果您不能使用ocamllex,你仍然需要考慮在組正則表達式的條款。

如果您可以使用Str模塊,則可以使用Str.regexp來創建與ocamllex一起使用的同一組正則表達式。要獲得下一個標記,請匹配所有正則表達式並進行最長匹​​配。 (要打破長度的關係,訂購正則表達式並以最長的長度進行第一次匹配。)

+0

我不能使用'ocamllex' b/c這是項目的一部分來手動實現詞法分析器,解析器,和一名口譯員。 – thestateofmay

+1

如果您允許使用'Str.string_match',您可以匹配您使用ocamllex指定的同一組正則表達式,然後花費最長的時間。 –