【问题标题】:Recursive groups in ANTLR4ANTLR4 中的递归组
【发布时间】:2018-10-11 00:18:56
【问题描述】:

我是 ANTLR4 的新手,我在语法方面遇到了困难。 假设您使用以下规则构建数据:

  • 消息是组的多行集合
  • 一个组由一个段和可能的修饰符组成
  • 段是三个字符的字母数字
  • [ 修饰符表示一个可选组,该组(组)由 ] 界定
  • 一个 { 修饰符表示一个重复组,该组(该组)由 } 界定

这种数据格式的一个例子是:

MSH
MSA
[{ ERR }]
[{ NTE }]
[
    [
        PID
        [{NTE}]
    ]
    {
        ORC
        [
             {
                  [TQ1]
                  [{ TQ2 }]
             }
        ]
    //shortened for brevity
    }
]

所以写成:

  • 一个必需的单数 MSH 段
  • 必需的单一 MSA 段
  • 一个可选组,由一个可选的 PID 组和可选的重复 NTE 以及一个 ORC 的重复组和一个可选的重复 TQ1 和可选的重复 TQ2 组成
  • 等等……

到目前为止我有:

message : group+ NEWLINE ;

group : ID+
      | (ID | '{'group'}'
      | (ID | '['group']'
      ;

OPTSTART : '[' ;
OPTEND : ']' ;
REPSTART : '{' ;
REPEND : '}' ;
ID : [a-zA-Z0-9]*
WS : [ \t\r\n]+ -> skip ;

我现在卡住了。我已经设法让解析树解析 MSH 和 MSA,但我不确定我是否走在正确的轨道上。如果您有任何指示或提示,我将不胜感激。

【问题讨论】:

    标签: parsing antlr4


    【解决方案1】:

    DSL的给定描述:

    • 消息是组的多行集合
    • 一个组由一个段和可能的修饰符组成
    • 段是三个字符的字母数字
    • [ 修饰符表示一个可选组,该组(组)由 ] 限制
    • 一个 { 修饰符表示一个重复组,该组(该组)由 } 界定

    可以直接翻译成ANTLR语法:

    // each group self-terminates, so no NL terminal required
    // use EOF terminal to ensure that entire source is parsed
    message : group+ EOF ;
    
    // list each possible representation of a group
    group   : LBRACK group RBRACK
            | LBRACE group RBRACE
            | SEGMENT 
            ;
    
    // literal implementation of a segment
    SEGMENT : Char Char Char ;
    
    // define literals only once
    LBRACK  : '[' ;
    RBRACK  : ']' ;
    LBRACE  : '{' ;
    RBRACE  : '}' ;
    
    // all whitespace is inconsequential
    WS      : [ \t\r\n]  -> skip ;
    
    fragment Char : [a-zA-Z0-9] ;
    

    【讨论】:

    • 谢谢,我试试看。当您说它们“自动终止”时,这是否意味着它在字符的字母数字系列的末尾终止,或者它是 ] 或 }?我想我正在考虑像使用分隔符拆分字符串一样进行标记,这可能是错误的思考方式。谢谢
    • 自终止,即每个 group alt 都是完整的,不需要进一步发出特定组已结束的信号。
    • 我想通了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多