当前位置: 首页 > 知识库问答 >
问题:

Xtext-规则和验证问题

易昌翰
2023-03-14

我正在用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:只能使用一次?
  • 如何设置box 1、box 2等是由相同的规则构造的Box:?
  • 如何设置box 1:下指定的属性属于该框?
  • 如何强制缩进?

我并不是在寻求一个直接的解决方案(尽管这很好;-),而是一些如何解决这些问题的技巧。所有这些都是通过编辑MWE2工作流解决的吗?我在使用Xtext的文档时遇到了一些困难。

提前感谢您的时间和评论!

亲切的问候

共有1个答案

涂玉韵
2023-03-14

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

将它们设置为ImageElementType

如何设置box1、box2等是从同一个规则框构造的:?

将属性名称添加到框中

如何设置box1:下指定的属性属于该框?

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

我怎样才能强制缩进?

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

关于终端规则的大小和一般。。。在大多数情况下,最好使用更通用的语法,并在相应的语言验证器或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;

 类似资料:
  • 验证规则的定义通常有两种方式,如果你使用了验证器的话,通常通过rule属性定义验证规则,而如果使用的是独立验证的话,则是通过rule方法进行定义。 属性定义 属性定义方式仅限于验证器,通常类似于下面的方式: <?php namespace app\index\validate; use think\Validate; class User extends Validate { prot

  • 我不明白关键字的区别("-

  • 自定义了一个表单验证类,但是在django中当我clean_UserName这个方法执行了并抛出异常的时候,其他的验证方法还会继续执行,怎么才能在一个验证方法抛出异常后其他的方法都中止执行呢?

  • 我正在尝试验证密码字段是否存在。我想允许某人编辑用户,他们可能想更改用户密码,也可能不想更改用户密码。所以我想我可以使用Laravels验证规则,特别是“有时”规则来实现这一点。我有一套规则: 例如,对于其他字段,通常会有其他规则,而对于密码,则会有更严格的规则。如果传递的数据中存在密码字段,我希望这只应用min:8规则,但是如果我将密码字段留空,则会出现一个验证错误,表明密码字段是必需的。 我不

  • 如何在验证器中添加密码验证规则? 验证规则: 密码包含以下五个类别中至少三个类别的字符: 英文大写字符(A–Z) 英文小写字符(a–z) 以10位数字(0–9)为基数 非字母数字(例如:!、$、#或%) Unicode字符 如何在验证器规则中添加上述规则? 我的代码在这里

  • 我尝试在Xtext中定义浮点类型,但是我在生成ariti事实时收到错误消息: 我的浮动终端如下: 我的浮点是复制一个能够被Java接受的浮点:1.1、1、0.1