Browse Source

Update: Lexer and parser

Leonardo Di Donato 8 years ago
parent
commit
ffaf5f3418
4 changed files with 209 additions and 80 deletions
  1. 4 0
      grammar/Urn.tokens
  2. 4 0
      grammar/UrnLexer.tokens
  3. 44 42
      grammar/urn_lexer.go
  4. 157 38
      grammar/urn_parser.go

+ 4 - 0
grammar/Urn.tokens

@@ -1,4 +1,8 @@
 Urn=1
 Part=2
 Colon=3
+Hyphen=4
+Whitespace=5
 ':'=3
+'-'=4
+' '=5

+ 4 - 0
grammar/UrnLexer.tokens

@@ -1,4 +1,8 @@
 Urn=1
 Part=2
 Colon=3
+Hyphen=4
+Whitespace=5
 ':'=3
+'-'=4
+' '=5

+ 44 - 42
grammar/urn_lexer.go

@@ -13,46 +13,46 @@ var _ = unicode.IsLetter
 
 
 var serializedLexerAtn = []uint16{
-	3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 5, 89, 8, 
+	3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 7, 90, 8, 
 	1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 
 	7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 
-	13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 3, 2, 3, 2, 3, 3, 
-	3, 3, 5, 3, 38, 10, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 
-	3, 6, 6, 6, 49, 10, 6, 13, 6, 14, 6, 50, 3, 7, 3, 7, 6, 7, 55, 10, 7, 13, 
-	7, 14, 7, 56, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 5, 10, 66, 10, 
-	10, 3, 11, 3, 11, 5, 11, 70, 10, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 
-	5, 13, 77, 10, 13, 3, 14, 3, 14, 5, 14, 81, 10, 14, 3, 15, 3, 15, 3, 16, 
-	3, 16, 3, 16, 5, 16, 88, 10, 16, 2, 2, 17, 3, 3, 5, 4, 7, 5, 9, 2, 11, 
-	2, 13, 2, 15, 2, 17, 2, 19, 2, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 2, 
-	3, 2, 11, 4, 2, 87, 87, 119, 119, 4, 2, 84, 84, 116, 116, 4, 2, 80, 80, 
-	112, 112, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 42, 43, 45, 46, 11, 
-	2, 35, 35, 38, 38, 41, 41, 44, 44, 48, 48, 61, 61, 63, 63, 66, 66, 97, 
-	97, 4, 2, 67, 72, 99, 104, 6, 2, 37, 37, 39, 39, 49, 49, 65, 65, 2, 87, 
-	2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 3, 33, 3, 2, 2, 2, 
-	5, 37, 3, 2, 2, 2, 7, 39, 3, 2, 2, 2, 9, 41, 3, 2, 2, 2, 11, 45, 3, 2, 
-	2, 2, 13, 54, 3, 2, 2, 2, 15, 58, 3, 2, 2, 2, 17, 62, 3, 2, 2, 2, 19, 65, 
-	3, 2, 2, 2, 21, 69, 3, 2, 2, 2, 23, 71, 3, 2, 2, 2, 25, 76, 3, 2, 2, 2, 
-	27, 80, 3, 2, 2, 2, 29, 82, 3, 2, 2, 2, 31, 87, 3, 2, 2, 2, 33, 34, 5, 
-	9, 5, 2, 34, 4, 3, 2, 2, 2, 35, 38, 5, 11, 6, 2, 36, 38, 5, 13, 7, 2, 37, 
-	35, 3, 2, 2, 2, 37, 36, 3, 2, 2, 2, 38, 6, 3, 2, 2, 2, 39, 40, 7, 60, 2, 
-	2, 40, 8, 3, 2, 2, 2, 41, 42, 9, 2, 2, 2, 42, 43, 9, 3, 2, 2, 43, 44, 9, 
-	4, 2, 2, 44, 10, 3, 2, 2, 2, 45, 48, 5, 21, 11, 2, 46, 49, 5, 21, 11, 2, 
-	47, 49, 5, 23, 12, 2, 48, 46, 3, 2, 2, 2, 48, 47, 3, 2, 2, 2, 49, 50, 3, 
-	2, 2, 2, 50, 48, 3, 2, 2, 2, 50, 51, 3, 2, 2, 2, 51, 12, 3, 2, 2, 2, 52, 
-	55, 5, 31, 16, 2, 53, 55, 5, 15, 8, 2, 54, 52, 3, 2, 2, 2, 54, 53, 3, 2, 
-	2, 2, 55, 56, 3, 2, 2, 2, 56, 54, 3, 2, 2, 2, 56, 57, 3, 2, 2, 2, 57, 14, 
-	3, 2, 2, 2, 58, 59, 7, 39, 2, 2, 59, 60, 5, 27, 14, 2, 60, 61, 5, 27, 14, 
-	2, 61, 16, 3, 2, 2, 2, 62, 63, 9, 5, 2, 2, 63, 18, 3, 2, 2, 2, 64, 66, 
-	9, 6, 2, 2, 65, 64, 3, 2, 2, 2, 66, 20, 3, 2, 2, 2, 67, 70, 5, 17, 9, 2, 
-	68, 70, 5, 19, 10, 2, 69, 67, 3, 2, 2, 2, 69, 68, 3, 2, 2, 2, 70, 22, 3, 
-	2, 2, 2, 71, 72, 7, 47, 2, 2, 72, 24, 3, 2, 2, 2, 73, 77, 9, 7, 2, 2, 74, 
-	77, 5, 23, 12, 2, 75, 77, 9, 8, 2, 2, 76, 73, 3, 2, 2, 2, 76, 74, 3, 2, 
-	2, 2, 76, 75, 3, 2, 2, 2, 77, 26, 3, 2, 2, 2, 78, 81, 5, 17, 9, 2, 79, 
-	81, 9, 9, 2, 2, 80, 78, 3, 2, 2, 2, 80, 79, 3, 2, 2, 2, 81, 28, 3, 2, 2, 
-	2, 82, 83, 9, 10, 2, 2, 83, 30, 3, 2, 2, 2, 84, 88, 5, 21, 11, 2, 85, 88, 
-	5, 25, 13, 2, 86, 88, 5, 29, 15, 2, 87, 84, 3, 2, 2, 2, 87, 85, 3, 2, 2, 
-	2, 87, 86, 3, 2, 2, 2, 88, 32, 3, 2, 2, 2, 13, 2, 37, 48, 50, 54, 56, 65, 
-	69, 76, 80, 87, 2,
+	13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 3, 2, 
+	3, 2, 3, 3, 3, 3, 5, 3, 40, 10, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 
+	3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 6, 8, 55, 10, 8, 13, 8, 14, 8, 
+	56, 3, 9, 3, 9, 6, 9, 61, 10, 9, 13, 9, 14, 9, 62, 3, 10, 3, 10, 3, 10, 
+	3, 10, 3, 11, 3, 11, 3, 12, 5, 12, 72, 10, 12, 3, 13, 3, 13, 5, 13, 76, 
+	10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 5, 15, 82, 10, 15, 3, 16, 3, 16, 3, 
+	17, 3, 17, 3, 17, 5, 17, 89, 10, 17, 2, 2, 18, 3, 3, 5, 4, 7, 5, 9, 6, 
+	11, 7, 13, 2, 15, 2, 17, 2, 19, 2, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 
+	2, 33, 2, 3, 2, 10, 4, 2, 87, 87, 119, 119, 4, 2, 84, 84, 116, 116, 4, 
+	2, 80, 80, 112, 112, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 10, 2, 35, 35, 
+	38, 38, 41, 46, 48, 48, 61, 61, 63, 63, 66, 66, 97, 97, 4, 2, 67, 72, 99, 
+	104, 6, 2, 37, 37, 39, 39, 49, 49, 65, 65, 2, 87, 2, 3, 3, 2, 2, 2, 2, 
+	5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 3, 
+	35, 3, 2, 2, 2, 5, 39, 3, 2, 2, 2, 7, 41, 3, 2, 2, 2, 9, 43, 3, 2, 2, 2, 
+	11, 45, 3, 2, 2, 2, 13, 47, 3, 2, 2, 2, 15, 51, 3, 2, 2, 2, 17, 60, 3, 
+	2, 2, 2, 19, 64, 3, 2, 2, 2, 21, 68, 3, 2, 2, 2, 23, 71, 3, 2, 2, 2, 25, 
+	75, 3, 2, 2, 2, 27, 77, 3, 2, 2, 2, 29, 81, 3, 2, 2, 2, 31, 83, 3, 2, 2, 
+	2, 33, 88, 3, 2, 2, 2, 35, 36, 5, 13, 7, 2, 36, 4, 3, 2, 2, 2, 37, 40, 
+	5, 15, 8, 2, 38, 40, 5, 17, 9, 2, 39, 37, 3, 2, 2, 2, 39, 38, 3, 2, 2, 
+	2, 40, 6, 3, 2, 2, 2, 41, 42, 7, 60, 2, 2, 42, 8, 3, 2, 2, 2, 43, 44, 7, 
+	47, 2, 2, 44, 10, 3, 2, 2, 2, 45, 46, 7, 34, 2, 2, 46, 12, 3, 2, 2, 2, 
+	47, 48, 9, 2, 2, 2, 48, 49, 9, 3, 2, 2, 49, 50, 9, 4, 2, 2, 50, 14, 3, 
+	2, 2, 2, 51, 54, 5, 25, 13, 2, 52, 55, 5, 25, 13, 2, 53, 55, 5, 9, 5, 2, 
+	54, 52, 3, 2, 2, 2, 54, 53, 3, 2, 2, 2, 55, 56, 3, 2, 2, 2, 56, 54, 3, 
+	2, 2, 2, 56, 57, 3, 2, 2, 2, 57, 16, 3, 2, 2, 2, 58, 61, 5, 33, 17, 2, 
+	59, 61, 5, 19, 10, 2, 60, 58, 3, 2, 2, 2, 60, 59, 3, 2, 2, 2, 61, 62, 3, 
+	2, 2, 2, 62, 60, 3, 2, 2, 2, 62, 63, 3, 2, 2, 2, 63, 18, 3, 2, 2, 2, 64, 
+	65, 7, 39, 2, 2, 65, 66, 5, 29, 15, 2, 66, 67, 5, 29, 15, 2, 67, 20, 3, 
+	2, 2, 2, 68, 69, 9, 5, 2, 2, 69, 22, 3, 2, 2, 2, 70, 72, 9, 6, 2, 2, 71, 
+	70, 3, 2, 2, 2, 72, 24, 3, 2, 2, 2, 73, 76, 5, 21, 11, 2, 74, 76, 5, 23, 
+	12, 2, 75, 73, 3, 2, 2, 2, 75, 74, 3, 2, 2, 2, 76, 26, 3, 2, 2, 2, 77, 
+	78, 9, 7, 2, 2, 78, 28, 3, 2, 2, 2, 79, 82, 5, 21, 11, 2, 80, 82, 9, 8, 
+	2, 2, 81, 79, 3, 2, 2, 2, 81, 80, 3, 2, 2, 2, 82, 30, 3, 2, 2, 2, 83, 84, 
+	9, 9, 2, 2, 84, 32, 3, 2, 2, 2, 85, 89, 5, 27, 14, 2, 86, 89, 5, 31, 16, 
+	2, 87, 89, 5, 25, 13, 2, 88, 85, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 87, 
+	3, 2, 2, 2, 89, 34, 3, 2, 2, 2, 12, 2, 39, 54, 56, 60, 62, 71, 75, 81, 
+	88, 2,
 }
 
 var lexerDeserializer = antlr.NewATNDeserializer(nil)
