Parsing Xtext中的数字/字符串语法错误

Parsing Xtext中的数字/字符串语法错误,parsing,xtext,Parsing,Xtext,我试图创建包含数字和字符串的语法,如下所示: 日期:2013年3月2日 我创建了一套规则,或多或少地适应了这一点: Date: 'Date': DAY Month YEAR ; terminal DAY: ('1'..'9') | (('1'..'3')('0'..'9')) ; Month: name = ('Jan'|'Feb'|'Mar'|'Apr) ; terminal YEAR ('0'..'2)('0'..'9')('0'..'9')('

我试图创建包含数字和字符串的语法,如下所示:

日期:2013年3月2日

我创建了一套规则,或多或少地适应了这一点:

Date:
     'Date': DAY Month YEAR
;

terminal DAY:
     ('1'..'9') | (('1'..'3')('0'..'9'))
;

Month:
     name = ('Jan'|'Feb'|'Mar'|'Apr)
;

terminal YEAR
     ('0'..'2)('0'..'9')('0'..'9')('0'..'9')
;
这套规则似乎有一些问题:

  • 写入的日期规则似乎生成了一个错误:“不能在规则中更改两次类型”。我不知道这意味着什么,除了Xtext显然不允许在同一规则中使用数字和选择字符串

  • 如果从Date中删除Month规则,Xtext将编译,但语法似乎不正确。DAY规则应该在1到9之间的一位数和两位数之间提供一个选择,但出于某种原因,它只接受两位数。因此,虽然我可以输入一行,如:

  • 日期:2013年12月12日

    接受,但日期如下:

    日期:2013年2月2日

    事实并非如此

    我是否在规则中发现了一个错误,它破坏了终端规则中的数字?还是有什么遗漏导致我的数字中忽略了“|”?另外:“不能在一条规则内两次更改类型”错误到底意味着什么?我如何修复它


    请有人提出建议。

    这里有一个设计问题。通常,您必须尽可能少地使用自定义端子。自定义终端对语法有全局影响,使语法不那么灵活,错误恢复效率低下

    我理解您的意图:您希望约束您的DSL以防止解析不敏感的数据。这是一个好主意,但定制终端不是为此类任务而设计的。经验法则是:

    • 尽可能多地使用标准端子
    • 让你的lexer解析几乎所有的输入
    • 让解析器检测语法错误(如缺少“]”),但不检测域约束,如(1)
      Date:
          'Date': day=INT month=Month year=INT
      ;
      
      enum Month:
          JANUARY='Jan'
      |   FEBRUARY='Feb'
      |   MARCH='Mar'
      |   APRIL='Apr'
      ;