我正在研究一种使用大括号来识别层次结构的数据定义语言。
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 来保持父/子检查的完整性)。我担心可读性和维护麻烦。
谢谢