2019/7/8 LL(2)パーサーの実装に関して詰まっていること
質問のための言語化
やりたいこと
Rustを用いてLL(2)パーサーの実装がしたい
現状の実装はPeekbaleを用いたもの
これはpeek()を使うことでiteratorを進めずに一つ先の要素を確認することができるが、
今回は2つ先を確認したい
なので、よくわかっていないがitertoolsのmultipeek()を使うと実装できそうな予感がしている
そこで、multipeek()を簡単なコードで動かしてみようと試みた
code:rs
use itertools::Itertools;
use std::iter::Peekable;
fn main() {
let it = vec!1, 2, 3, 4, 5, 6, 7, 8, 9;
let mut it = it.into_iter();
it.multipeek();
}
しかし、型が合わないのでコンパイルエラーになる
multipeekの引数はIntoIteratorのトレイト境界付きの型
じゃあ、IntoIteratorどうやって作るんだ→ドキュメントの「IntoIterator」をクリックする、
code:rs
let mut iter = v.into_iter();
みたいなことしてるので、以下のように書いてみる。動かん。
code:rs
iter.multipeek();
code:rs
// 以下のようにすると動いた
itertools::multipeek(it);
次はこれをどう使っていくか
ここか
仮説が多すぎて検証が追いついていない状態mrsekut.icon
具体的には
ここ
実装したいことは
次の要素にVat(s)Tokenが来た時に
その次の要素が:=なら変数束縛
実装済み
それ以外なら、変数呼び出し
これができない
と、なるためのparserの実装
知りたいこと
multipeek()を使った簡単なサンプルコード
ドキュメントを読んだときの思考の順序
その他
わかっていないことがわかっていない
Documentの読み方?がよくわからない
一methodに対して一exampleがあると嬉しい
外部のCrateの使い方をあまりかっていない
Traitのこともいまいちわかっていない
そもそも実装しようとしている言語の構文がおかしい説
Peekableのpeekable()に対応するのがMultiPeekのmultipeek()?
reset_peek()を挟まないと、peekし続けるのか