C# で出力したいので、GOLD パーサー ビルダーを使用してスクリプト言語の文法を作成しようとしています。ただし、パーサーは明らかに端末が一意であることを望んでいます。しかし、端末の意味は状況依存である可能性があります?! 記号「-」を考えてみましょう。-x
との両方x-y
が有効であり、次のように文法を書くことができます。
! -------------------------------------------------
! Terminals
! -------------------------------------------------
Opers = [+-*/]
! -------------------------------------------------
! Rules
! -------------------------------------------------
<Expression> ::= <Expression> <Operator> <Expression>
| '-' <Expression>
| <Value>
<Operator> ::= Opers
ただし、シンボル '-' は 2 回定義されています。1 回目は の 2 番目の生成規則で暗黙的に (!) 定義されたシンボルによって、<Expression>
もう 1 回はターミナル (Opers によって定義されます) として定義されています。
さらに、文字列には - 記号も含めることができ、'-' !? の 3 番目の定義が追加されます。これをどのように回避しますか?これに関する情報は、GOLD のドキュメントや Web のどこにもありません。私が知らないパーサービルダーを扱ういくつかの主要な方法があると思います。
これがテーブルベースのパーサーで解決できない問題である場合、C# 出力が必要なため、どのような代替手段がありますか?