【问题标题】:Xtext - Validating for duplicate namesXtext - 验证重复名称
【发布时间】:2018-05-29 16:36:15
【问题描述】:

我有以下语法,但我想对此进行一些验证。如果“玩家”列表中有重复的名字,我想出错。

语法:

Football:
    'Club' name=STRING playerList=PlayerList
     footballObjects+=FootballObject
;

FootballObject:
     Player | Coach
;

PlayerList:
     players+=[Player] ( players+=[Player] )* 
;

Player:
    'Player' name=ID
;

我尝试了以下方法:

@Check
def checkGreetingStartsWithCapital(Football model) {
    val names = newHashSet
    for (g : model.playersList.players) {
        if(!names.add(g.name))
            error("duplicate" , g, FOOTBALLPACKAGE.Literals.FOOTBALL__PLAYERS_LIST)
    }
}

但这不起作用。任何想法为什么?

【问题讨论】:

  • 不应该是if(!names.add(g.name))吗?
  • @lwi 你是对的。我改变了它,但它仍然没有给出任何错误。会不会是字面量?
  • 我在您的语法中看不到任何重复 - 据我所知,players 不能包含多个元素。
  • @sepp2k 我已经更新了我的问题。
  • 我认为最好发布一个实际的MCVE,包括您正在测试的输入。

标签: validation xtext xtend


【解决方案1】:

最简单的方法是通过在引用的播放器上而不是在playersList 本身上调用error 来标记列表条目,并调用同样采用索引的error 方法。例如

error("bad", playersList, MyDslPackage.Literals.PLAYERS_LIST__PLAYERS, index)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多