arg_p
Hamigaki.Bjamを再開しました。
昨日も悩んでいたbjamのトークン切り出しですが、bjamのソースを眺めていたところ、εパーサーを使って独自のパーサーを定義し、スキップパーサーと組み合わせることで解決できることに気が付きました。
bjamの字句解析は、
- 空白とコメントがあれば読み飛ばす
- 空白かEOFが見つかるまで読む
- 空白以降は次のトークンに残す
という動きなので、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のあちこちにあった空白の処理を単純化できます。
結果的にコンパイル時間も短縮できるはずです。