ANTLR4中的递归组

时间:2018-04-30 21:20:36

标签: parsing antlr4

我是ANTLR4的新手,我的语法很困难。 鉴于您使用以下规则构建数据:

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

此数据格式的一个示例是:

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

所以读作:

  • 必需且单一的MSH细分
  • 必需且单一的MSA细分
  • 由可选的PID组和可选的重复NTE组成的可选组和具有可选重复可选TQ1和可选重复TQ2的重复ORC组
  • 依旧......

到目前为止,我有:

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,但我不确定我是否在正确的轨道上。我会非常感谢任何指针或提示。

1 个答案:

答案 0 :(得分:1)

DSL的给定描述:

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

可以直接翻译成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] ;