1

私は 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トークンを一致させるために、他の引数を指定して呼び出す必要があります=>か?

4

1 に答える 1