@@ -67,16 +67,16 @@ var lexerModeNames = []string{
 }
 
 var lexerLiteralNames = []string{
-	"", "", "", "':'",
+	"", "", "", "':'", "'-'", "' '",
 }
 
 var lexerSymbolicNames = []string{
-	"", "Urn", "Part", "Colon",
+	"", "Urn", "Part", "Colon", "Hyphen", "Whitespace",
 }
 
 var lexerRuleNames = []string{
-	"Urn", "Part", "Colon", "URN", "IDENTIFIER", "CHARS", "HEX", "NUMBER", 
-	"LETTER", "ALPHA_NUMERIC", "HYPHEN", "OTHER", "HEX_DIGIT", "RESERVED", 
+	"Urn", "Part", "Colon", "Hyphen", "Whitespace", "URN", "IDENTIFIER", "CHARS", 
+	"HEX", "NUMBER", "LETTER", "ALPHA_NUMERIC", "OTHER", "HEX_DIGIT", "RESERVED", 
 	"TRANSLATION",
 }
 
@@ -118,5 +118,7 @@ const (
 	UrnLexerUrn = 1
 	UrnLexerPart = 2
 	UrnLexerColon = 3
+	UrnLexerHyphen = 4
+	UrnLexerWhitespace = 5
 )
 

