ghc-lexer

Memo

  • Haskell の文字列を字句解析した結果がわかる

  • ちょっと使いづらいけど、問題はない

  • ファイルからの読み込み、言語拡張にも対応している

インストール方法

stack
λ git clone https://github.com/carymrobbins/ghc-lexer.git
λ cd ghc-lexer
λ stack install

使い方

プログラムの終了は qquitexit のどれかを打ち込むだけ。

lex モード

Enter を押す度に字句解析が実行される。入力の完了は <EOF> という文字列で判定。

λ ghc-lexer
> lex
> INPUT: (Enter code to parse. Use "<EOF>" on a line to signal end of file.)
if True then 0 else 1
<EOF>
OUTPUT: (Press enter for next element. Anything else will stop lexing)

{"token":{"ITif":[]},"srcSpan":[[1,1],[1,3]]}

{"token":{"ITconid":"True"},"srcSpan":[[1,4],[1,8]]}

{"token":{"ITthen":[]},"srcSpan":[[1,9],[1,13]]}

{"token":{"ITinteger":[{"SourceText":"0"},0]},"srcSpan":[[1,14],[1,15]]}

{"token":{"ITelse":[]},"srcSpan":[[1,16],[1,20]]}

{"token":{"ITinteger":[{"SourceText":"1"},1]},"srcSpan":[[1,21],[1,22]]}

{"token":{"ITeof":[]},"srcSpan":[[2,1],[2,1]]}

lexall

わざわざ Enter を押し続けるのが面倒な人はこっち

λ ghc-lexer
> lexall
INPUT: (Enter code to parse. Use "<EOF>" on a line to signal end of file.)
if True then 0 else 1
<EOF>
{"token":{"ITif":[]},"srcSpan":[[1,1],[1,3]]}
{"token":{"ITconid":"True"},"srcSpan":[[1,4],[1,8]]}
{"token":{"ITthen":[]},"srcSpan":[[1,9],[1,13]]}
{"token":{"ITinteger":[{"SourceText":"0"},0]},"srcSpan":[[1,14],[1,15]]}
{"token":{"ITelse":[]},"srcSpan":[[1,16],[1,20]]}
{"token":{"ITinteger":[{"SourceText":"1"},1]},"srcSpan":[[1,21],[1,22]]}
{"token":{"ITvarsym":"<"},"srcSpan":[[1,22],[1,23]]}
{"token":{"ITconid":"EOF"},"srcSpan":[[1,23],[1,26]]}
{"token":{"ITvarsym":">"},"srcSpan":[[1,26],[1,27]]}
{"token":{"ITeof":[]},"srcSpan":[[3,1],[3,1]]}

ファイルから読み込む方法

lexlexall モードのどちらでも使える。単純に引数にダブルクォートかシングルクォートで囲ったパスを渡すだけ。

module Main where

import qualified Language.Haskell.GHC.Parser.Main as M

main :: IO ()
main = M.main

参考リソース

Last updated