Xtext - 在没有语义谓词的情况下解决歧义?

Posted

技术标签:

【中文标题】Xtext - 在没有语义谓词的情况下解决歧义?【英文标题】:Xtext - solving ambiguity without semantic predicates? 【发布时间】:2012-11-22 22:39:49 【问题描述】:

问题

Entry
    : temp += (Expression | Declaration | UserType)*
;

Declaration
    : Type '*' name=ID ';'
;

Expression
    : temp1 = Primary ('*' temp2 += Primary)* ';'
;

Primary
    : temp1 = INT
    | temp2 = [Declaration]
;

Type
    : temp1 = SimpleType
    | temp2 = [UserType]
;

SimpleType
    : 'int' | 'long'
;

UserType
    : 'typedef' name=ID ';'
;

规则 DeclarationExpression 不明确,因为这两个规则共享完全相同的语法,并且出现问题是因为交叉引用 [Declaration][UserType] 都基于终端规则 ID .

因此为上述语法生成代码将引发 ANTLR 警告:

Decision can match input such as "RULE_ID '*' RULE_ID ';'"
using multiple alternatives: 1, 2

目标

我希望选择能够首先解决交叉引用的规则。

假设如下:

typedef x;

int* x;
int* b;

AST 的

x*b

应该看起来像:

x = Entry -> Expression -> Primary (temp1) -> [Declaration] -> Stop!
* = Entry -> Expression -> Primary '*' -> Stop!
b = Entry -> Expression -> Primary (temp2) -> [Declaration] -> Stop!

因此

Entry -> Declaration

永远不应该考虑,因为

Entry -> Expression -> [Declaration]

已经可以验证交叉引用[Declaration]

问题

因为我们在 Xtext 中没有语义谓词(或者我错了吗?),有没有办法验证交叉引用并根据该验证明确选择该规则?

PS:有些人可能已经知道,这个问题源于我试图用 Xtext 实现的 C 语言。

【问题讨论】:

【参考方案1】:

关于当前版本的 Xtext,不支持语义谓词。

交叉引用被解析到它们的终端(在我的情况下UserRoleDeclaration 到终端ID)。并且仅在链接过程中验证引用,在我的情况下为时已晚,因为 AST 已经创建。

使用上下文相关规则决策的唯一可能方法是在说明语法的语法中实际定义一个抽象规则。在上面的示例中,规则 ExpressionDeclaration 将被重写为 1。然后在必要的领域进行语义验证,例如使用范围界定的内容辅助。

【讨论】:

以上是关于Xtext - 在没有语义谓词的情况下解决歧义?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“等待谓词”解决了条件变量的“丢失唤醒”?

在没有 tableView 的情况下使用带有 fetch 的谓词

如何为 IDWriteTextLayout 指定歧义字符的方向性?

Django 字段查询谓词表

Django 字段查询谓词表

使用 NSFetchedResultsController 从核心数据模型中获取谓词到各个部分