我是ANTLR4的新手,我的语法很困难。 鉴于您使用以下规则构建数据:
此数据格式的一个示例是:
MSH
MSA
[{ ERR }]
[{ NTE }]
[
[
PID
[{NTE}]
]
{
ORC
[
{
[TQ1]
[{ TQ2 }]
}
]
//shortened for brevity
}
]
所以读作:
到目前为止,我有:
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,但我不确定我是否在正确的轨道上。我会非常感谢任何指针或提示。
答案 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] ;