私は proc-macros と syn を使用して小さなドメイン固有言語に取り組んでおり、フォーム上の一連の演算子を解析したいと考えています。
lhs + rsh => res
lhs - rsh => res
また
lhs += rsh
lhs -= rsh
など。
私はsyn
クレートを使用してこれを行っておりParser
、必要なさまざまな構造を実装しています。私の考えでは、最初の 3 つのトークンの後に先読みを使用して、これらを次のように解析できると考えました。
let lookahead = input.lookahead1();
let lhs = input.parse()?;
let op = input.parse()?;
let rhs = input.parse()?;
// now, conditionally parse the res part of an operator
let res = if lookahead.peek(syn::token::FatArrow) {
input.parse::<syn::token::FatArrow>()?;
Some(input.parse()?)
} else { None };
問題は、 whilesyn::token::FatArrow
が を呼び出すときのトークンであり=>
、 を呼び出すときparse
ではないように見えることpeek
です。
// This says false
println!("do we see =>? {}", lookahead.peek(syn::token::FatArrow));
// this also says false
println!("do we see =>? {}", lookahead.peek(Token![=>]));
解析は正常に機能しますが、先を見通すことができなければ、2 つのケースを区別できません。(まあ、入力ストリームをフォークして両方のルールを試してから、ストリームを機能するものに置き換えることでできますが、次のトークンのピークが問題を解決する方法を知っていれば、それは少し劇的に思えます)。
ここで何が間違っていますか?peek
トークンを一致させるために、他の引数を指定して呼び出す必要があります=>
か?