在我的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类来自一个核心模型。当我编译dsl语法时,我得到以下警告。我怎样才能避免它们呢?
警告(200):. ./com.isax.testdatagen.dsl/src-gen com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g: 250:1:决策可以匹配输入,如"'port' 'kind' 'in' type' 'String'"使用多个备选方案:1,2因此,备选方案2是禁用该输入警告(200):. ./com.isax.testdatagen.dsl/src-gen com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g: 250:1:决策可以匹配输入,如"port"kind"in"type"Boolean"使用多个备选方案:1,2因此,备选方案2是禁用该输入警告(200):. ./com.isax.testdatagen.dsl/src-gen com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g: 250:1:决策可以匹配输入,如"'port' 'kind' 'in' type' 'Tuple'"使用多个备选方案:1,2因此,备选方案2是禁用该输入警告(200):. ./com.isax.testdatagen.dsl/src-gen com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g: 250:1:决策可以匹配输入,如"'port' 'kind' 'in' 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' 'in' 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' 'in' 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"in"type"Boolean"使用多个备选方案:1,2因此,备选方案2是禁用该输入警告(200):. ./com.isax.testdatagen.dsl.ui/src-gen com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g: 854:30:决策可以匹配输入,如"'port' 'kind' 'in' type' 'Tuple'"使用多个备选方案:1,2因此,备选方案2是禁用
这种"多选项"警告可能是由使用两个选项"路径"可到达的规则引起的,例如
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
。