避免Xtext多个替代警告

时间:2015-05-20 12:04:53

标签: eclipse dsl xtext emf ecore

在我的xtext dsl中我定义了以下规则:

Port returns tdg::Port:
    'port'
    'kind' kind=Kind
    'type' type=Type;

enum Kind returns tdg::PortKind:
    In='in' | Out='out';

enum Type returns tdg::PortType:
    Numeric | String | Boolean | Tuple;

tdg课程来自ecore模型。 当我编译dsl语法时,我收到以下警告。我该如何避免它们?

  

警告(200):   ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1:   决策可以匹配输入,例如''port''kind''''type''String'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1:   决策可以匹配输入,例如''port''kind''''type''Boolean'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1:   决策可以匹配输入,例如''type''kind''''type''Tuple'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1:   决策可以匹配输入,例如''port''kind''''type''Numeric'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30:   决策可以匹配输入,例如''port''kind''''type''Numeric'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30:   决策可以匹配输入,例如''port''kind''''type''String'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30:   决策可以匹配输入,例如''port''kind''''type''Boolean'“   使用多种替代方案:1,2结果,替代方案2是   禁用该输入警告(200):   ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30:   决策可以匹配输入,例如''type''kind''''type''Tuple'“   使用多种替代方案:1,2结果,替代方案2是   已禁用该输入

1 个答案:

答案 0 :(得分:1)

这种“多种替代”警告可能是由使用两种“路径”替代方案可达到的规则引起的,例如

Model:
    Rule1a | Rule1b;

Rule1a:
    Rule2 | Rule1b;

Rule1b:
    {Rule1b} 'rule1b';

Rule2: 
    {Rule2} 'rule2';

在这里,rule1b可以使用两条路径从规则“Model”到达:直接来自“Model”,间接来自“Rule1a”。

正如Christian所说,您的错误消息不可能由您列出的规则引起。如果你的语法除了这些之外只包含Model: ports+=Port*;,那么你的语法可能会比你想象的还要多吗?

在任何情况下,要查找问题的原因,您必须确定具有不明确实例的规则:打开com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g第250行(如日志中所示)并找出它所属的规则。在我的示例中,错误在于Antlr规则ruleModel,它对应于Xtext规则Model