【问题标题】:What's the proper way to write a rule with both int and strings in xtext?在 xtext 中使用 int 和字符串编写规则的正确方法是什么?
【发布时间】:2019-07-04 16:33:57
【问题描述】:

我正在定义一个 Xtext 语法规则来解析像 YYYY-MM-DDTHH-MM-SS 这样的简单时间戳,但是,当我发送 2019-01-01T08:12:14 之类的东西时,解析器不会解析,但它会在我发送时解析2019-01-01 T 08:12:14

我已经尝试删除规则定义的标记之间的每个空格,但它没有帮助(而且可能没有帮助)

规则是:

Timestamp
    :
        year=INT '-' month=INT '-' day=INT 'T' hour=INT ':' minute=INT (':' second=INT)?
    ;

【问题讨论】:

    标签: antlr xtext


    【解决方案1】:

    在您的情况下,使用 hidden() 子句应该可以解决问题

    Timestamp hidden()
        :
            year=INT '-' month=INT '-' day=INT 'T' hour=INT ':' minute=INT (':' second=INT)?
        ;
    

    但是还有一个问题:

    'T' hour=INT 需要在 T 周围有空格,否则会解析 ID。 你可以使用片段来解决这个问题

    Timestamp
        :
            Date 'T' Time
        ;
    
    fragment Date hidden():
        year=INT '-' month=INT '-' day=INT
    ;
    
    fragment Time hidden():
        hour=INT ':' minute=INT (':' second=INT)?
    ;
    

    但这仍然存在需要空格的问题

    => 我建议为整个事情引入一个最终规则(不确定您是否有冲突的规则)

    Timestamp
        :
           ts=TS
        ;
    terminal TS: INT'-'INT'-'INT'T'INT':'INT(':'INT)?;
    

    【讨论】:

    • 太棒了!我创建了这个终端规则,几乎一切正常,但现在我遇到了另一个问题。在我的 DSL 中,可以进行一些简单的数学计算,并且时间戳和减法之间存在冲突。 (我认为这是由于- 字符)。那么,是否有某种方法可以强制仅在完全符合规则时才考虑该规则?恐怕我没有说清楚,但在我看来,这些规则不应该相互冲突。
    • 要么在模型中使用空格,要么尝试在词法分析器中回溯。我不确定这是否适用于您的情况,也不确定可能会产生什么负面影响。或者 digg 如果 jflex 词法分析器可以做得更好。或尝试将 T INT 移动到终端 TINT: 'T'INT 并使用那个 + 一个 MyID,它允许将 ID 和 TINT 与您的原始规则结合使用 hour=TINT
    猜你喜欢
    • 2012-02-21
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2017-07-10
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多