次の例のEBNF文法があるとします。これは完璧な文法ではありませんが、問題を正しく示すはずです。 Word
は、文字と数字のいくつかの数とNumber
あるRustデータ構造で再帰的なEBNF文法を表現する方法は?
Statement = FunctionDefinition | Assignment | Expr ;
Expr = { Term | "(" , Expr , ")" } ;
Assignment = Word , "=" , Expr ;
FunctionDefinition = Word , { Word } , "=" , Expr ;
Term = Word | Number
は有効な数値リテラルです。
私はそうのような錆でこれを表現するために起動することができます。しかし、すでにここに問題があります
enum Statement {
FunctionDefinition {
name: String,
params: Vec<String>,
body: Expr,
},
Assignment {
name: String,
body: Expr,
},
//TODO: Expr
}
。 Expr
を追加するにはどうすればよいですか? Expr
はおそらく他のいくつかの場所でも使用されているので、独自の定義を持つべきです。 Expr
に独自の定義を与え、それをこの列挙に追加すると、それが再定義されます。
私はとにかく続けるとExpr
を定義しようとして起動した場合、私はさらに多くの問題に実行:
type Expr = Vec<...?...>;
// or maybe...
struct Expr {
terms: Vec<Expr>, // but what about Term??
}
私はExpr
は必ずしもそれがあるので、それが自身の構造体や列挙型である必要はありませんので、type
を使用しようとしましたTerm
またはそれ以外のExpr
のコレクションのみです。これを再帰的に定義することは困難です。 ExprとTermの共用体型をエミュレートしようとすると、その列挙体にExpr
を再定義し、Enum内にTerm
を定義して、必要な他の構造体でTermを使用できなくする必要があります。
素晴らしいです!ありがとう!私は 'Expr(Expr)'や 'Term(Term)'を回避する方法がないと思います。一種の醜いですが、うまくいきます。 –