Parsing ANTLR4中的递归组

Parsing ANTLR4中的递归组,parsing,antlr4,Parsing,Antlr4,我是ANTLR4的新手,我对它的语法很难理解。 假设您使用以下规则对数据进行结构化: 消息是组的多行集合 组由段和可能的修饰符组成 段是一个三字符的字母数字 [修饰符表示一个可选组,该组以] {修饰符表示以}为边界的重复组(组) 这种数据格式的一个例子是: MSH MSA [{ ERR }] [{ NTE }] [ [ PID [{NTE}] ] { ORC [ {

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

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] ;

谢谢,我试试看。当你说它们“自终止”时,是指它在字母数字字符序列的末尾终止,还是说它是]或}?我想我正在考虑像使用分隔符拆分字符串那样的标记化,这可能是错误的想法。感谢你自己,因为每个
组的
alt都是完整的,不需要进一步的信号来表示某个特定组已经结束。我明白了。谢谢你的帮助!