+ 157 - 38
grammar/urn_parser.go

@@ -16,27 +16,35 @@ var _ = strconv.Itoa
 
 
 var parserATN = []uint16{
-	3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 5, 30, 4, 
+	3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 7, 45, 4, 
 	2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 
-	2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 7, 4, 22, 10, 4, 12, 4, 14, 4, 25, 
-	11, 4, 3, 4, 5, 4, 28, 10, 4, 3, 4, 2, 2, 5, 2, 4, 6, 2, 2, 2, 28, 2, 8, 
-	3, 2, 2, 2, 4, 15, 3, 2, 2, 2, 6, 27, 3, 2, 2, 2, 8, 9, 7, 3, 2, 2, 9, 
-	10, 7, 5, 2, 2, 10, 11, 5, 4, 3, 2, 11, 12, 7, 5, 2, 2, 12, 13, 5, 6, 4, 
-	2, 13, 14, 7, 2, 2, 3, 14, 3, 3, 2, 2, 2, 15, 16, 7, 4, 2, 2, 16, 17, 6, 
-	3, 2, 3, 17, 5, 3, 2, 2, 2, 18, 23, 7, 4, 2, 2, 19, 20, 7, 5, 2, 2, 20, 
-	22, 7, 4, 2, 2, 21, 19, 3, 2, 2, 2, 22, 25, 3, 2, 2, 2, 23, 21, 3, 2, 2, 
-	2, 23, 24, 3, 2, 2, 2, 24, 28, 3, 2, 2, 2, 25, 23, 3, 2, 2, 2, 26, 28, 
-	7, 3, 2, 2, 27, 18, 3, 2, 2, 2, 27, 26, 3, 2, 2, 2, 28, 7, 3, 2, 2, 2, 
-	4, 23, 27,
+	2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 7, 4, 22, 10, 4, 12, 4, 14, 4, 25, 
+	11, 4, 3, 4, 5, 4, 28, 10, 4, 3, 4, 6, 4, 31, 10, 4, 13, 4, 14, 4, 32, 
+	3, 4, 5, 4, 36, 10, 4, 3, 4, 3, 4, 5, 4, 40, 10, 4, 3, 4, 5, 4, 43, 10, 
+	4, 3, 4, 2, 2, 5, 2, 4, 6, 2, 3, 3, 2, 5, 6, 2, 49, 2, 8, 3, 2, 2, 2, 4, 
+	15, 3, 2, 2, 2, 6, 42, 3, 2, 2, 2, 8, 9, 7, 3, 2, 2, 9, 10, 7, 5, 2, 2, 
+	10, 11, 5, 4, 3, 2, 11, 12, 7, 5, 2, 2, 12, 13, 5, 6, 4, 2, 13, 14, 7, 
+	2, 2, 3, 14, 3, 3, 2, 2, 2, 15, 16, 7, 4, 2, 2, 16, 17, 6, 3, 2, 3, 17, 
+	18, 6, 3, 3, 3, 18, 5, 3, 2, 2, 2, 19, 23, 7, 4, 2, 2, 20, 22, 9, 2, 2, 
+	2, 21, 20, 3, 2, 2, 2, 22, 25, 3, 2, 2, 2, 23, 21, 3, 2, 2, 2, 23, 24, 
+	3, 2, 2, 2, 24, 27, 3, 2, 2, 2, 25, 23, 3, 2, 2, 2, 26, 28, 5, 6, 4, 2, 
+	27, 26, 3, 2, 2, 2, 27, 28, 3, 2, 2, 2, 28, 43, 3, 2, 2, 2, 29, 31, 9, 
+	2, 2, 2, 30, 29, 3, 2, 2, 2, 31, 32, 3, 2, 2, 2, 32, 30, 3, 2, 2, 2, 32, 
+	33, 3, 2, 2, 2, 33, 35, 3, 2, 2, 2, 34, 36, 5, 6, 4, 2, 35, 34, 3, 2, 2, 
+	2, 35, 36, 3, 2, 2, 2, 36, 43, 3, 2, 2, 2, 37, 39, 7, 4, 2, 2, 38, 40, 
+	5, 6, 4, 2, 39, 38, 3, 2, 2, 2, 39, 40, 3, 2, 2, 2, 40, 43, 3, 2, 2, 2, 
+	41, 43, 7, 3, 2, 2, 42, 19, 3, 2, 2, 2, 42, 30, 3, 2, 2, 2, 42, 37, 3, 
+	2, 2, 2, 42, 41, 3, 2, 2, 2, 43, 7, 3, 2, 2, 2, 8, 23, 27, 32, 35, 39, 
+	42,
 }
 var deserializer = antlr.NewATNDeserializer(nil)
 var deserializedATN = deserializer.DeserializeFromUInt16(parserATN)
 
 var literalNames = []string{
-	"", "", "", "':'",
+	"", "", "", "':'", "'-'", "' '",
 }
 var symbolicNames = []string{
-	"", "Urn", "Part", "Colon",
+	"", "Urn", "Part", "Colon", "Hyphen", "Whitespace",
 }
 
 var ruleNames = []string{
@@ -68,12 +76,27 @@ func NewUrnParser(input antlr.TokenStream) *UrnParser {
 	return this
 }
 
+
+func isIdentifier(s string) bool {
+    for i, r := range s {
+        // !unicode.IsLetter(r) etc. when (if) we'll need unicode
+        if (r < 'a' || r > 'z') && (r < 'A' || r > 'Z') && (r < '0' || r > '9') && (r != '-' || (i == 0 && r == '-')) {
+            return false
+        }
+    }
+    return true
+}
+
+
+
 // UrnParser tokens.
 const (
 	UrnParserEOF = antlr.TokenEOF
 	UrnParserUrn = 1
 	UrnParserPart = 2
 	UrnParserColon = 3
+	UrnParserHyphen = 4
+	UrnParserWhitespace = 5
 )
 
 // UrnParser rules.
@@ -327,7 +350,12 @@ func (p *UrnParser) ID() (localctx IIDContext) {
 	p.SetState(14)
 
 	if !(len(localctx.(*IDContext).GetText()) <= 32) {
-		panic(antlr.NewFailedPredicateException(p, "len($ctx.GetText()) <= 32", ""))
+		panic(antlr.NewFailedPredicateException(p, "len($ctx.GetText()) <= 32", "exceed max (32) number of characters"))
+	}
+	p.SetState(15)
+
+	if !(isIdentifier(localctx.(*IDContext).GetText())) {
+		panic(antlr.NewFailedPredicateException(p, "isIdentifier($ctx.GetText())", "is not a valid identifier"))
 	}
 
 
@@ -374,12 +402,18 @@ func NewSSContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingS
 
 func (s *SSContext) GetParser() antlr.Parser { return s.parser }
 
-func (s *SSContext) AllPart() []antlr.TerminalNode {
-	return s.GetTokens(UrnParserPart)
+func (s *SSContext) Part() antlr.TerminalNode {
+	return s.GetToken(UrnParserPart, 0)
 }
 
-func (s *SSContext) Part(i int) antlr.TerminalNode {
-	return s.GetToken(UrnParserPart, i)
+func (s *SSContext) SS() ISSContext {
+	var t = s.GetTypedRuleContext(reflect.TypeOf((*ISSContext)(nil)).Elem(), 0)
+
+	if t == nil {
+		return nil
+	}
+
+	return t.(ISSContext)
 }
 
 func (s *SSContext) AllColon() []antlr.TerminalNode {
@@ -390,6 +424,14 @@ func (s *SSContext) Colon(i int) antlr.TerminalNode {
 	return s.GetToken(UrnParserColon, i)
 }
 
+func (s *SSContext) AllHyphen() []antlr.TerminalNode {
+	return s.GetTokens(UrnParserHyphen)
+}
+
+func (s *SSContext) Hyphen(i int) antlr.TerminalNode {
+	return s.GetToken(UrnParserHyphen, i)
+}
+
 func (s *SSContext) Urn() antlr.TerminalNode {
 	return s.GetToken(UrnParserUrn, 0)
 }
@@ -440,49 +482,123 @@ func (p *UrnParser) SS() (localctx ISSContext) {
 		}
 	}()
 
-	p.SetState(25)
-	p.GetErrorHandler().Sync(p)
+	var _alt int
 
-	switch p.GetTokenStream().LA(1) {
-	case UrnParserPart:
+	p.SetState(40)
+	p.GetErrorHandler().Sync(p)
+	switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 5, p.GetParserRuleContext()) {
+	case 1:
 		p.EnterOuterAlt(localctx, 1)
 		{
-			p.SetState(16)
+			p.SetState(17)
 			p.Match(UrnParserPart)
 		}
 		p.SetState(21)
 		p.GetErrorHandler().Sync(p)
-		_la = p.GetTokenStream().LA(1)
+		_alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext())
+
+		for _alt != 2 && _alt != antlr.ATNInvalidAltNumber {
+			if _alt == 1 {
+				p.SetState(18)
+				_la = p.GetTokenStream().LA(1)
+
+				if !(_la == UrnParserColon || _la == UrnParserHyphen) {
+					p.GetErrorHandler().RecoverInline(p)
+				} else {
+				    p.GetErrorHandler().ReportMatch(p)
+					p.Consume()
+				}
 
 
-		for _la == UrnParserColon {
-			{
-				p.SetState(17)
-				p.Match(UrnParserColon)
 			}
+			p.SetState(23)
+			p.GetErrorHandler().Sync(p)
+			_alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext())
+		}
+		p.SetState(25)
+		p.GetErrorHandler().Sync(p)
+		_la = p.GetTokenStream().LA(1)
+
+
+		if (((_la) & -(0x1f+1)) == 0 && ((1 << uint(_la)) & ((1 << UrnParserUrn) | (1 << UrnParserPart) | (1 << UrnParserColon) | (1 << UrnParserHyphen))) != 0) {
 			{
-				p.SetState(18)
-				p.Match(UrnParserPart)
+				p.SetState(24)
+				p.SS()
 			}
 
+		}
+
 
-			p.SetState(23)
+	case 2:
+		p.EnterOuterAlt(localctx, 2)
+		p.SetState(28)
+		p.GetErrorHandler().Sync(p)
+		_alt = 1
+		for ok := true; ok; ok = _alt != 2 && _alt != antlr.ATNInvalidAltNumber {
+			switch _alt {
+			case 1:
+					p.SetState(27)
+					_la = p.GetTokenStream().LA(1)
+
+					if !(_la == UrnParserColon || _la == UrnParserHyphen) {
+						p.GetErrorHandler().RecoverInline(p)
+					} else {
+					    p.GetErrorHandler().ReportMatch(p)
+						p.Consume()
+					}
+
+
+
+
+			default:
+				panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil))
+			}
+
+			p.SetState(30)
 			p.GetErrorHandler().Sync(p)
-			_la = p.GetTokenStream().LA(1)
+			_alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 2, p.GetParserRuleContext())
 		}
+		p.SetState(33)
+		p.GetErrorHandler().Sync(p)
+		_la = p.GetTokenStream().LA(1)
 
 
-	case UrnParserUrn:
-		p.EnterOuterAlt(localctx, 2)
+		if (((_la) & -(0x1f+1)) == 0 && ((1 << uint(_la)) & ((1 << UrnParserUrn) | (1 << UrnParserPart) | (1 << UrnParserColon) | (1 << UrnParserHyphen))) != 0) {
+			{
+				p.SetState(32)
+				p.SS()
+			}
+
+		}
+
+
+	case 3:
+		p.EnterOuterAlt(localctx, 3)
 		{
-			p.SetState(24)
-			p.Match(UrnParserUrn)
+			p.SetState(35)
+			p.Match(UrnParserPart)
 		}
+		p.SetState(37)
+		p.GetErrorHandler().Sync(p)
+		_la = p.GetTokenStream().LA(1)
 
 
+		if (((_la) & -(0x1f+1)) == 0 && ((1 << uint(_la)) & ((1 << UrnParserUrn) | (1 << UrnParserPart) | (1 << UrnParserColon) | (1 << UrnParserHyphen))) != 0) {
+			{
+				p.SetState(36)
+				p.SS()
+			}
+
+		}
+
+
+	case 4:
+		p.EnterOuterAlt(localctx, 4)
+		{
+			p.SetState(39)
+			p.Match(UrnParserUrn)
+		}
 
-	default:
-		panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil))
 	}
 
 
@@ -508,6 +624,9 @@ func (p *UrnParser) ID_Sempred(localctx antlr.RuleContext, predIndex int) bool {
 	case 0:
 			return len(localctx.(*IDContext).GetText()) <= 32
 
+	case 1:
+			return isIdentifier(localctx.(*IDContext).GetText())
+
 	default:
 		panic("No predicate with index: " + fmt.Sprint(predIndex))
 	}