wvogel日記

自分用の技術備忘録が多めです.

Lexer

今日はHaskellでレクサーを書こうと思い立つ。
Parsecの勉強をしようしようと思いつつ、なかなかまとまったサイトがないので、本腰入れないといけなさそう


なら、自作で何かしらやってみるか


というわけで。
基本となる関数は、

parse :: String -> Char -> String -> [String]
parse n c (s:str)
    | s == c = [n]
    | otherwise = parse n c str

である。
例えば、
if(x < 9)
のような文を字句に解析するには、
まず

までの命令を読み出し、次に

までの中身について、記号と数字、文字列を分割していく。


最終的には、[Stirng]に、

["if" , "x" , "<" , "9"]

のような形で展開される。
こいつはレクサーなので、あとはこれを、パーサを使って意味のある構造に構成していく。


という流れを考え、
上の関数の一行目を
s == c = [n]:parse' [] "(" str
のように記述し、
字句解析を連鎖的につなげていくことができる。