arg_p

Hamigaki.Bjamを再開しました。
昨日も悩んでいたbjamのトークン切り出しですが、bjamのソースを眺めていたところ、εパーサーを使って独自のパーサーを定義し、スキップパーサーと組み合わせることで解決できることに気が付きました。


bjamの字句解析は、

  1. 空白とコメントがあれば読み飛ばす
  2. 空白かEOFが見つかるまで読む
  3. 空白以降は次のトークンに残す

という動きなので、1.の部分はスキップパーサーに任せて、εパーサーで空白かEOFを読めばよいことになります。
つまり、キーワードifのパーサーはこう書けるわけです。

lexeme_d
[
    chseq_p("if") >> eps_p(space_p|end_p)
]

このやり方で、キーワード用パーサーkeyword_p、通常のトークン用arg_p、SCAN_PUNCTモード用のnon_punct_pを作成しました。
今日の差分


使い方はこんな感じです。

assert(parse("if x if for", keyword_p("if") >> arg_p >> +non_punct_p, space_p).full);

これでようやくbjam_grammarのあちこちにあった空白の処理を単純化できます。
結果的にコンパイル時間も短縮できるはずです。