【问题标题】:How to make Enum literal case insensitive in Xtext如何在 Xtext 中使枚举文字不区分大小写
【发布时间】:2026-01-11 12:30:02
【问题描述】:

我在 Xtext 语法文件中定义了如下 EnumRule:

enum MySpec_directionEnum: left='"left"' | right='"right"' | none='"none"';

使用此规则,允许的枚举值为 "left", "right" and "none"(全部小写)。我希望能够在任何情况下允许这些值(不区分大小写)。例如,我还希望允许值为 "left" or "Left" or "LEFT" or "LeFt" 等等。

但我只希望 MySpec_directionEnum 枚举的值不区分大小写,而不是我的语法文件中的所有枚举。是否可以通过语法或某种验证?

【问题讨论】:

    标签: validation grammar case-insensitive rule xtext


    【解决方案1】:

    我认为你最好的选择是用普通的解析器规则替换枚举规则,比如

    MySpec_directionEnum:
        value=STRING;
    

    并检查 value 是否是验证器中允许的字符串(“left”、“right”或“none”的不区分大小写的变体):

    @Check
    public void check(MySpec_directionEnum e) {
        String lowercaseValue = e.getValue().toLowerCase();
        if (!lowercaseValue.equals("left")) {
            error("Expected \"left\".", e, 
                ArithmeticsPackage.Literals.MY_SPEC_DIRECTION_ENUM__VALUE,
                validationMessageAcceptor.INSIGNIFICANT_INDEX);
        }
    }
    

    【讨论】:

    • 感谢您的解决方案。它确实解决了我的查询。有没有更好的解决方案?
    • @Kuldeep Jain:我不知道。
    • 这可能不会给出完成建议。
    【解决方案2】:

    如果你非常努力地写出所有可以尝试的可能性

    enum TestEnum:
        x='x'| x='X' | y='y' | y='Y'
    ;
    

    【讨论】:

    • 这会从 XText 发出警告。