【问题标题】:Xtext - Rule and validation issuesXtext - 规则和验证问题
【发布时间】:2019-11-21 11:05:24
【问题描述】:

我正在使用 Xtext 创建一个 DSL,它将用于生成图像。但是因为我对 Xtext 完全不认识,所以遇到了一些问题,希望您能给我一些指导。

最终我希望用户使用以下编码结构:

bgcolor: ffffff
bgsize: 500x500
box1:
    bgcolor: 000000
    size: 300x300
    position: 100x100
box2:
    bgcolor: eeeeee
    size: 300x300
    position: 100x100

我在 Xtext 中想出的是以下内容(我没有对 MWE2 进行任何更改):

Image : (ImageElement+=ImageElementType)*;
ImageElementType:  BgColor | BgSize | Box;


// SET BASIC TERMINAL RULES
terminal SIZE : INT 'x' INT;

terminal COLOR : COLOR_BASIC | COLOR_HEX;
terminal COLOR_BASIC : 'green' | 'red' | 'blue' | 'yellow' | 'black' | 'white' | 'orange' | 'purple' | 'pink';
terminal DIGIT : ('0'..'9'|'a'..'f'|'A'..'F');
terminal COLOR_HEX : DIGIT DIGIT DIGIT DIGIT DIGIT DIGIT;

BgColor: name='bgcolor:' value=COLOR;
BgSize: name='bgsize:' value=SIZE;  

Box: name='box:';

我需要解决几个问题,但我想知道解决这些问题的最佳方法是什么。

  • 如何为终端规则 SIZE 中使用的 INT 设置边界。
  • 如何设置 bgcolor: 或 bgsize: 只能使用一次?
  • 如何设置 box1、box2 等由相同的规则 Box: 构造?
  • 如何设置 box1: 下指定的属性属于该框?
  • 如何强制缩进?

我不是在寻求直接的解决方案(虽然会很棒;-))但只是一些如何解决这些问题的提示。所有这些都通过编辑 MWE2 工作流程解决了吗?我对 Xtext 的文档有一些困难。

提前感谢您的时间和 cmets!

亲切的问候

【问题讨论】:

    标签: xtext


    【解决方案1】:

    如何设置 bgcolor: 或 bgsize: 只能使用一次?

    使它们成为ImageElementType的属性

    如何设置 box1、box2 等由相同的规则 Box: 构造?

    将属性名称添加到Box

    如何设置 box1: 下指定的属性属于那个盒子?

    一种可能性是添加一个新的Property 概念并将它们添加到Box 规则中

    如何强制缩进?

    您可以创建一种对空格敏感的语言,例如 Python,但更好的办法是为您的语言实现 Formatter 并在保存之前自动格式化模型。

    关于最终规则 SIZE 和一般情况...在大多数情况下,最好有更通用的语法并在相应的 Language Validator 或 ValueConverter 中应用您的限制。

    不确定确切的语言规范是什么,但这里是一个可能的起点。保留终端规则:

    Image:
        ImageElement+=ImageElementType*;
    
    ImageElementType:
        'bgcolor' ':' bgcolor=COLOR
        'bgsize' ':' bgsize=SIZE
        boxes+=Box*;
    
    Box:
        name=ID ':'
        properties+=Property*;
    
    Property:
        name = KnownProperties ':' value = PropertyValue
    ;
    
    PropertyValue:
        SIZE | COLOR | DIGIT
    ;
    
    enum KnownProperties:
        bgcolor | size | position;
    
    // SET BASIC TERMINAL RULES
    terminal SIZE:
        INT 'x' INT;
    terminal COLOR:
        COLOR_BASIC | COLOR_HEX;
    terminal COLOR_BASIC:
        'green' | 'red' | 'blue' | 'yellow' | 'black' | 'white' | 'orange' | 'purple' | 'pink';
    terminal DIGIT:
        ('0'..'9' | 'a'..'f' | 'A'..'F');
    terminal COLOR_HEX:
        DIGIT DIGIT DIGIT DIGIT DIGIT DIGIT;
    
    

    【讨论】:

    • 感谢您的回答。我会开始玩它的。
    • 如何定义只有 box1、box2、box3 等用作 Box 组件,而不是 boxing1、boxing2 等?
    • 我更改了: Box: name =BOXNUMBERS ':' 并添加了:终端 BOXNUMBERS : 'box' INT;这很好用!
    • 这实际上是我应该使用终端的方式还是应该尽可能避免使用终端?否则我应该如何描述它们,而当我从每个语句中删除终端时,我会收到许多错误消息。如前所述,我对 Xtext 完全陌生,所以我很抱歉这些愚蠢的简单问题我可能可以在网上某个地方找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多