【问题标题】:Avoid Xtext multiple alternatives warnings避免 Xtext 多种选择警告
【发布时间】:2015-08-01 16:04:18
【问题描述】:

在我的 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''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: ports+=Port*;
  • 这使得语法仍然没有歧义。你的语法中一定有其他东西导致了这个问题。没有蜜蜂能够繁殖,我无能为力
  • 仅此而已。我认为重要的是“tdg::Port”、“tdg::PortKind”、“tdg::PortType”、“In|Out”和“Numeric|String|Boolean|Tuple”来自ecore模型。
  • 能否分享一下ecore的相关部分?

标签: eclipse dsl xtext emf ecore


【解决方案1】:

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

Model:
    Rule1a | Rule1b;

Rule1a:
    Rule2 | Rule1b;

Rule1b:
    {Rule1b} 'rule1b';

Rule2: 
    {Rule2} 'rule2';

在这里,rule1b 可以通过两条路径从规则“模型”访问:直接从“模型”和间接通过“规则 1a”。

正如 Christian 所说,您的错误消息不可能是由您列出的规则引起的。如果您的语法除这些之外仅包含Model: ports+=Port*;,那么您生成的语法可能与您认为的不同?

无论如何,要找到问题的原因,您必须找出具有模糊实例的规则:打开com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g 第250 行(如日志中所示)并找出它属于哪个规则。在我的示例中,错误在于 Antlr 规则 ruleModel,它对应于 Xtext 规则 Model

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2021-02-04
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多