Parsing ANTLR4中的递归组
我是ANTLR4的新手,我对它的语法很难理解。 假设您使用以下规则对数据进行结构化:Parsing ANTLR4中的递归组,parsing,antlr4,Parsing,Antlr4,我是ANTLR4的新手,我对它的语法很难理解。 假设您使用以下规则对数据进行结构化: 消息是组的多行集合 组由段和可能的修饰符组成 段是一个三字符的字母数字 [修饰符表示一个可选组,该组以] {修饰符表示以}为边界的重复组(组) 这种数据格式的一个例子是: MSH MSA [{ ERR }] [{ NTE }] [ [ PID [{NTE}] ] { ORC [ {
- 消息是组的多行集合
- 组由段和可能的修饰符组成
- 段是一个三字符的字母数字
- [修饰符表示一个可选组,该组以]
- {修饰符表示以}为边界的重复组(组)
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的描述如下:
- 消息是组的多行集合
- 组由段和可能的修饰符组成
- 段是一个三字符的字母数字
- [修饰符表示一个可选组,该组以]
- {修饰符表示以}为边界的重复组(组)
// 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都是完整的,不需要进一步的信号来表示某个特定组已经结束。我明白了。谢谢你的帮助!