1
1
好问题。 DR:
细节优先机制不能在备选方案中进行选择
使用
附加约束不选择任何
在特定位置限制的原因是,对于这些位置,解析器生成器可以“证明”它们将产生歧义,因此通过不允许某些嵌套来过滤两个备选方案中的一个不会导致额外的解析错误。(考虑数组索引规则:
从算法上讲,它是一个非常弱的机制,专门为相互递归的组合/表达式类语言定制。该机制的最终目标是确保我们使用的整个表达式语言只能使用1个非终端,并且解析树的形状与抽象语法树非常相似。顺便说一下,Rascal通过sdf2从sdf继承了所有这些考虑。 当前的实现实际上以某种方式无形地“分解”语法或解析表,以获得相同的效果,就好像有人会完全分解语法一样;然而,这些在后台的实现非常特定于所讨论的解析算法。GLR版本与GLL版本有很大的不同,而GLL版本又与数据相关版本有很大的不同。 后分析筛选当然,任何树,包括解析器生成的不明确的解析林,都可以通过使用模式匹配、访问等的流氓程序来操作。您可以编写任何算法来删除所需的树。然而,这需要首先建造整个森林。这是可能的,而且往往足够快,但有一个更快的选择。 由于树是在解析后从解析图自下而上构建的,因此我们也可以在树的构造过程中应用“重写规则”,并删除某些替代项。 例如:
第一条规则将匹配所有树的模糊性集群,并删除
如果您想在备选方案中进行选择:
如果您不想使用树,而是更具体的非终端类
此示例模块使用
使用其他词汇约束进行黑客攻击除了优先级消歧和后解析重写之外,我们还有工具箱中的词汇级消歧机制:
除运算符优先级外,还可以尝试使用这些方法来解决其他类型的歧义,特别是如果不同的可选方案之间的不同子句的长度较短/较长,
在哪里?
明显的/恼人的建议更仔细地考虑一个明确而简单的语法。 有时这意味着在语法中抽象和允许更多的句子,避免使用语法来“类型检查”树。通常最好是过度近似语言的语法,然后使用(静态)语义分析(在更简单的树上)来获得所需的内容,而不是盯着复杂的、模棱两可的语法。
一个典型的例子:只在开始处有声明的C块比到处允许声明的C块更难明确定义。为了一个
这个特殊的例子
总结好问题,谢谢你的耐心。希望这有帮助! |
2
1
这个
所以要解决以下歧义:
字符串
这个
现在只允许
完成这个故事,怎么样
这就是我们拥有的
现在将强制执行:
当你拿一个操作符进位表时,比如这个 c operator precedance table 你几乎可以直接复制它们。 注意这两个消歧功能并不完全相反。 第一个模棱两可的问题也可以通过将两个作品放在这样一个左组中来解决:
因为左边的树是受欢迎的,你现在会得到一棵不同的树
有关更多详细信息,请参见 tutor pages on disambiguation |
josh · Rascal中的模式匹配AST节点 9 年前 |
apil.tamang · 在Rascal中定义未知长度的元组数据类型 9 年前 |
day · “*x”和“x*”之间有什么区别吗? 11 年前 |