私は中かっこを使用して階層を識別するデータ定義言語に取り組んでいます。
typeA idS
{
paramX = value
typeB idT
{
paramY = value
}
}
特定のタイプのブロックに対してどのパラメーターと子タイプが有効かを検証するためのさまざまなルールが多数あります。
既存のブロックまたは名前と値のペアのセットの周りに特別なブロック タイプを配置できるようにする機能を追加したいと考えています。
BLOCK
{
typeA idS
{
BLOCK
{
paramX = value
}
BLOCK
{
typeB idT
{
paramY = value
}
}
}
}
既存のすべての型に BLOCK サポートを具体的に追加する必要がなく、子パラメーター/型が特定の親に対して有効であるというパーサー チェックを失うことなく、ブロック内のすべてを許可するブロックを作成する方法はありますか
私はワイルドカード、貪欲と非貪欲を無駄に使用しようとしました。
block: BLOCK '{' (options {greedy=false;} : .* ) '}'
他の回答は、構文述語で解決できることを示唆していますが、それらの使用方法を理解できません(オンラインソースへのリンクをいただければ幸いです)。
他のすべてのルールに触れずにこれを行う方法はありますか? (親/子のチェックをそのまま維持するために、多くの BLOCK_subtypes を必要としないことを願っています)。可読性とメンテナンスの手間が気になります。
ありがとう