【发布时间】:2020-11-09 16:27:38
【问题描述】:
我将SemVer 2 BNF grammar 翻译成下面的Antlr 语法。
grammar SemVer;
@header {
package com.me.semver;
}
semVer : normal ('-' preRelease)? ('+' build)? ;
normal : major '.' minor '.' patch ;
major : NUM ;
minor : NUM ;
patch : NUM ;
preRelease : PRE_RELEASE ('.' preRelease)* ;
build : BUILD ('.' build)*;
NUM : '0'
| POSITIVE_DIGIT
| POSITIVE_DIGIT DIGITS
;
BUILD : ALPHANUM
| DIGITS
;
PRE_RELEASE : ALPHANUM
| NUM
;
fragment
ALPHANUM : NON_DIGIT
| NON_DIGIT CHARS
| CHARS NON_DIGIT
| CHARS NON_DIGIT CHARS
;
fragment
CHARS : CHAR+ ;
fragment
CHAR : DIGIT
| NON_DIGIT
;
fragment
NON_DIGIT : LETTER
| '-'
;
fragment
DIGITS : DIGIT+ ;
fragment
DIGIT : '0'
| POSITIVE_DIGIT
;
fragment
POSITIVE_DIGIT : [1-9] ;
fragment
LETTER : [a-zA-Z] ;
但解析1.0.0-beta+exp.sha.5114f85 会出现以下错误:
第 1:4 行不匹配的输入“0-beta”需要 NUM
监听器的输出如下:
Normal: 1.0.0-beta
Major: 1
Minor: 0
Patch: 0-beta
Build: exp.sha.5114f85
Build: sha.5114f85
Build: 5114f85
显然,补丁版本不是应有的版本。正确的输出应该是 Patch = 0、Pre release = beta 和 Build = exp.sha.5114f85。
如何修正语法?
【问题讨论】:
标签: antlr antlr4 grammar bnf semantic-versioning