[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jedit-cvs
Subject:    [ jEdit-commits ] [ ProtocolBuffer plugin ] ProtocolBuffer jEdit plugin branch master updated. v0.3.
From:       Eric Le Lay via jEdit-CVS <jedit-cvs () lists ! sourceforge ! net>
Date:       2020-07-08 14:17:44
Message-ID: 1594217864.991513.21555 () sfp-scm-8 ! v30 ! lw ! sourceforge ! com
[Download RAW message or body]

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "ProtocolBuffer jEdit plugin".

The branch, master has been updated
       via  712399478b561c70572798ea936d5d9808fcbea4 (commit)
       via  514378f7d36c27eb0e714bc7025155454134c722 (commit)
       via  b31c9ff4a763f42a032ee95ad0c940d07c5b3f2f (commit)
       via  8970af2e6221c7e75cd6b5f939282309f138987c (commit)
      from  13115122dd32fdf9c1149f31cc3d79fbe4d42c12 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/712399478b561c70572798ea936d5d9808fcbea4/
                
tree: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/712399478b561c70572798ea936d5d9808fcbea4/tree/


commit 712399478b561c70572798ea936d5d9808fcbea4
Author: Eric Le Lay <kerik-sf@users.sourceforge.net>
Date:   Wed Jul 8 16:00:41 2020 +0200

    map item type

diff --git a/sidekick/protobuf/ProtobufNode.java \
b/sidekick/protobuf/ProtobufNode.java index 32236cf..b67a6d4 100755
--- a/sidekick/protobuf/ProtobufNode.java
+++ b/sidekick/protobuf/ProtobufNode.java
@@ -33,7 +33,7 @@ import sidekick.util.SideKickElement;
 
 public class ProtobufNode extends Asset implements Comparable<ProtobufNode>, \
SideKickElement {  public static enum Kind {
-        PROTO, ENUM, ENUM_ITEM, MESSAGE, MESSAGE_ITEM, SERVICE, TYPE_REF, ONEOF
+        PROTO, ENUM, ENUM_ITEM, MESSAGE, MESSAGE_ITEM, SERVICE, TYPE_REF, ONEOF, \
MAP_MESSAGE_ITEM  }
 
     private Icon icon = null;
diff --git a/sidekick/protobuf/ProtobufSideKickListener.java \
b/sidekick/protobuf/ProtobufSideKickListener.java index 64ff87b..00be643 100755
--- a/sidekick/protobuf/ProtobufSideKickListener.java
+++ b/sidekick/protobuf/ProtobufSideKickListener.java
@@ -191,9 +191,9 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  
 	@Override public void enterMap_field_def(@NotNull \
ProtoParserParser.Map_field_defContext ctx) {  
-		ProtobufNode node = new ProtobufNode("function", Kind.MESSAGE_ITEM);
+		ProtobufNode node = new ProtobufNode("function", Kind.MAP_MESSAGE_ITEM);
 
-		ImageIcon nodeIcon = optionalIcon;  // FIXME: map icon
+		ImageIcon nodeIcon = mapIcon;
 
         node.setIcon(nodeIcon);
         node.setStartLocation( getStartLocation( ctx ) );
diff --git a/sidekick/protobuf/hyperlinks/PBHyperlinkSource.java \
b/sidekick/protobuf/hyperlinks/PBHyperlinkSource.java index 4f8ac22..87215e8 100644
--- a/sidekick/protobuf/hyperlinks/PBHyperlinkSource.java
+++ b/sidekick/protobuf/hyperlinks/PBHyperlinkSource.java
@@ -141,7 +141,7 @@ public class PBHyperlinkSource implements HyperlinkSource
 			ProtobufSideKickParsedData data, ProtobufNode asset)
 	{
 		Log.log(Log.DEBUG, PBHyperlinkSource.class, "in ProtobufNode " + asset.getKind() + \
                " named " + asset.getLongString() + " type=" + asset.getType());
-		if (asset.getKind() == Kind.MESSAGE_ITEM) {
+		if (asset.getKind() == Kind.MESSAGE_ITEM || asset.getKind() == \
Kind.MAP_MESSAGE_ITEM) {  ProtobufNode type = asset.getType();
 			if (type != null 
 					&& type.getStartPosition().getOffset() <= offset

commit: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/514378f7d36c27eb0e714bc7025155454134c722/
                
tree: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/514378f7d36c27eb0e714bc7025155454134c722/tree/


commit 514378f7d36c27eb0e714bc7025155454134c722
Author: Eric Le Lay <kerik-sf@users.sourceforge.net>
Date:   Wed Jul 8 15:59:52 2020 +0200

    add missing semicolon at reserved end

diff --git a/resources/antlr4/ProtoParser.g4 b/resources/antlr4/ProtoParser.g4
index 09abfbb..959096a 100755
--- a/resources/antlr4/ProtoParser.g4
+++ b/resources/antlr4/ProtoParser.g4
@@ -237,7 +237,7 @@ message_ext_def
   ;
 
 reserved_def
-  :  RESERVED_LITERAL ( reserved_ranges | reserved_field_names )
+  :  RESERVED_LITERAL ( reserved_ranges | reserved_field_names ) ITEM_TERMINATOR
   ;
 
 reserved_ranges
diff --git a/sidekick/protobuf/parser/ProtoParserParser.java \
b/sidekick/protobuf/parser/ProtoParserParser.java index 0370c7a..f76a1e4 100644
--- a/sidekick/protobuf/parser/ProtoParserParser.java
+++ b/sidekick/protobuf/parser/ProtoParserParser.java
@@ -2640,6 +2640,7 @@ public class ProtoParserParser extends Parser {
 
 	public static class Reserved_defContext extends ParserRuleContext {
 		public TerminalNode RESERVED_LITERAL() { return \
getToken(ProtoParserParser.RESERVED_LITERAL, 0); } +		public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); }  public \
Reserved_rangesContext reserved_ranges() {  return \
getRuleContext(Reserved_rangesContext.class,0);  }
@@ -2686,6 +2687,8 @@ public class ProtoParserParser extends Parser {
 			default:
 				throw new NoViableAltException(this);
 			}
+			setState(340);
+			match(ITEM_TERMINATOR);
 			}
 		}
 		catch (RecognitionException re) {
@@ -2739,42 +2742,42 @@ public class ProtoParserParser extends Parser {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(340);
+			setState(342);
 			match(INTEGER_LITERAL);
-			setState(341);
+			setState(343);
 			match(TO_LITERAL);
-			setState(344);
+			setState(346);
 			switch (_input.LA(1)) {
 			case INTEGER_LITERAL:
 				{
-				setState(342);
+				setState(344);
 				_localctx.v = match(INTEGER_LITERAL);
 				}
 				break;
 			case MAX_LITERAL:
 				{
-				setState(343);
+				setState(345);
 				_localctx.v = match(MAX_LITERAL);
 				}
 				break;
 			default:
 				throw new NoViableAltException(this);
 			}
-			setState(350);
+			setState(352);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					{
 					{
-					setState(346);
+					setState(348);
 					match(COMMA);
-					setState(347);
+					setState(349);
 					reserved_ranges();
 					}
 					} 
 				}
-				setState(352);
+				setState(354);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			}
@@ -2822,21 +2825,21 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(353);
+			setState(355);
 			match(STRING_LITERAL);
-			setState(358);
+			setState(360);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while (_la==COMMA) {
 				{
 				{
-				setState(354);
+				setState(356);
 				match(COMMA);
-				setState(355);
+				setState(357);
 				match(STRING_LITERAL);
 				}
 				}
-				setState(360);
+				setState(362);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -2884,15 +2887,15 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(361);
+			setState(363);
 			match(ONEOF_LITERAL);
-			setState(362);
+			setState(364);
 			identifier();
-			setState(363);
+			setState(365);
 			match(BLOCK_OPEN);
-			setState(364);
+			setState(366);
 			oneof_content();
-			setState(365);
+			setState(367);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -2942,28 +2945,28 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(369); 
+			setState(371); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(369);
+				setState(371);
 				switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
 				case 1:
 					{
-					setState(367);
+					setState(369);
 					option_line_def();
 					}
 					break;
 				case 2:
 					{
-					setState(368);
+					setState(370);
 					oneof_field_def();
 					}
 					break;
 				}
 				}
-				setState(371); 
+				setState(373); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L \
<< IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER) | (1L << \
QUALIFIED_IDENTIFIER))) != 0) ); @@ -3015,24 +3018,24 @@ public class \
ProtoParserParser extends Parser {  try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(373);
+			setState(375);
 			proto_type();
-			setState(374);
+			setState(376);
 			identifier();
-			setState(375);
+			setState(377);
 			match(EQUALS);
-			setState(376);
-			match(INTEGER_LITERAL);
 			setState(378);
+			match(INTEGER_LITERAL);
+			setState(380);
 			_la = _input.LA(1);
 			if (_la==BRACKET_OPEN) {
 				{
-				setState(377);
+				setState(379);
 				option_field_def();
 				}
 			}
 
-			setState(380);
+			setState(382);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -3085,25 +3088,25 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(382);
+			setState(384);
 			match(MAP_LITERAL);
-			setState(383);
+			setState(385);
 			match(LT);
-			setState(384);
+			setState(386);
 			proto_map_key_type();
-			setState(385);
+			setState(387);
 			match(COMMA);
-			setState(386);
+			setState(388);
 			proto_type();
-			setState(387);
+			setState(389);
 			match(GT);
-			setState(388);
+			setState(390);
 			identifier();
-			setState(389);
+			setState(391);
 			match(EQUALS);
-			setState(390);
+			setState(392);
 			match(INTEGER_LITERAL);
-			setState(391);
+			setState(393);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -3150,22 +3153,22 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(393);
+			setState(395);
 			match(EXTEND_LITERAL);
-			setState(394);
+			setState(396);
 			ext_name();
-			setState(395);
-			match(BLOCK_OPEN);
 			setState(397);
+			match(BLOCK_OPEN);
+			setState(399);
 			_la = _input.LA(1);
 			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL))) \
!= 0)) {  {
-				setState(396);
+				setState(398);
 				ext_content();
 				}
 			}
 
-			setState(399);
+			setState(401);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -3205,7 +3208,7 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(401);
+			setState(403);
 			all_identifier();
 			}
 		}
@@ -3267,16 +3270,16 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(407); 
+			setState(409); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(407);
+				setState(409);
 				switch (_input.LA(1)) {
 				case OPTION_LITERAL:
 					{
-					setState(403);
+					setState(405);
 					option_line_def();
 					}
 					break;
@@ -3284,19 +3287,19 @@ public class ProtoParserParser extends Parser {
 				case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
 				case REPEATED_PROTOBUF_SCOPE_LITERAL:
 					{
-					setState(404);
+					setState(406);
 					message_item_def2();
 					}
 					break;
 				case MESSAGE_LITERAL:
 					{
-					setState(405);
+					setState(407);
 					message_def2();
 					}
 					break;
 				case ENUM_LITERAL:
 					{
-					setState(406);
+					setState(408);
 					enum_def();
 					}
 					break;
@@ -3304,7 +3307,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(409); 
+				setState(411); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L \
<< ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) \
| (1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL))) \
!= 0) ); @@ -3353,22 +3356,22 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(411);
+			setState(413);
 			match(SERVICE_LITERAL);
-			setState(412);
+			setState(414);
 			service_name();
-			setState(413);
-			match(BLOCK_OPEN);
 			setState(415);
+			match(BLOCK_OPEN);
+			setState(417);
 			_la = _input.LA(1);
 			if (_la==OPTION_LITERAL || _la==RPC_LITERAL) {
 				{
-				setState(414);
+				setState(416);
 				service_content();
 				}
 			}
 
-			setState(417);
+			setState(419);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -3408,7 +3411,7 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(419);
+			setState(421);
 			identifier();
 			}
 		}
@@ -3458,22 +3461,22 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(423); 
+			setState(425); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(423);
+				setState(425);
 				switch (_input.LA(1)) {
 				case OPTION_LITERAL:
 					{
-					setState(421);
+					setState(423);
 					option_line_def();
 					}
 					break;
 				case RPC_LITERAL:
 					{
-					setState(422);
+					setState(424);
 					rpc_def();
 					}
 					break;
@@ -3481,7 +3484,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(425); 
+				setState(427); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( _la==OPTION_LITERAL || _la==RPC_LITERAL );
@@ -3549,51 +3552,51 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(427);
+			setState(429);
 			match(RPC_LITERAL);
-			setState(428);
+			setState(430);
 			rpc_name();
-			setState(429);
+			setState(431);
 			match(PAREN_OPEN);
-			setState(430);
+			setState(432);
 			req_name();
-			setState(431);
+			setState(433);
 			match(PAREN_CLOSE);
-			setState(432);
+			setState(434);
 			match(RETURNS_LITERAL);
-			setState(433);
+			setState(435);
 			match(PAREN_OPEN);
-			setState(434);
+			setState(436);
 			resp_name();
-			setState(435);
+			setState(437);
 			match(PAREN_CLOSE);
-			setState(448);
+			setState(450);
 			switch (_input.LA(1)) {
 			case BLOCK_OPEN:
 				{
-				setState(436);
+				setState(438);
 				match(BLOCK_OPEN);
-				setState(440);
+				setState(442);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==OPTION_LITERAL) {
 					{
 					{
-					setState(437);
+					setState(439);
 					option_line_def();
 					}
 					}
-					setState(442);
+					setState(444);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(443);
-				match(BLOCK_CLOSE);
 				setState(445);
+				match(BLOCK_CLOSE);
+				setState(447);
 				_la = _input.LA(1);
 				if (_la==ITEM_TERMINATOR) {
 					{
-					setState(444);
+					setState(446);
 					match(ITEM_TERMINATOR);
 					}
 				}
@@ -3602,7 +3605,7 @@ public class ProtoParserParser extends Parser {
 				break;
 			case ITEM_TERMINATOR:
 				{
-				setState(447);
+				setState(449);
 				match(ITEM_TERMINATOR);
 				}
 				break;
@@ -3647,7 +3650,7 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(450);
+			setState(452);
 			identifier();
 			}
 		}
@@ -3687,7 +3690,7 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(452);
+			setState(454);
 			all_identifier();
 			}
 		}
@@ -3727,7 +3730,7 @@ public class ProtoParserParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(454);
+			setState(456);
 			all_identifier();
 			}
 		}
@@ -3743,7 +3746,7 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static final String _serializedATN =
-		"\3\uaf6f\u8320\u479d\ub75c\u4880\u1605\u191c\uab37\3>\u01cb\4\2\t\2\4"+
+		"\3\uaf6f\u8320\u479d\ub75c\u4880\u1605\u191c\uab37\3>\u01cd\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -3767,147 +3770,148 @@ public class ProtoParserParser extends Parser {
 		" \6 \u011f\n \r \16 \u0120\3!\3!\3!\3!\3!\3!\3!\6!\u012a\n!\r!\16!\u012b"+
 		"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u0134\n\"\3\"\3\"\3#\3#\3#\5#\u013b\n#\3"+
 		"$\5$\u013e\n$\3$\3$\3$\3$\3$\5$\u0145\n$\3$\3$\3%\3%\3%\3%\3%\5%\u014e"+
-		"\n%\3%\3%\3&\3&\3&\5&\u0155\n&\3\'\3\'\3\'\3\'\5\'\u015b\n\'\3\'\3\'\7"+
-		"\'\u015f\n\'\f\'\16\'\u0162\13\'\3(\3(\3(\7(\u0167\n(\f(\16(\u016a\13"+
-		"(\3)\3)\3)\3)\3)\3)\3*\3*\6*\u0174\n*\r*\16*\u0175\3+\3+\3+\3+\3+\5+\u017d"+
-		"\n+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\5-\u0190\n-\3-"+
-		"\3-\3.\3.\3/\3/\3/\3/\6/\u019a\n/\r/\16/\u019b\3\60\3\60\3\60\3\60\5\60"+
-		"\u01a2\n\60\3\60\3\60\3\61\3\61\3\62\3\62\6\62\u01aa\n\62\r\62\16\62\u01ab"+
-		"\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u01b9\n\63"+
-		"\f\63\16\63\u01bc\13\63\3\63\3\63\5\63\u01c0\n\63\3\63\5\63\u01c3\n\63"+
-		"\3\64\3\64\3\65\3\65\3\66\3\66\3\66\2\2\2\67\2\2\4\2\6\2\b\2\n\2\f\2\16"+
-		"\2\20\2\22\2\24\2\26\2\30\2\32\2\34\2\36\2 \2\"\2$\2&\2(\2*\2,\2.\2\60"+
-		"\2\62\2\64\2\66\28\2:\2<\2>\2@\2B\2D\2F\2H\2J\2L\2N\2P\2R\2T\2V\2X\2Z"+
-		"\2\\\2^\2`\2b\2d\2f\2h\2j\2\2\7\6\2\3\24#\64\67\6799\3\2\658\3\2(\63\4"+
-		"\2&\'\64\64\3\2\r\16\u01d9\2l\3\2\2\2\4p\3\2\2\2\6t\3\2\2\2\bv\3\2\2\2"+
-		"\nx\3\2\2\2\fz\3\2\2\2\16\177\3\2\2\2\20\u0089\3\2\2\2\22\u0094\3\2\2"+
-		"\2\24\u009f\3\2\2\2\26\u00a2\3\2\2\2\30\u00a6\3\2\2\2\32\u00a8\3\2\2\2"+
-		"\34\u00af\3\2\2\2\36\u00b1\3\2\2\2 \u00b6\3\2\2\2\"\u00bb\3\2\2\2$\u00c1"+
-		"\3\2\2\2&\u00cc\3\2\2\2(\u00d2\3\2\2\2*\u00d4\3\2\2\2,\u00dd\3\2\2\2."+
-		"\u00eb\3\2\2\2\60\u00ed\3\2\2\2\62\u00f3\3\2\2\2\64\u00f9\3\2\2\2\66\u00fc"+
-		"\3\2\2\28\u0104\3\2\2\2:\u010c\3\2\2\2<\u0114\3\2\2\2>\u011e\3\2\2\2@"+
-		"\u0129\3\2\2\2B\u012d\3\2\2\2D\u013a\3\2\2\2F\u013d\3\2\2\2H\u0148\3\2"+
-		"\2\2J\u0151\3\2\2\2L\u0156\3\2\2\2N\u0163\3\2\2\2P\u016b\3\2\2\2R\u0173"+
-		"\3\2\2\2T\u0177\3\2\2\2V\u0180\3\2\2\2X\u018b\3\2\2\2Z\u0193\3\2\2\2\\"+
-		"\u0199\3\2\2\2^\u019d\3\2\2\2`\u01a5\3\2\2\2b\u01a9\3\2\2\2d\u01ad\3\2"+
-		"\2\2f\u01c4\3\2\2\2h\u01c6\3\2\2\2j\u01c8\3\2\2\2lm\t\2\2\2m\3\3\2\2\2"+
-		"nq\5\2\2\2oq\7:\2\2pn\3\2\2\2po\3\2\2\2q\5\3\2\2\2ru\5\2\2\2su\5\b\5\2"+
-		"tr\3\2\2\2ts\3\2\2\2u\7\3\2\2\2vw\t\3\2\2w\t\3\2\2\2xy\t\4\2\2y\13\3\2"+
-		"\2\2z{\t\5\2\2{\r\3\2\2\2|\u0080\5\n\6\2}\u0080\5\f\7\2~\u0080\5\4\3\2"+
-		"\177|\3\2\2\2\177}\3\2\2\2\177~\3\2\2\2\u0080\17\3\2\2\2\u0081\u0082\5"+
-		"\36\20\2\u0082\u0083\5\22\n\2\u0083\u008a\3\2\2\2\u0084\u0085\5 \21\2"+
-		"\u0085\u0086\5\24\13\2\u0086\u0087\3\2\2\2\u0087\u0088\7\2\2\3\u0088\u008a"+
-		"\3\2\2\2\u0089\u0081\3\2\2\2\u0089\u0084\3\2\2\2\u008a\21\3\2\2\2\u008b"+
-		"\u0093\5\26\f\2\u008c\u0093\5\32\16\2\u008d\u0093\5\"\22\2\u008e\u0093"+
-		"\5\60\31\2\u008f\u0093\5X-\2\u0090\u0093\58\35\2\u0091\u0093\5^\60\2\u0092"+
-		"\u008b\3\2\2\2\u0092\u008c\3\2\2\2\u0092\u008d\3\2\2\2\u0092\u008e\3\2"+
-		"\2\2\u0092\u008f\3\2\2\2\u0092\u0090\3\2\2\2\u0092\u0091\3\2\2\2\u0093"+
-		"\u0096\3\2\2\2\u0094\u0092\3\2\2\2\u0094\u0095\3\2\2\2\u0095\23\3\2\2"+
-		"\2\u0096\u0094\3\2\2\2\u0097\u009e\5\26\f\2\u0098\u009e\5\32\16\2\u0099"+
-		"\u009e\5\"\22\2\u009a\u009e\5\60\31\2\u009b\u009e\5:\36\2\u009c\u009e"+
-		"\5^\60\2\u009d\u0097\3\2\2\2\u009d\u0098\3\2\2\2\u009d\u0099\3\2\2\2\u009d"+
-		"\u009a\3\2\2\2\u009d\u009b\3\2\2\2\u009d\u009c\3\2\2\2\u009e\u00a1\3\2"+
-		"\2\2\u009f\u009d\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\25\3\2\2\2\u00a1\u009f"+
-		"\3\2\2\2\u00a2\u00a3\7\3\2\2\u00a3\u00a4\5\30\r\2\u00a4\u00a5\7\36\2\2"+
-		"\u00a5\27\3\2\2\2\u00a6\u00a7\5\4\3\2\u00a7\31\3\2\2\2\u00a8\u00aa\7\4"+
-		"\2\2\u00a9\u00ab\t\6\2\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab"+
-		"\u00ac\3\2\2\2\u00ac\u00ad\5\34\17\2\u00ad\u00ae\7\36\2\2\u00ae\33\3\2"+
-		"\2\2\u00af\u00b0\7\66\2\2\u00b0\35\3\2\2\2\u00b1\u00b2\7\6\2\2\u00b2\u00b3"+
-		"\7\33\2\2\u00b3\u00b4\7!\2\2\u00b4\u00b5\7\36\2\2\u00b5\37\3\2\2\2\u00b6"+
-		"\u00b7\7\6\2\2\u00b7\u00b8\7\33\2\2\u00b8\u00b9\7\"\2\2\u00b9\u00ba\7"+
-		"\36\2\2\u00ba!\3\2\2\2\u00bb\u00bc\7\5\2\2\u00bc\u00bd\5.\30\2\u00bd\u00be"+
-		"\7\33\2\2\u00be\u00bf\5(\25\2\u00bf\u00c0\7\36\2\2\u00c0#\3\2\2\2\u00c1"+
-		"\u00c2\7\31\2\2\u00c2\u00c7\5&\24\2\u00c3\u00c4\7\35\2\2\u00c4\u00c6\5"+
-		"&\24\2\u00c5\u00c3\3\2\2\2\u00c6\u00c9\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c7"+
-		"\u00c8\3\2\2\2\u00c8\u00ca\3\2\2\2\u00c9\u00c7\3\2\2\2\u00ca\u00cb\7\32"+
-		"\2\2\u00cb%\3\2\2\2\u00cc\u00cd\5.\30\2\u00cd\u00ce\7\33\2\2\u00ce\u00cf"+
-		"\5(\25\2\u00cf\'\3\2\2\2\u00d0\u00d3\5\6\4\2\u00d1\u00d3\5*\26\2\u00d2"+
-		"\u00d0\3\2\2\2\u00d2\u00d1\3\2\2\2\u00d3)\3\2\2\2\u00d4\u00d8\7\25\2\2"+
-		"\u00d5\u00d7\5,\27\2\u00d6\u00d5\3\2\2\2\u00d7\u00da\3\2\2\2\u00d8\u00d6"+
-		"\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00db\3\2\2\2\u00da\u00d8\3\2\2\2\u00db"+
-		"\u00dc\7\26\2\2\u00dc+\3\2\2\2\u00dd\u00de\5\2\2\2\u00de\u00df\7\34\2"+
-		"\2\u00df\u00e0\5(\25\2\u00e0-\3\2\2\2\u00e1\u00ec\5\2\2\2\u00e2\u00e3"+
-		"\7\27\2\2\u00e3\u00e4\5\4\3\2\u00e4\u00e8\7\30\2\2\u00e5\u00e7\7;\2\2"+
-		"\u00e6\u00e5\3\2\2\2\u00e7\u00ea\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e8\u00e9"+
-		"\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00eb\u00e1\3\2\2\2\u00eb"+
-		"\u00e2\3\2\2\2\u00ec/\3\2\2\2\u00ed\u00ee\7\7\2\2\u00ee\u00ef\5\62\32"+
-		"\2\u00ef\u00f0\7\25\2\2\u00f0\u00f1\5\64\33\2\u00f1\u00f2\7\26\2\2\u00f2"+
-		"\61\3\2\2\2\u00f3\u00f4\5\2\2\2\u00f4\63\3\2\2\2\u00f5\u00f8\5\"\22\2"+
-		"\u00f6\u00f8\5\66\34\2\u00f7\u00f5\3\2\2\2\u00f7\u00f6\3\2\2\2\u00f8\u00fb"+
-		"\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\65\3\2\2\2\u00fb"+
-		"\u00f9\3\2\2\2\u00fc\u00fd\5\2\2\2\u00fd\u00fe\7\33\2\2\u00fe\u0100\7"+
-		"\65\2\2\u00ff\u0101\5$\23\2\u0100\u00ff\3\2\2\2\u0100\u0101\3\2\2\2\u0101"+
-		"\u0102\3\2\2\2\u0102\u0103\7\36\2\2\u0103\67\3\2\2\2\u0104\u0105\7\b\2"+
-		"\2\u0105\u0106\5<\37\2\u0106\u0108\7\25\2\2\u0107\u0109\5> \2\u0108\u0107"+
-		"\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010b\7\26\2\2"+
-		"\u010b9\3\2\2\2\u010c\u010d\7\b\2\2\u010d\u010e\5<\37\2\u010e\u0110\7"+
-		"\25\2\2\u010f\u0111\5@!\2\u0110\u010f\3\2\2\2\u0110\u0111\3\2\2\2\u0111"+
-		"\u0112\3\2\2\2\u0112\u0113\7\26\2\2\u0113;\3\2\2\2\u0114\u0115\5\2\2\2"+
-		"\u0115=\3\2\2\2\u0116\u011f\5\"\22\2\u0117\u011f\5B\"\2\u0118\u011f\5"+
-		"8\35\2\u0119\u011f\5\60\31\2\u011a\u011f\5H%\2\u011b\u011f\5J&\2\u011c"+
-		"\u011f\5P)\2\u011d\u011f\5V,\2\u011e\u0116\3\2\2\2\u011e\u0117\3\2\2\2"+
-		"\u011e\u0118\3\2\2\2\u011e\u0119\3\2\2\2\u011e\u011a\3\2\2\2\u011e\u011b"+
-		"\3\2\2\2\u011e\u011c\3\2\2\2\u011e\u011d\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+
-		"\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121?\3\2\2\2\u0122\u012a\5\"\22\2"+
-		"\u0123\u012a\5F$\2\u0124\u012a\5:\36\2\u0125\u012a\5\60\31\2\u0126\u012a"+
-		"\5J&\2\u0127\u012a\5P)\2\u0128\u012a\5V,\2\u0129\u0122\3\2\2\2\u0129\u0123"+
-		"\3\2\2\2\u0129\u0124\3\2\2\2\u0129\u0125\3\2\2\2\u0129\u0126\3\2\2\2\u0129"+
-		"\u0127\3\2\2\2\u0129\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u0129\3\2"+
-		"\2\2\u012b\u012c\3\2\2\2\u012cA\3\2\2\2\u012d\u012e\5D#\2\u012e\u012f"+
-		"\5\16\b\2\u012f\u0130\5\2\2\2\u0130\u0131\7\33\2\2\u0131\u0133\7\65\2"+
-		"\2\u0132\u0134\5$\23\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0135"+
-		"\3\2\2\2\u0135\u0136\7\36\2\2\u0136C\3\2\2\2\u0137\u013b\7#\2\2\u0138"+
-		"\u013b\7$\2\2\u0139\u013b\7%\2\2\u013a\u0137\3\2\2\2\u013a\u0138\3\2\2"+
-		"\2\u013a\u0139\3\2\2\2\u013bE\3\2\2\2\u013c\u013e\7%\2\2\u013d\u013c\3"+
-		"\2\2\2\u013d\u013e\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\5\16\b\2\u0140"+
-		"\u0141\5\2\2\2\u0141\u0142\7\33\2\2\u0142\u0144\7\65\2\2\u0143\u0145\5"+
-		"$\23\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2\2\2\u0146"+
-		"\u0147\7\36\2\2\u0147G\3\2\2\2\u0148\u0149\7\n\2\2\u0149\u014a\7\65\2"+
-		"\2\u014a\u014d\7\13\2\2\u014b\u014e\7\65\2\2\u014c\u014e\7\f\2\2\u014d"+
-		"\u014b\3\2\2\2\u014d\u014c\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0150\7\36"+
-		"\2\2\u0150I\3\2\2\2\u0151\u0154\7\17\2\2\u0152\u0155\5L\'\2\u0153\u0155"+
-		"\5N(\2\u0154\u0152\3\2\2\2\u0154\u0153\3\2\2\2\u0155K\3\2\2\2\u0156\u0157"+
-		"\7\65\2\2\u0157\u015a\7\13\2\2\u0158\u015b\7\65\2\2\u0159\u015b\7\f\2"+
-		"\2\u015a\u0158\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u0160\3\2\2\2\u015c\u015d"+
-		"\7\35\2\2\u015d\u015f\5L\'\2\u015e\u015c\3\2\2\2\u015f\u0162\3\2\2\2\u0160"+
-		"\u015e\3\2\2\2\u0160\u0161\3\2\2\2\u0161M\3\2\2\2\u0162\u0160\3\2\2\2"+
-		"\u0163\u0168\7\66\2\2\u0164\u0165\7\35\2\2\u0165\u0167\7\66\2\2\u0166"+
-		"\u0164\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2"+
-		"\2\2\u0169O\3\2\2\2\u016a\u0168\3\2\2\2\u016b\u016c\7\21\2\2\u016c\u016d"+
-		"\5\2\2\2\u016d\u016e\7\25\2\2\u016e\u016f\5R*\2\u016f\u0170\7\26\2\2\u0170"+
-		"Q\3\2\2\2\u0171\u0174\5\"\22\2\u0172\u0174\5T+\2\u0173\u0171\3\2\2\2\u0173"+
-		"\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0173\3\2\2\2\u0175\u0176\3\2"+
-		"\2\2\u0176S\3\2\2\2\u0177\u0178\5\16\b\2\u0178\u0179\5\2\2\2\u0179\u017a"+
-		"\7\33\2\2\u017a\u017c\7\65\2\2\u017b\u017d\5$\23\2\u017c\u017b\3\2\2\2"+
-		"\u017c\u017d\3\2\2\2\u017d\u017e\3\2\2\2\u017e\u017f\7\36\2\2\u017fU\3"+
-		"\2\2\2\u0180\u0181\7\20\2\2\u0181\u0182\7\37\2\2\u0182\u0183\5\n\6\2\u0183"+
-		"\u0184\7\35\2\2\u0184\u0185\5\16\b\2\u0185\u0186\7 \2\2\u0186\u0187\5"+
-		"\2\2\2\u0187\u0188\7\33\2\2\u0188\u0189\7\65\2\2\u0189\u018a\7\36\2\2"+
-		"\u018aW\3\2\2\2\u018b\u018c\7\t\2\2\u018c\u018d\5Z.\2\u018d\u018f\7\25"+
-		"\2\2\u018e\u0190\5\\/\2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190"+
-		"\u0191\3\2\2\2\u0191\u0192\7\26\2\2\u0192Y\3\2\2\2\u0193\u0194\5\4\3\2"+
-		"\u0194[\3\2\2\2\u0195\u019a\5\"\22\2\u0196\u019a\5B\"\2\u0197\u019a\5"+
-		"8\35\2\u0198\u019a\5\60\31\2\u0199\u0195\3\2\2\2\u0199\u0196\3\2\2\2\u0199"+
-		"\u0197\3\2\2\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u0199\3\2"+
-		"\2\2\u019b\u019c\3\2\2\2\u019c]\3\2\2\2\u019d\u019e\7\22\2\2\u019e\u019f"+
-		"\5`\61\2\u019f\u01a1\7\25\2\2\u01a0\u01a2\5b\62\2\u01a1\u01a0\3\2\2\2"+
-		"\u01a1\u01a2\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a4\7\26\2\2\u01a4_\3"+
-		"\2\2\2\u01a5\u01a6\5\2\2\2\u01a6a\3\2\2\2\u01a7\u01aa\5\"\22\2\u01a8\u01aa"+
-		"\5d\63\2\u01a9\u01a7\3\2\2\2\u01a9\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab"+
-		"\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01acc\3\2\2\2\u01ad\u01ae\7\24\2\2"+
-		"\u01ae\u01af\5f\64\2\u01af\u01b0\7\27\2\2\u01b0\u01b1\5h\65\2\u01b1\u01b2"+
-		"\7\30\2\2\u01b2\u01b3\7\23\2\2\u01b3\u01b4\7\27\2\2\u01b4\u01b5\5j\66"+
-		"\2\u01b5\u01c2\7\30\2\2\u01b6\u01ba\7\25\2\2\u01b7\u01b9\5\"\22\2\u01b8"+
-		"\u01b7\3\2\2\2\u01b9\u01bc\3\2\2\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3\2"+
-		"\2\2\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u01bf\7\26\2\2\u01be"+
-		"\u01c0\7\36\2\2\u01bf\u01be\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c3\3"+
-		"\2\2\2\u01c1\u01c3\7\36\2\2\u01c2\u01b6\3\2\2\2\u01c2\u01c1\3\2\2\2\u01c3"+
-		"e\3\2\2\2\u01c4\u01c5\5\2\2\2\u01c5g\3\2\2\2\u01c6\u01c7\5\4\3\2\u01c7"+
-		"i\3\2\2\2\u01c8\u01c9\5\4\3\2\u01c9k\3\2\2\2.pt\177\u0089\u0092\u0094"+
+		"\n%\3%\3%\3&\3&\3&\5&\u0155\n&\3&\3&\3\'\3\'\3\'\3\'\5\'\u015d\n\'\3\'"+
+		"\3\'\7\'\u0161\n\'\f\'\16\'\u0164\13\'\3(\3(\3(\7(\u0169\n(\f(\16(\u016c"+
+		"\13(\3)\3)\3)\3)\3)\3)\3*\3*\6*\u0176\n*\r*\16*\u0177\3+\3+\3+\3+\3+\5"+
+		"+\u017f\n+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\5-\u0192"+
+		"\n-\3-\3-\3.\3.\3/\3/\3/\3/\6/\u019c\n/\r/\16/\u019d\3\60\3\60\3\60\3"+
+		"\60\5\60\u01a4\n\60\3\60\3\60\3\61\3\61\3\62\3\62\6\62\u01ac\n\62\r\62"+
+		"\16\62\u01ad\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\7"+
+		"\63\u01bb\n\63\f\63\16\63\u01be\13\63\3\63\3\63\5\63\u01c2\n\63\3\63\5"+
+		"\63\u01c5\n\63\3\64\3\64\3\65\3\65\3\66\3\66\3\66\2\2\2\67\2\2\4\2\6\2"+
+		"\b\2\n\2\f\2\16\2\20\2\22\2\24\2\26\2\30\2\32\2\34\2\36\2 \2\"\2$\2&\2"+
+		"(\2*\2,\2.\2\60\2\62\2\64\2\66\28\2:\2<\2>\2@\2B\2D\2F\2H\2J\2L\2N\2P"+
+		"\2R\2T\2V\2X\2Z\2\\\2^\2`\2b\2d\2f\2h\2j\2\2\7\6\2\3\24#\64\67\6799\3"+
+		"\2\658\3\2(\63\4\2&\'\64\64\3\2\r\16\u01db\2l\3\2\2\2\4p\3\2\2\2\6t\3"+
+		"\2\2\2\bv\3\2\2\2\nx\3\2\2\2\fz\3\2\2\2\16\177\3\2\2\2\20\u0089\3\2\2"+
+		"\2\22\u0094\3\2\2\2\24\u009f\3\2\2\2\26\u00a2\3\2\2\2\30\u00a6\3\2\2\2"+
+		"\32\u00a8\3\2\2\2\34\u00af\3\2\2\2\36\u00b1\3\2\2\2 \u00b6\3\2\2\2\"\u00bb"+
+		"\3\2\2\2$\u00c1\3\2\2\2&\u00cc\3\2\2\2(\u00d2\3\2\2\2*\u00d4\3\2\2\2,"+
+		"\u00dd\3\2\2\2.\u00eb\3\2\2\2\60\u00ed\3\2\2\2\62\u00f3\3\2\2\2\64\u00f9"+
+		"\3\2\2\2\66\u00fc\3\2\2\28\u0104\3\2\2\2:\u010c\3\2\2\2<\u0114\3\2\2\2"+
+		">\u011e\3\2\2\2@\u0129\3\2\2\2B\u012d\3\2\2\2D\u013a\3\2\2\2F\u013d\3"+
+		"\2\2\2H\u0148\3\2\2\2J\u0151\3\2\2\2L\u0158\3\2\2\2N\u0165\3\2\2\2P\u016d"+
+		"\3\2\2\2R\u0175\3\2\2\2T\u0179\3\2\2\2V\u0182\3\2\2\2X\u018d\3\2\2\2Z"+
+		"\u0195\3\2\2\2\\\u019b\3\2\2\2^\u019f\3\2\2\2`\u01a7\3\2\2\2b\u01ab\3"+
+		"\2\2\2d\u01af\3\2\2\2f\u01c6\3\2\2\2h\u01c8\3\2\2\2j\u01ca\3\2\2\2lm\t"+
+		"\2\2\2m\3\3\2\2\2nq\5\2\2\2oq\7:\2\2pn\3\2\2\2po\3\2\2\2q\5\3\2\2\2ru"+
+		"\5\2\2\2su\5\b\5\2tr\3\2\2\2ts\3\2\2\2u\7\3\2\2\2vw\t\3\2\2w\t\3\2\2\2"+
+		"xy\t\4\2\2y\13\3\2\2\2z{\t\5\2\2{\r\3\2\2\2|\u0080\5\n\6\2}\u0080\5\f"+
+		"\7\2~\u0080\5\4\3\2\177|\3\2\2\2\177}\3\2\2\2\177~\3\2\2\2\u0080\17\3"+
+		"\2\2\2\u0081\u0082\5\36\20\2\u0082\u0083\5\22\n\2\u0083\u008a\3\2\2\2"+
+		"\u0084\u0085\5 \21\2\u0085\u0086\5\24\13\2\u0086\u0087\3\2\2\2\u0087\u0088"+
+		"\7\2\2\3\u0088\u008a\3\2\2\2\u0089\u0081\3\2\2\2\u0089\u0084\3\2\2\2\u008a"+
+		"\21\3\2\2\2\u008b\u0093\5\26\f\2\u008c\u0093\5\32\16\2\u008d\u0093\5\""+
+		"\22\2\u008e\u0093\5\60\31\2\u008f\u0093\5X-\2\u0090\u0093\58\35\2\u0091"+
+		"\u0093\5^\60\2\u0092\u008b\3\2\2\2\u0092\u008c\3\2\2\2\u0092\u008d\3\2"+
+		"\2\2\u0092\u008e\3\2\2\2\u0092\u008f\3\2\2\2\u0092\u0090\3\2\2\2\u0092"+
+		"\u0091\3\2\2\2\u0093\u0096\3\2\2\2\u0094\u0092\3\2\2\2\u0094\u0095\3\2"+
+		"\2\2\u0095\23\3\2\2\2\u0096\u0094\3\2\2\2\u0097\u009e\5\26\f\2\u0098\u009e"+
+		"\5\32\16\2\u0099\u009e\5\"\22\2\u009a\u009e\5\60\31\2\u009b\u009e\5:\36"+
+		"\2\u009c\u009e\5^\60\2\u009d\u0097\3\2\2\2\u009d\u0098\3\2\2\2\u009d\u0099"+
+		"\3\2\2\2\u009d\u009a\3\2\2\2\u009d\u009b\3\2\2\2\u009d\u009c\3\2\2\2\u009e"+
+		"\u00a1\3\2\2\2\u009f\u009d\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\25\3\2\2"+
+		"\2\u00a1\u009f\3\2\2\2\u00a2\u00a3\7\3\2\2\u00a3\u00a4\5\30\r\2\u00a4"+
+		"\u00a5\7\36\2\2\u00a5\27\3\2\2\2\u00a6\u00a7\5\4\3\2\u00a7\31\3\2\2\2"+
+		"\u00a8\u00aa\7\4\2\2\u00a9\u00ab\t\6\2\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab"+
+		"\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ad\5\34\17\2\u00ad\u00ae\7\36\2"+
+		"\2\u00ae\33\3\2\2\2\u00af\u00b0\7\66\2\2\u00b0\35\3\2\2\2\u00b1\u00b2"+
+		"\7\6\2\2\u00b2\u00b3\7\33\2\2\u00b3\u00b4\7!\2\2\u00b4\u00b5\7\36\2\2"+
+		"\u00b5\37\3\2\2\2\u00b6\u00b7\7\6\2\2\u00b7\u00b8\7\33\2\2\u00b8\u00b9"+
+		"\7\"\2\2\u00b9\u00ba\7\36\2\2\u00ba!\3\2\2\2\u00bb\u00bc\7\5\2\2\u00bc"+
+		"\u00bd\5.\30\2\u00bd\u00be\7\33\2\2\u00be\u00bf\5(\25\2\u00bf\u00c0\7"+
+		"\36\2\2\u00c0#\3\2\2\2\u00c1\u00c2\7\31\2\2\u00c2\u00c7\5&\24\2\u00c3"+
+		"\u00c4\7\35\2\2\u00c4\u00c6\5&\24\2\u00c5\u00c3\3\2\2\2\u00c6\u00c9\3"+
+		"\2\2\2\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00ca\3\2\2\2\u00c9"+
+		"\u00c7\3\2\2\2\u00ca\u00cb\7\32\2\2\u00cb%\3\2\2\2\u00cc\u00cd\5.\30\2"+
+		"\u00cd\u00ce\7\33\2\2\u00ce\u00cf\5(\25\2\u00cf\'\3\2\2\2\u00d0\u00d3"+
+		"\5\6\4\2\u00d1\u00d3\5*\26\2\u00d2\u00d0\3\2\2\2\u00d2\u00d1\3\2\2\2\u00d3"+
+		")\3\2\2\2\u00d4\u00d8\7\25\2\2\u00d5\u00d7\5,\27\2\u00d6\u00d5\3\2\2\2"+
+		"\u00d7\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00db"+
+		"\3\2\2\2\u00da\u00d8\3\2\2\2\u00db\u00dc\7\26\2\2\u00dc+\3\2\2\2\u00dd"+
+		"\u00de\5\2\2\2\u00de\u00df\7\34\2\2\u00df\u00e0\5(\25\2\u00e0-\3\2\2\2"+
+		"\u00e1\u00ec\5\2\2\2\u00e2\u00e3\7\27\2\2\u00e3\u00e4\5\4\3\2\u00e4\u00e8"+
+		"\7\30\2\2\u00e5\u00e7\7;\2\2\u00e6\u00e5\3\2\2\2\u00e7\u00ea\3\2\2\2\u00e8"+
+		"\u00e6\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2"+
+		"\2\2\u00eb\u00e1\3\2\2\2\u00eb\u00e2\3\2\2\2\u00ec/\3\2\2\2\u00ed\u00ee"+
+		"\7\7\2\2\u00ee\u00ef\5\62\32\2\u00ef\u00f0\7\25\2\2\u00f0\u00f1\5\64\33"+
+		"\2\u00f1\u00f2\7\26\2\2\u00f2\61\3\2\2\2\u00f3\u00f4\5\2\2\2\u00f4\63"+
+		"\3\2\2\2\u00f5\u00f8\5\"\22\2\u00f6\u00f8\5\66\34\2\u00f7\u00f5\3\2\2"+
+		"\2\u00f7\u00f6\3\2\2\2\u00f8\u00fb\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00fa"+
+		"\3\2\2\2\u00fa\65\3\2\2\2\u00fb\u00f9\3\2\2\2\u00fc\u00fd\5\2\2\2\u00fd"+
+		"\u00fe\7\33\2\2\u00fe\u0100\7\65\2\2\u00ff\u0101\5$\23\2\u0100\u00ff\3"+
+		"\2\2\2\u0100\u0101\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103\7\36\2\2\u0103"+
+		"\67\3\2\2\2\u0104\u0105\7\b\2\2\u0105\u0106\5<\37\2\u0106\u0108\7\25\2"+
+		"\2\u0107\u0109\5> \2\u0108\u0107\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010a"+
+		"\3\2\2\2\u010a\u010b\7\26\2\2\u010b9\3\2\2\2\u010c\u010d\7\b\2\2\u010d"+
+		"\u010e\5<\37\2\u010e\u0110\7\25\2\2\u010f\u0111\5@!\2\u0110\u010f\3\2"+
+		"\2\2\u0110\u0111\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0113\7\26\2\2\u0113"+
+		";\3\2\2\2\u0114\u0115\5\2\2\2\u0115=\3\2\2\2\u0116\u011f\5\"\22\2\u0117"+
+		"\u011f\5B\"\2\u0118\u011f\58\35\2\u0119\u011f\5\60\31\2\u011a\u011f\5"+
+		"H%\2\u011b\u011f\5J&\2\u011c\u011f\5P)\2\u011d\u011f\5V,\2\u011e\u0116"+
+		"\3\2\2\2\u011e\u0117\3\2\2\2\u011e\u0118\3\2\2\2\u011e\u0119\3\2\2\2\u011e"+
+		"\u011a\3\2\2\2\u011e\u011b\3\2\2\2\u011e\u011c\3\2\2\2\u011e\u011d\3\2"+
+		"\2\2\u011f\u0120\3\2\2\2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121"+
+		"?\3\2\2\2\u0122\u012a\5\"\22\2\u0123\u012a\5F$\2\u0124\u012a\5:\36\2\u0125"+
+		"\u012a\5\60\31\2\u0126\u012a\5J&\2\u0127\u012a\5P)\2\u0128\u012a\5V,\2"+
+		"\u0129\u0122\3\2\2\2\u0129\u0123\3\2\2\2\u0129\u0124\3\2\2\2\u0129\u0125"+
+		"\3\2\2\2\u0129\u0126\3\2\2\2\u0129\u0127\3\2\2\2\u0129\u0128\3\2\2\2\u012a"+
+		"\u012b\3\2\2\2\u012b\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012cA\3\2\2\2"+
+		"\u012d\u012e\5D#\2\u012e\u012f\5\16\b\2\u012f\u0130\5\2\2\2\u0130\u0131"+
+		"\7\33\2\2\u0131\u0133\7\65\2\2\u0132\u0134\5$\23\2\u0133\u0132\3\2\2\2"+
+		"\u0133\u0134\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0136\7\36\2\2\u0136C\3"+
+		"\2\2\2\u0137\u013b\7#\2\2\u0138\u013b\7$\2\2\u0139\u013b\7%\2\2\u013a"+
+		"\u0137\3\2\2\2\u013a\u0138\3\2\2\2\u013a\u0139\3\2\2\2\u013bE\3\2\2\2"+
+		"\u013c\u013e\7%\2\2\u013d\u013c\3\2\2\2\u013d\u013e\3\2\2\2\u013e\u013f"+
+		"\3\2\2\2\u013f\u0140\5\16\b\2\u0140\u0141\5\2\2\2\u0141\u0142\7\33\2\2"+
+		"\u0142\u0144\7\65\2\2\u0143\u0145\5$\23\2\u0144\u0143\3\2\2\2\u0144\u0145"+
+		"\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0147\7\36\2\2\u0147G\3\2\2\2\u0148"+
+		"\u0149\7\n\2\2\u0149\u014a\7\65\2\2\u014a\u014d\7\13\2\2\u014b\u014e\7"+
+		"\65\2\2\u014c\u014e\7\f\2\2\u014d\u014b\3\2\2\2\u014d\u014c\3\2\2\2\u014e"+
+		"\u014f\3\2\2\2\u014f\u0150\7\36\2\2\u0150I\3\2\2\2\u0151\u0154\7\17\2"+
+		"\2\u0152\u0155\5L\'\2\u0153\u0155\5N(\2\u0154\u0152\3\2\2\2\u0154\u0153"+
+		"\3\2\2\2\u0155\u0156\3\2\2\2\u0156\u0157\7\36\2\2\u0157K\3\2\2\2\u0158"+
+		"\u0159\7\65\2\2\u0159\u015c\7\13\2\2\u015a\u015d\7\65\2\2\u015b\u015d"+
+		"\7\f\2\2\u015c\u015a\3\2\2\2\u015c\u015b\3\2\2\2\u015d\u0162\3\2\2\2\u015e"+
+		"\u015f\7\35\2\2\u015f\u0161\5L\'\2\u0160\u015e\3\2\2\2\u0161\u0164\3\2"+
+		"\2\2\u0162\u0160\3\2\2\2\u0162\u0163\3\2\2\2\u0163M\3\2\2\2\u0164\u0162"+
+		"\3\2\2\2\u0165\u016a\7\66\2\2\u0166\u0167\7\35\2\2\u0167\u0169\7\66\2"+
+		"\2\u0168\u0166\3\2\2\2\u0169\u016c\3\2\2\2\u016a\u0168\3\2\2\2\u016a\u016b"+
+		"\3\2\2\2\u016bO\3\2\2\2\u016c\u016a\3\2\2\2\u016d\u016e\7\21\2\2\u016e"+
+		"\u016f\5\2\2\2\u016f\u0170\7\25\2\2\u0170\u0171\5R*\2\u0171\u0172\7\26"+
+		"\2\2\u0172Q\3\2\2\2\u0173\u0176\5\"\22\2\u0174\u0176\5T+\2\u0175\u0173"+
+		"\3\2\2\2\u0175\u0174\3\2\2\2\u0176\u0177\3\2\2\2\u0177\u0175\3\2\2\2\u0177"+
+		"\u0178\3\2\2\2\u0178S\3\2\2\2\u0179\u017a\5\16\b\2\u017a\u017b\5\2\2\2"+
+		"\u017b\u017c\7\33\2\2\u017c\u017e\7\65\2\2\u017d\u017f\5$\23\2\u017e\u017d"+
+		"\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0181\7\36\2\2"+
+		"\u0181U\3\2\2\2\u0182\u0183\7\20\2\2\u0183\u0184\7\37\2\2\u0184\u0185"+
+		"\5\n\6\2\u0185\u0186\7\35\2\2\u0186\u0187\5\16\b\2\u0187\u0188\7 \2\2"+
+		"\u0188\u0189\5\2\2\2\u0189\u018a\7\33\2\2\u018a\u018b\7\65\2\2\u018b\u018c"+
+		"\7\36\2\2\u018cW\3\2\2\2\u018d\u018e\7\t\2\2\u018e\u018f\5Z.\2\u018f\u0191"+
+		"\7\25\2\2\u0190\u0192\5\\/\2\u0191\u0190\3\2\2\2\u0191\u0192\3\2\2\2\u0192"+
+		"\u0193\3\2\2\2\u0193\u0194\7\26\2\2\u0194Y\3\2\2\2\u0195\u0196\5\4\3\2"+
+		"\u0196[\3\2\2\2\u0197\u019c\5\"\22\2\u0198\u019c\5B\"\2\u0199\u019c\5"+
+		"8\35\2\u019a\u019c\5\60\31\2\u019b\u0197\3\2\2\2\u019b\u0198\3\2\2\2\u019b"+
+		"\u0199\3\2\2\2\u019b\u019a\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u019b\3\2"+
+		"\2\2\u019d\u019e\3\2\2\2\u019e]\3\2\2\2\u019f\u01a0\7\22\2\2\u01a0\u01a1"+
+		"\5`\61\2\u01a1\u01a3\7\25\2\2\u01a2\u01a4\5b\62\2\u01a3\u01a2\3\2\2\2"+
+		"\u01a3\u01a4\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\7\26\2\2\u01a6_\3"+
+		"\2\2\2\u01a7\u01a8\5\2\2\2\u01a8a\3\2\2\2\u01a9\u01ac\5\"\22\2\u01aa\u01ac"+
+		"\5d\63\2\u01ab\u01a9\3\2\2\2\u01ab\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad"+
+		"\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01aec\3\2\2\2\u01af\u01b0\7\24\2\2"+
+		"\u01b0\u01b1\5f\64\2\u01b1\u01b2\7\27\2\2\u01b2\u01b3\5h\65\2\u01b3\u01b4"+
+		"\7\30\2\2\u01b4\u01b5\7\23\2\2\u01b5\u01b6\7\27\2\2\u01b6\u01b7\5j\66"+
+		"\2\u01b7\u01c4\7\30\2\2\u01b8\u01bc\7\25\2\2\u01b9\u01bb\5\"\22\2\u01ba"+
+		"\u01b9\3\2\2\2\u01bb\u01be\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bc\u01bd\3\2"+
+		"\2\2\u01bd\u01bf\3\2\2\2\u01be\u01bc\3\2\2\2\u01bf\u01c1\7\26\2\2\u01c0"+
+		"\u01c2\7\36\2\2\u01c1\u01c0\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c5\3"+
+		"\2\2\2\u01c3\u01c5\7\36\2\2\u01c4\u01b8\3\2\2\2\u01c4\u01c3\3\2\2\2\u01c5"+
+		"e\3\2\2\2\u01c6\u01c7\5\2\2\2\u01c7g\3\2\2\2\u01c8\u01c9\5\4\3\2\u01c9"+
+		"i\3\2\2\2\u01ca\u01cb\5\4\3\2\u01cbk\3\2\2\2.pt\177\u0089\u0092\u0094"+
 		"\u009d\u009f\u00aa\u00c7\u00d2\u00d8\u00e8\u00eb\u00f7\u00f9\u0100\u0108"+
-		"\u0110\u011e\u0120\u0129\u012b\u0133\u013a\u013d\u0144\u014d\u0154\u015a"+
-		"\u0160\u0168\u0173\u0175\u017c\u018f\u0199\u019b\u01a1\u01a9\u01ab\u01ba"+
-		"\u01bf\u01c2";
+		"\u0110\u011e\u0120\u0129\u012b\u0133\u013a\u013d\u0144\u014d\u0154\u015c"+
+		"\u0162\u016a\u0175\u0177\u017e\u0191\u019b\u019d\u01a3\u01ab\u01ad\u01bc"+
+		"\u01c1\u01c4";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {

commit: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/b31c9ff4a763f42a032ee95ad0c940d07c5b3f2f/
                
tree: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/b31c9ff4a763f42a032ee95ad0c940d07c5b3f2f/tree/


commit b31c9ff4a763f42a032ee95ad0c940d07c5b3f2f
Author: Eric Le Lay <kerik-sf@users.sourceforge.net>
Date:   Wed Jul 8 15:59:34 2020 +0200

    add unit tests

diff --git a/build.xml b/build.xml
index 62a62f9..49cef5e 100755
--- a/build.xml
+++ b/build.xml
@@ -131,5 +131,11 @@
 		</delete>
 	</target>
 
+    <target name="test" description="run current unit tests" depends="jarAll">
+ 	    <ant dir="test" inheritAll="false" target="test" useNativeBasedir="true"/>
+ 	</target>
+    <target name="test-all" description="run all unit tests" depends="jarAll">
+    	<ant dir="test" inheritAll="false" target="test-all"/>
+    </target>
 </project>
 
diff --git a/test/data/sample2.proto b/test/data/sample2.proto
new file mode 100644
index 0000000..a525460
--- /dev/null
+++ b/test/data/sample2.proto
@@ -0,0 +1,23 @@
+syntax = "proto2";
+
+message Person {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+  repeated PhoneNumber phone = 4;
+}
+
+message Test {
+	required Person.PhoneNumber num = 1;
+}
diff --git a/test/data/sample2.txt b/test/data/sample2.txt
new file mode 100644
index 0000000..3218ca9
--- /dev/null
+++ b/test/data/sample2.txt
@@ -0,0 +1,15 @@
+sample2.proto
+  MESSAGE Person
+    MESSAGE PhoneNumber
+      MESSAGE_ITEM number
+      PhoneType type
+    ENUM PhoneType
+      ENUM_ITEM HOME
+      ENUM_ITEM MOBILE
+      ENUM_ITEM WORK
+    MESSAGE_ITEM email
+    MESSAGE_ITEM id
+    MESSAGE_ITEM name
+    PhoneNumber phone
+  MESSAGE Test
+    Person.PhoneNumber num
diff --git a/test/data/sample3.proto b/test/data/sample3.proto
new file mode 100644
index 0000000..8e18cf1
--- /dev/null
+++ b/test/data/sample3.proto
@@ -0,0 +1,34 @@
+syntax = "proto3";
+import public "sample_simple3.proto";
+option java_package = "com.example.foo";
+
+enum EnumAllowingAlias {
+  option allow_alias = true;
+  UNKNOWN = 0;
+  STARTED = 1;
+  RUNNING = 2 [(custom_option) = "hello world"];
+  NOT_STOPPED = 2;
+}
+
+message eEnumXX {
+	enum XX {
+		UNKNOWN = 0;
+	}
+}
+
+message outer {
+  option (my_option).a = true;
+  message inner {   // Level 2
+    int64 ival = 1;
+  }
+  repeated inner inner_message = 2;
+  EnumAllowingAlias enum_field = 3;
+  map<int32, EnumAllowingAlias> my_map = 4;
+  oneof xxx {
+  	  int32 num = 5;
+  	  EnumAllowingAlias str = 6;
+  }
+  eEnumXX.XX e = 7;
+  common.eSimple.Simple difficulty = 8;
+  reserved 10 to max;
+}
diff --git a/test/data/sample_simple3.proto b/test/data/sample_simple3.proto
new file mode 100644
index 0000000..ff49531
--- /dev/null
+++ b/test/data/sample_simple3.proto
@@ -0,0 +1,10 @@
+syntax = "proto3";
+
+package common;
+
+message eSimple {
+	enum Simple {
+		EASY = 0;
+		TRIVIAL = 1;
+	}
+}
diff --git a/test/protobuf/ProtobufTestUtils.java \
b/test/protobuf/ProtobufTestUtils.java new file mode 100644
index 0000000..e283640
--- /dev/null
+++ b/test/protobuf/ProtobufTestUtils.java
@@ -0,0 +1,190 @@
+/*
+copied from XMLTestUtils.java
+Copyright (C) 2009 Eric Le Lay
+
+ */
+package protobuf;
+
+// {{{ jUnit imports
+import static org.gjt.sp.jedit.testframework.EBFixture.doInBetween;
+import static org.gjt.sp.jedit.testframework.EBFixture.messageOfClassCondition;
+import static org.gjt.sp.jedit.testframework.TestUtils.action;
+import static org.gjt.sp.jedit.testframework.TestUtils.gotoPosition;
+import static org.gjt.sp.jedit.testframework.TestUtils.openFile;
+import static org.gjt.sp.jedit.testframework.TestUtils.view;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.swing.JWindow;
+
+import org.fest.swing.core.ComponentMatcher;
+import org.fest.swing.core.Robot;
+import org.fest.swing.edt.GuiActionRunner;
+import org.fest.swing.edt.GuiQuery;
+import org.fest.swing.edt.GuiTask;
+import org.fest.swing.fixture.ContainerFixture;
+import org.fest.swing.timing.Pause;
+import org.gjt.sp.jedit.Buffer;
+import org.gjt.sp.jedit.EBMessage;
+import org.gjt.sp.jedit.PluginJAR;
+import org.gjt.sp.jedit.jEdit;
+import org.gjt.sp.jedit.msg.PluginUpdate;
+import org.gjt.sp.jedit.testframework.EBFixture.EBCondition;
+import org.gjt.sp.jedit.testframework.EBFixture.MessageListener;
+import org.gjt.sp.jedit.testframework.TestUtils;
+
+import sidekick.SideKickParsedData;
+import sidekick.protobuf.ProtobufSideKickParsedData;
+// }}}
+
+/**
+ * a handful of utility methods.
+ * Some of them may be moved to the test-framework as they prove useful
+ * $Id$
+ */
+public class ProtobufTestUtils {
+
+	public static void parseAndWait(){
+		doInBetween(
+			new Runnable(){
+				public void run(){
+					action("sidekick-parse");
+				}
+			},
+			messageOfClassCondition(sidekick.SideKickUpdate.class)
+			,10000);
+	}
+
+	/** open, parse and wait for SideKickUpdate in one go, to be sure not to miss the \
message */ +	public static Buffer openParseAndWait(final String path){
+		final Buffer[] ret = new Buffer[1];
+		doInBetween(
+			new Runnable(){
+				public void run(){
+					ret[0] = openFile(path);
+					action("sidekick-parse");
+				}
+			},
+			messageOfClassCondition(sidekick.SideKickUpdate.class)
+			,10000);
+		return ret[0];
+	}
+
+	public static void gotoPositionAndWait(int pos){
+		gotoPosition(pos);
+		Pause.pause(500);
+	}
+
+	/**
+	 * activates, deactivates and activates again the given plugin.
+	 * this is useful to test that whatever settings it kept are well
+	 * persisted.
+	 *
+	 * @param	editPluginClass	the main class of the plugin to deactivate and reactivate
+	 */
+	public static final void reactivatePlugin(Class<?> editPluginClass){
+		final PluginJAR jar = jEdit.getPlugin(editPluginClass.getName()).getPluginJAR();
+
+		assertNotNull(jar);
+
+		// XMLPlugin is not activated, even if we tested the resolver, since
+		// only Resolver.instance() is called
+		// this ensures that its stop() method will be called !
+		jar.activatePlugin();
+
+		MessageListener listen =  new MessageListener();
+		listen.registerForMessage(new EBCondition(){
+				public boolean matches(EBMessage msg){
+					if(msg instanceof PluginUpdate){
+						PluginUpdate upd = (PluginUpdate)msg;
+						return upd.getWhat() == PluginUpdate.DEACTIVATED
+								&& upd.getPluginJAR() == jar;
+					}else return false;
+				}
+		});
+
+		GuiActionRunner.execute(new GuiTask(){
+				protected void executeInEDT(){
+					jar.deactivatePlugin(false);
+				}
+		});
+
+		listen.waitForMessage(10000);
+
+		listen.registerForMessage(new EBCondition(){
+				public boolean matches(EBMessage msg){
+					if(msg instanceof PluginUpdate){
+						PluginUpdate upd = (PluginUpdate)msg;
+						return upd.getWhat() == PluginUpdate.ACTIVATED
+								&& upd.getPluginJAR() == jar;
+					}else return false;
+				}
+		});
+
+		jar.activatePlugin();
+
+		listen.waitForMessage(10000);
+	}
+
+	public static class JWindowFixture extends ContainerFixture<JWindow>{
+		public JWindowFixture(Robot robot, JWindow target){
+			super(robot,target);
+		}
+
+		public JWindowFixture requireNotVisible(){
+			assertFalse(target.isVisible());
+			return this;
+		}
+
+		public JWindowFixture requireVisible(){
+			assertTrue(target.isVisible());
+			return this;
+		}
+	}
+
+	public static JWindowFixture completionPopup(){
+		Component  completionC = TestUtils.robot().finder().find(
+			new ComponentMatcher(){
+				public boolean matches(Component c){
+					return c instanceof org.gjt.sp.jedit.gui.CompletionPopup
+							&& c.isVisible();
+				}
+			});
+
+		return new JWindowFixture(TestUtils.robot(),(JWindow)completionC);
+	}
+
+	/**
+	 * utility method to return the ProtobufSideKickParsedData of current view/buffer
+	 * fails if data is not instance of ProtobufSideKickParsedData
+	 */
+	public static ProtobufSideKickParsedData getParsedData(){
+		Pause.pause(500);
+		SideKickParsedData _data = SideKickParsedData.getParsedData(view());
+		System.err.println("ProtobufSideKickParsedData:"+_data.getClass()+":"+_data);
+		assertTrue("no ProtobufSideKickParsedData in current view/buffer",
+			_data instanceof ProtobufSideKickParsedData);
+
+		return (ProtobufSideKickParsedData)_data;
+	}
+
+	public static Buffer bufferWithText(final String mode, final String text){
+		return GuiActionRunner.execute(new GuiQuery<Buffer>(){
+				public Buffer executeInEDT(){
+					Buffer b = jEdit.newFile(view());
+					b.setMode(mode);
+					b.insert(0, text);
+					return b;
+				}
+		});
+	}
+
+
+}
diff --git a/test/sidekick/protobuf/hyperlinks/HyperlinkTest.java \
b/test/sidekick/protobuf/hyperlinks/HyperlinkTest.java new file mode 100644
index 0000000..61e9f9c
--- /dev/null
+++ b/test/sidekick/protobuf/hyperlinks/HyperlinkTest.java
@@ -0,0 +1,172 @@
+/*
+Copyright (C) 2020 Eric Le Lay
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+* Neither the name of the <ORGANIZATION> nor the names of its contributors
+may be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package sidekick.protobuf.hyperlinks;
+
+import static org.gjt.sp.jedit.testframework.EBFixture.doInBetween;
+import static org.gjt.sp.jedit.testframework.EBFixture.messageOfClassCondition;
+import static org.gjt.sp.jedit.testframework.TestUtils.action;
+import static org.gjt.sp.jedit.testframework.TestUtils.close;
+import static org.gjt.sp.jedit.testframework.TestUtils.openFile;
+import static org.gjt.sp.jedit.testframework.TestUtils.view;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static protobuf.ProtobufTestUtils.getParsedData;
+import static protobuf.ProtobufTestUtils.gotoPositionAndWait;
+import static protobuf.ProtobufTestUtils.openParseAndWait;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+
+import org.gjt.sp.jedit.Buffer;
+import org.gjt.sp.jedit.testframework.TestUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import gatchan.jedit.hyperlinks.jEditOpenFileAndGotoHyperlink;
+import gatchan.jedit.hyperlinks.Hyperlink;
+import gatchan.jedit.hyperlinks.HyperlinkSource;
+
+import sidekick.protobuf.ProtobufSideKickParsedData;
+import sidekick.protobuf.ProtobufNode;
+import sidekick.protobuf.hyperlinks.PBHyperlinkSource;
+
+import org.fest.swing.timing.Pause;
+import org.fest.swing.edt.GuiActionRunner;
+import org.fest.swing.edt.GuiTask;
+
+/**
+ * unit tests for parsing protobuf files
+ */
+public class HyperlinkTest {
+	private static File testData;
+
+    @BeforeClass
+    public static void setUpjEdit() throws IOException{
+        TestUtils.beforeClass();
+        testData = new File(System.getProperty("test_data")).getCanonicalFile();
+        assertTrue(testData.exists());
+    }
+
+    @AfterClass
+    public static void tearDownjEdit() {
+        TestUtils.afterClass();
+    }
+
+	@Test
+	public void testFieldToTypeProto2(){
+    	File proto = new File(testData,"sample2.proto");
+
+    	Buffer b = TestUtils.openFile(proto.getPath());
+
+    	// wait for end of parsing
+    	doInBetween(new Runnable(){
+    			public void run(){
+    				action("sidekick-parse",1);
+    		}},
+    		messageOfClassCondition(sidekick.SideKickUpdate.class),
+    		10000);
+
+    	action("sidekick-tree");
+    	Pause.pause(2000);
+
+    	HyperlinkSource src = PBHyperlinkSource.create();
+		final Hyperlink h = src.getHyperlink(TestUtils.view().getBuffer(), 311);
+		assertNotNull(h);
+		assertTrue(h instanceof jEditOpenFileAndGotoHyperlink);
+		assertEquals(13, ((jEditOpenFileAndGotoHyperlink)h).gotoLine);
+		GuiActionRunner.execute(new GuiTask() {
+
+			@Override
+			protected void executeInEDT() throws Throwable {
+				h.click(TestUtils.view());
+			}
+		});
+
+		assertEquals(proto.getPath(), TestUtils.view().getBuffer().getPath());
+	}
+
+	@Test
+	public void testFieldToTypeProto3(){
+    	File proto = new File(testData,"sample3.proto");
+
+    	Buffer b = TestUtils.openFile(proto.getPath());
+
+    	// wait for end of parsing
+    	doInBetween(new Runnable(){
+    			public void run(){
+    				action("sidekick-parse",1);
+    		}},
+    		messageOfClassCondition(sidekick.SideKickUpdate.class),
+    		10000);
+
+    	action("sidekick-tree");
+    	Pause.pause(2000);
+
+    	HyperlinkSource src = PBHyperlinkSource.create();
+    	// map type
+    	{
+			final Hyperlink h = src.getHyperlink(TestUtils.view().getBuffer(), 502);
+			assertNotNull(h);
+			assertTrue(h instanceof jEditOpenFileAndGotoHyperlink);
+			assertEquals(4, ((jEditOpenFileAndGotoHyperlink)h).gotoLine);
+			GuiActionRunner.execute(new GuiTask() {
+
+				@Override
+				protected void executeInEDT() throws Throwable {
+					h.click(TestUtils.view());
+				}
+			});
+
+			assertEquals(proto.getPath(), TestUtils.view().getBuffer().getPath());
+		}
+
+    	// eEnumXX.XX
+    	{
+			final Hyperlink h = src.getHyperlink(TestUtils.view().getBuffer(), 602);
+			assertNotNull(h);
+			assertTrue(h instanceof jEditOpenFileAndGotoHyperlink);
+			assertEquals(13, ((jEditOpenFileAndGotoHyperlink)h).gotoLine);
+			GuiActionRunner.execute(new GuiTask() {
+
+				@Override
+				protected void executeInEDT() throws Throwable {
+					h.click(TestUtils.view());
+				}
+			});
+
+			assertEquals(proto.getPath(), TestUtils.view().getBuffer().getPath());
+		}
+	}
+}
diff --git a/test/sidekick/protobuf/parser/ParseTest.java \
b/test/sidekick/protobuf/parser/ParseTest.java new file mode 100644
index 0000000..c8bc28f
--- /dev/null
+++ b/test/sidekick/protobuf/parser/ParseTest.java
@@ -0,0 +1,146 @@
+/*
+Copyright (C) 2020 Eric Le Lay
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+* Neither the name of the <ORGANIZATION> nor the names of its contributors
+may be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package sidekick.protobuf.parser;
+
+import static org.gjt.sp.jedit.testframework.EBFixture.doInBetween;
+import static org.gjt.sp.jedit.testframework.EBFixture.messageOfClassCondition;
+import static org.gjt.sp.jedit.testframework.TestUtils.action;
+import static org.gjt.sp.jedit.testframework.TestUtils.close;
+import static org.gjt.sp.jedit.testframework.TestUtils.openFile;
+import static org.gjt.sp.jedit.testframework.TestUtils.view;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static protobuf.ProtobufTestUtils.getParsedData;
+import static protobuf.ProtobufTestUtils.gotoPositionAndWait;
+import static protobuf.ProtobufTestUtils.openParseAndWait;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+
+import org.gjt.sp.jedit.Buffer;
+import org.gjt.sp.jedit.testframework.TestUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import sidekick.protobuf.ProtobufSideKickParsedData;
+import sidekick.protobuf.ProtobufNode;
+
+
+/**
+ * unit tests for parsing protobuf files
+ */
+public class ParseTest{
+	private static File testData;
+	
+    @BeforeClass
+    public static void setUpjEdit() throws IOException{
+        TestUtils.beforeClass();
+        testData = new File(System.getProperty("test_data")).getCanonicalFile();
+        assertTrue(testData.exists());
+    }
+    
+    @AfterClass
+    public static void tearDownjEdit() {
+        TestUtils.afterClass();
+    }
+
+	/** parse a simple protobuf2 sample */
+	@Test
+	public void testProto2Syntax() throws IOException{
+		File proto = new File(testData,"sample2.proto");
+		String repr = new String(Files.readAllBytes(new \
File(testData,"sample2.txt").toPath())); +
+		final Buffer b = openParseAndWait(proto.getPath());
+
+		try{
+			ProtobufSideKickParsedData data = getParsedData();
+			assertEquals(repr, treeStr(data.root));
+		}finally{
+			// discard changes
+			TestUtils.close(view(), b);
+		}
+	}
+
+	/** parse a simple protobuf3 sample */
+	@Test
+	public void testProto3Syntax() throws IOException{
+		File proto = new File(testData,"sample3.proto");
+		String repr = new String(Files.readAllBytes(new \
File(testData,"sample3.txt").toPath())); +
+		final Buffer b = openParseAndWait(proto.getPath());
+
+		try{
+			ProtobufSideKickParsedData data = getParsedData();
+			String res = treeStr(data.root);
+			System.err.println(res);
+			assertEquals(repr, res);
+		}finally{
+			// discard changes
+			TestUtils.close(view(), b);
+		}
+	}
+
+	public static String treeStr(DefaultMutableTreeNode root) {
+		StringBuilder sb = new StringBuilder(root.toString());
+		sb.append('\n');
+		for(int i=0; i < root.getChildCount(); i++) {
+			treeStr((DefaultMutableTreeNode)root.getChildAt(i), "  ", sb);
+		}
+		return sb.toString();
+	}
+
+	public static void treeStr(DefaultMutableTreeNode tn, String indent, StringBuilder \
ret) { +		ProtobufNode n = (ProtobufNode) tn.getUserObject();
+		ret.append(indent);
+		if (n.getKind() == ProtobufNode.Kind.MESSAGE_ITEM) {
+			if (n.getType() != null) {
+				ret.append(n.getType().toString());
+			} else {
+				ret.append("MESSAGE_ITEM");
+			}
+		} else if (n.getKind() == ProtobufNode.Kind.MAP_MESSAGE_ITEM) {
+			ret.append("MAP_MESSAGE_ITEM");
+			if (n.getType() != null) {
+				ret.append(' ').append(n.getType().toString());
+			}
+		} else {
+			ret.append(n.getKind());
+		}
+		ret.append(' ').append(n.getName()).append('\n');
+		for(int i=0; i < tn.getChildCount(); i++) {
+			treeStr((DefaultMutableTreeNode)tn.getChildAt(i), indent + "  ", ret);
+		}
+	}
+}

commit: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/8970af2e6221c7e75cd6b5f939282309f138987c/
                
tree: http://sourceforge.net/p/jedit/ProtocolBuffer/ci/8970af2e6221c7e75cd6b5f939282309f138987c/tree/


commit 8970af2e6221c7e75cd6b5f939282309f138987c
Author: Eric Le Lay <kerik-sf@users.sourceforge.net>
Date:   Wed Jul 8 12:28:11 2020 +0200

    support keywords as identifiers (eg. field named 'message')

diff --git a/resources/antlr4/ProtoParser.g4 b/resources/antlr4/ProtoParser.g4
index 27c851a..09abfbb 100755
--- a/resources/antlr4/ProtoParser.g4
+++ b/resources/antlr4/ProtoParser.g4
@@ -28,13 +28,58 @@ import ProtoLexer;
 */
 
 // Predefines
+
+/* nothing prevents an identifier to be eg. 'message'.
+ * So add all tokens compatible with identifier construction rules manually
+ */
+identifier
+  : IDENTIFIER
+  | PACKAGE_LITERAL
+  | IMPORT_LITERAL
+  | OPTION_LITERAL
+  | SYNTAX_LITERAL
+  | ENUM_LITERAL
+  | MESSAGE_LITERAL
+  | EXTEND_LITERAL
+  | EXTENSIONS_DEF_LITERAL
+  | TO_LITERAL
+  | MAX_LITERAL
+  | PUBLIC_LITERAL
+  | WEAK_LITERAL
+  | RESERVED_LITERAL
+  | MAP_LITERAL
+  | ONEOF_LITERAL
+  | SERVICE_LITERAL
+  | RETURNS_LITERAL
+  | RPC_LITERAL
+  | REQUIRED_PROTOBUF_SCOPE_LITERAL
+  | OPTIONAL_PROTOBUF_SCOPE_LITERAL
+  | REPEATED_PROTOBUF_SCOPE_LITERAL
+  | DOUBLE_PROTOBUF_TYPE_LITERAL
+  | FLOAT_PROTOBUF_TYPE_LITERAL
+  | INT32_PROTOBUF_TYPE_LITERAL
+  | INT64_PROTOBUF_TYPE_LITERAL
+  | UINT32_PROTOBUF_TYPE_LITERAL
+  | UINT64_PROTOBUF_TYPE_LITERAL
+  | SINT32_PROTOBUF_TYPE_LITERAL
+  | SINT64_PROTOBUF_TYPE_LITERAL
+  | FIXED32_PROTOBUF_TYPE_LITERAL
+  | FIXED64_PROTOBUF_TYPE_LITERAL
+  | SFIXED32_PROTOBUF_TYPE_LITERAL
+  | SFIXED64_PROTOBUF_TYPE_LITERAL
+  | BOOL_PROTOBUF_TYPE_LITERAL
+  | STRING_PROTOBUF_TYPE_LITERAL
+  | BYTES_PROTOBUF_TYPE_LITERAL
+  | BOOL_LITERAL
+  ;
+
 all_identifier
-  :  IDENTIFIER
+  :  identifier
   |  QUALIFIED_IDENTIFIER
   ;
 
 all_value
-  :  IDENTIFIER
+  :  identifier
   |  literal_value
   ;
 
@@ -140,11 +185,11 @@ option_value_object
   ;
 
 option_value_item
-  :  IDENTIFIER COLON option_all_value
+  :  identifier COLON option_all_value
   ;
 
 option_name
-  :  IDENTIFIER
+  :  identifier
   |  PAREN_OPEN all_identifier PAREN_CLOSE FIELD_IDENTIFIER*
   ;
 // Option in line----------------------
@@ -154,12 +199,12 @@ enum_def
   :  ENUM_LITERAL enum_name BLOCK_OPEN enum_content BLOCK_CLOSE
   ;
 
-enum_name : IDENTIFIER ;
+enum_name : identifier ;
 
 enum_content : (option_line_def | enum_item_def)* ;
 
 enum_item_def
-  :  IDENTIFIER EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR
+  :  identifier EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR
   ;
 // Enum -------------------------------
 
@@ -171,20 +216,20 @@ message_def3
   :  MESSAGE_LITERAL message_name BLOCK_OPEN message_content3? BLOCK_CLOSE
   ;
 
-message_name : IDENTIFIER ;
+message_name : identifier ;
 
 message_content2 : (option_line_def | message_item_def2 | message_def2 | enum_def | \
message_ext_def | reserved_def | oneof_def | map_field_def)+ ;  
 message_content3 : (option_line_def | message_item_def3 | message_def3 | enum_def | \
reserved_def | oneof_def | map_field_def)+ ;  
 message_item_def2
-  : protobuf_scope_literal2 proto_type IDENTIFIER EQUALS INTEGER_LITERAL \
option_field_def? ITEM_TERMINATOR +  : protobuf_scope_literal2 proto_type identifier \
EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR  ;
 
 protobuf_scope_literal2: (v=REQUIRED_PROTOBUF_SCOPE_LITERAL | \
v=OPTIONAL_PROTOBUF_SCOPE_LITERAL | v=REPEATED_PROTOBUF_SCOPE_LITERAL) ;  
 message_item_def3
-  : REPEATED_PROTOBUF_SCOPE_LITERAL?  proto_type IDENTIFIER EQUALS INTEGER_LITERAL \
option_field_def? ITEM_TERMINATOR +  : REPEATED_PROTOBUF_SCOPE_LITERAL?  proto_type \
identifier EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR  ;
 
 message_ext_def
@@ -205,7 +250,7 @@ reserved_field_names
   
 // FIXME: empty statement?
 oneof_def
-  :  ONEOF_LITERAL IDENTIFIER BLOCK_OPEN oneof_content BLOCK_CLOSE
+  :  ONEOF_LITERAL identifier BLOCK_OPEN oneof_content BLOCK_CLOSE
   ;
 
 oneof_content
@@ -213,11 +258,11 @@ oneof_content
   ;
 
 oneof_field_def
-  :  proto_type IDENTIFIER EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR
+  :  proto_type identifier EQUALS INTEGER_LITERAL option_field_def? ITEM_TERMINATOR
   ;
 
 map_field_def
-  :  MAP_LITERAL LT proto_map_key_type COMMA proto_type GT IDENTIFIER EQUALS \
INTEGER_LITERAL ITEM_TERMINATOR +  :  MAP_LITERAL LT proto_map_key_type COMMA \
proto_type GT identifier EQUALS INTEGER_LITERAL ITEM_TERMINATOR  ;
 
 // Message ----------------------------
@@ -237,7 +282,7 @@ service_def
   :  SERVICE_LITERAL service_name BLOCK_OPEN service_content? BLOCK_CLOSE
   ;
 
-service_name : IDENTIFIER ;
+service_name : identifier ;
 
 service_content : (option_line_def | rpc_def )+ ;
 
@@ -245,7 +290,7 @@ rpc_def
   :  RPC_LITERAL rpc_name PAREN_OPEN req_name PAREN_CLOSE RETURNS_LITERAL PAREN_OPEN \
resp_name PAREN_CLOSE (BLOCK_OPEN option_line_def* BLOCK_CLOSE ITEM_TERMINATOR? | \
ITEM_TERMINATOR)  ;
 
-rpc_name : IDENTIFIER ;
+rpc_name : identifier ;
 req_name : all_identifier ;
 resp_name : all_identifier ;
 // Service ----------------------------
diff --git a/sidekick/protobuf/ProtobufSideKickListener.java \
b/sidekick/protobuf/ProtobufSideKickListener.java index ddcc7a4..64ff87b 100755
--- a/sidekick/protobuf/ProtobufSideKickListener.java
+++ b/sidekick/protobuf/ProtobufSideKickListener.java
@@ -95,7 +95,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.message_name().IDENTIFIER().toString();
+        String name = ctx.message_name().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -114,7 +114,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.message_name().IDENTIFIER().toString();
+        String name = ctx.message_name().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -146,7 +146,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  ProtoParserParser.Proto_typeContext type = \
ctx.proto_type();  node.setType(getTypeNode(type));
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -175,7 +175,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  
 		node.setType(getTypeNode(ctx.proto_type()));
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -201,7 +201,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  
 		node.setType(getTypeNode(ctx.proto_type()));
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -222,7 +222,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -244,7 +244,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  
 		node.setType(getTypeNode(ctx.proto_type()));
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -264,7 +264,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.service_name().IDENTIFIER().toString();
+        String name = ctx.service_name().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -284,7 +284,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.enum_name().IDENTIFIER().toString();
+        String name = ctx.enum_name().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -304,7 +304,7 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  node.setStartLocation( getStartLocation( ctx ) );
         node.setEndLocation( getEndLocation( ctx ) );
 
-        String name = ctx.IDENTIFIER().toString();
+        String name = ctx.identifier().getText();
         node.setName(name);
 
         node.setStartPosition(new SideKickPosition(ctx.getStart().getStartIndex()));
@@ -325,16 +325,16 @@ public class ProtobufSideKickListener extends \
ProtoParserBaseListener {  ProtoParserParser.All_identifierContext id = \
type.all_identifier();  if (id != null) {
 				String idS;
-				if (id.IDENTIFIER() == null) {
+				if (id.identifier() == null) {
 					idS = id.QUALIFIED_IDENTIFIER().toString();
 					idn = new ProtobufNode(idS, Kind.TYPE_REF);
 					idn.setStartPosition(new \
                SideKickPosition(id.QUALIFIED_IDENTIFIER().getSymbol().getStartIndex()));
                
 					idn.setEndPosition(new \
SideKickPosition(id.QUALIFIED_IDENTIFIER().getSymbol().getStopIndex() + 1));  } else \
                {
-					idS = id.IDENTIFIER().toString();
+					idS = id.identifier().getText();
 					idn = new ProtobufNode(idS, Kind.TYPE_REF);
-					idn.setStartPosition(new \
                SideKickPosition(id.IDENTIFIER().getSymbol().getStartIndex()));
-					idn.setEndPosition(new \
SideKickPosition(id.IDENTIFIER().getSymbol().getStopIndex() + 1)); \
+					idn.setStartPosition(new SideKickPosition(id.getStart().getStartIndex())); \
+					idn.setEndPosition(new SideKickPosition(id.getStart().getStopIndex() + 1));  }
 			}
 		}
diff --git a/sidekick/protobuf/parser/ProtoParserBaseListener.java \
b/sidekick/protobuf/parser/ProtoParserBaseListener.java index 72d57cf..709591c 100644
--- a/sidekick/protobuf/parser/ProtoParserBaseListener.java
+++ b/sidekick/protobuf/parser/ProtoParserBaseListener.java
@@ -13,6 +13,18 @@ import org.antlr.v4.runtime.tree.TerminalNode;
  * of the available methods.
  */
 public class ProtoParserBaseListener implements ProtoParserListener {
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterIdentifier(@NotNull ProtoParserParser.IdentifierContext \
ctx) { } +	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitIdentifier(@NotNull ProtoParserParser.IdentifierContext \
ctx) { }  /**
 	 * {@inheritDoc}
 	 *
diff --git a/sidekick/protobuf/parser/ProtoParserListener.java \
b/sidekick/protobuf/parser/ProtoParserListener.java index 4f15016..99f2f0a 100644
--- a/sidekick/protobuf/parser/ProtoParserListener.java
+++ b/sidekick/protobuf/parser/ProtoParserListener.java
@@ -9,6 +9,16 @@ import org.antlr.v4.runtime.tree.ParseTreeListener;
  * {@link ProtoParserParser}.
  */
 public interface ProtoParserListener extends ParseTreeListener {
+	/**
+	 * Enter a parse tree produced by {@link ProtoParserParser#identifier}.
+	 * @param ctx the parse tree
+	 */
+	void enterIdentifier(@NotNull ProtoParserParser.IdentifierContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ProtoParserParser#identifier}.
+	 * @param ctx the parse tree
+	 */
+	void exitIdentifier(@NotNull ProtoParserParser.IdentifierContext ctx);
 	/**
 	 * Enter a parse tree produced by {@link ProtoParserParser#all_identifier}.
 	 * @param ctx the parse tree
diff --git a/sidekick/protobuf/parser/ProtoParserParser.java \
b/sidekick/protobuf/parser/ProtoParserParser.java index 7bc6638..0370c7a 100644
--- a/sidekick/protobuf/parser/ProtoParserParser.java
+++ b/sidekick/protobuf/parser/ProtoParserParser.java
@@ -28,24 +28,24 @@ public class ProtoParserParser extends Parser {
 		IDENTIFIER=55, QUALIFIED_IDENTIFIER=56, FIELD_IDENTIFIER=57, COMMENT=58, 
 		LINE_COMMENT=59, WHITESPACE=60;
 	public static final int
-		RULE_all_identifier = 0, RULE_all_value = 1, RULE_literal_value = 2, \
                RULE_proto_map_key_type = 3, 
-		RULE_proto_no_map_key_type = 4, RULE_proto_type = 5, RULE_proto = 6, RULE_proto2 = \
                7, 
-		RULE_proto3 = 8, RULE_package_def = 9, RULE_package_name = 10, RULE_import_def = \
                11, 
-		RULE_import_file_name = 12, RULE_syntax_def2 = 13, RULE_syntax_def3 = 14, 
-		RULE_option_line_def = 15, RULE_option_field_def = 16, RULE_option_field_item = \
                17, 
-		RULE_option_all_value = 18, RULE_option_value_object = 19, RULE_option_value_item \
                = 20, 
-		RULE_option_name = 21, RULE_enum_def = 22, RULE_enum_name = 23, RULE_enum_content \
                = 24, 
-		RULE_enum_item_def = 25, RULE_message_def2 = 26, RULE_message_def3 = 27, 
-		RULE_message_name = 28, RULE_message_content2 = 29, RULE_message_content3 = 30, 
-		RULE_message_item_def2 = 31, RULE_protobuf_scope_literal2 = 32, \
                RULE_message_item_def3 = 33, 
-		RULE_message_ext_def = 34, RULE_reserved_def = 35, RULE_reserved_ranges = 36, 
-		RULE_reserved_field_names = 37, RULE_oneof_def = 38, RULE_oneof_content = 39, 
-		RULE_oneof_field_def = 40, RULE_map_field_def = 41, RULE_ext_def = 42, 
-		RULE_ext_name = 43, RULE_ext_content = 44, RULE_service_def = 45, \
                RULE_service_name = 46, 
-		RULE_service_content = 47, RULE_rpc_def = 48, RULE_rpc_name = 49, RULE_req_name = \
                50, 
-		RULE_resp_name = 51;
+		RULE_identifier = 0, RULE_all_identifier = 1, RULE_all_value = 2, \
RULE_literal_value = 3,  +		RULE_proto_map_key_type = 4, RULE_proto_no_map_key_type = \
5, RULE_proto_type = 6,  +		RULE_proto = 7, RULE_proto2 = 8, RULE_proto3 = 9, \
RULE_package_def = 10,  +		RULE_package_name = 11, RULE_import_def = 12, \
RULE_import_file_name = 13,  +		RULE_syntax_def2 = 14, RULE_syntax_def3 = 15, \
RULE_option_line_def = 16,  +		RULE_option_field_def = 17, RULE_option_field_item = \
18, RULE_option_all_value = 19,  +		RULE_option_value_object = 20, \
RULE_option_value_item = 21, RULE_option_name = 22,  +		RULE_enum_def = 23, \
RULE_enum_name = 24, RULE_enum_content = 25, RULE_enum_item_def = 26,  \
+		RULE_message_def2 = 27, RULE_message_def3 = 28, RULE_message_name = 29,  \
+		RULE_message_content2 = 30, RULE_message_content3 = 31, RULE_message_item_def2 = \
32,  +		RULE_protobuf_scope_literal2 = 33, RULE_message_item_def3 = 34, \
RULE_message_ext_def = 35,  +		RULE_reserved_def = 36, RULE_reserved_ranges = 37, \
RULE_reserved_field_names = 38,  +		RULE_oneof_def = 39, RULE_oneof_content = 40, \
RULE_oneof_field_def = 41,  +		RULE_map_field_def = 42, RULE_ext_def = 43, \
RULE_ext_name = 44, RULE_ext_content = 45,  +		RULE_service_def = 46, \
RULE_service_name = 47, RULE_service_content = 48,  +		RULE_rpc_def = 49, \
RULE_rpc_name = 50, RULE_req_name = 51, RULE_resp_name = 52;  public static final \
                String[] ruleNames = {
-		"all_identifier", "all_value", "literal_value", "proto_map_key_type", 
+		"identifier", "all_identifier", "all_value", "literal_value", \
"proto_map_key_type",   "proto_no_map_key_type", "proto_type", "proto", "proto2", \
"proto3", "package_def",   "package_name", "import_def", "import_file_name", \
"syntax_def2", "syntax_def3",   "option_line_def", "option_field_def", \
"option_field_item", "option_all_value",  @@ -133,34 +133,70 @@ public class \
ProtoParserParser extends Parser {  super(input);
 		_interp = new ParserATNSimulator(this,_ATN);
 	}
-	public static class All_identifierContext extends ParserRuleContext {
+	public static class IdentifierContext extends ParserRuleContext {
 		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
                0); }
-		public TerminalNode QUALIFIED_IDENTIFIER() { return \
                getToken(ProtoParserParser.QUALIFIED_IDENTIFIER, 0); }
-		public All_identifierContext(ParserRuleContext parent, int invokingState) {
+		public TerminalNode PACKAGE_LITERAL() { return \
getToken(ProtoParserParser.PACKAGE_LITERAL, 0); } +		public TerminalNode \
IMPORT_LITERAL() { return getToken(ProtoParserParser.IMPORT_LITERAL, 0); } +		public \
TerminalNode OPTION_LITERAL() { return getToken(ProtoParserParser.OPTION_LITERAL, 0); \
} +		public TerminalNode SYNTAX_LITERAL() { return \
getToken(ProtoParserParser.SYNTAX_LITERAL, 0); } +		public TerminalNode \
ENUM_LITERAL() { return getToken(ProtoParserParser.ENUM_LITERAL, 0); } +		public \
TerminalNode MESSAGE_LITERAL() { return getToken(ProtoParserParser.MESSAGE_LITERAL, \
0); } +		public TerminalNode EXTEND_LITERAL() { return \
getToken(ProtoParserParser.EXTEND_LITERAL, 0); } +		public TerminalNode \
EXTENSIONS_DEF_LITERAL() { return getToken(ProtoParserParser.EXTENSIONS_DEF_LITERAL, \
0); } +		public TerminalNode TO_LITERAL() { return \
getToken(ProtoParserParser.TO_LITERAL, 0); } +		public TerminalNode MAX_LITERAL() { \
return getToken(ProtoParserParser.MAX_LITERAL, 0); } +		public TerminalNode \
PUBLIC_LITERAL() { return getToken(ProtoParserParser.PUBLIC_LITERAL, 0); } +		public \
TerminalNode WEAK_LITERAL() { return getToken(ProtoParserParser.WEAK_LITERAL, 0); } \
+		public TerminalNode RESERVED_LITERAL() { return \
getToken(ProtoParserParser.RESERVED_LITERAL, 0); } +		public TerminalNode \
MAP_LITERAL() { return getToken(ProtoParserParser.MAP_LITERAL, 0); } +		public \
TerminalNode ONEOF_LITERAL() { return getToken(ProtoParserParser.ONEOF_LITERAL, 0); } \
+		public TerminalNode SERVICE_LITERAL() { return \
getToken(ProtoParserParser.SERVICE_LITERAL, 0); } +		public TerminalNode \
RETURNS_LITERAL() { return getToken(ProtoParserParser.RETURNS_LITERAL, 0); } \
+		public TerminalNode RPC_LITERAL() { return getToken(ProtoParserParser.RPC_LITERAL, \
0); } +		public TerminalNode REQUIRED_PROTOBUF_SCOPE_LITERAL() { return \
getToken(ProtoParserParser.REQUIRED_PROTOBUF_SCOPE_LITERAL, 0); } +		public \
TerminalNode OPTIONAL_PROTOBUF_SCOPE_LITERAL() { return \
getToken(ProtoParserParser.OPTIONAL_PROTOBUF_SCOPE_LITERAL, 0); } +		public \
TerminalNode REPEATED_PROTOBUF_SCOPE_LITERAL() { return \
getToken(ProtoParserParser.REPEATED_PROTOBUF_SCOPE_LITERAL, 0); } +		public \
TerminalNode DOUBLE_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.DOUBLE_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
FLOAT_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.FLOAT_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
INT32_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.INT32_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
INT64_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.INT64_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
UINT32_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.UINT32_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
UINT64_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.UINT64_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
SINT32_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.SINT32_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
SINT64_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.SINT64_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
FIXED32_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.FIXED32_PROTOBUF_TYPE_LITERAL, 0); } +		public \
TerminalNode FIXED64_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.FIXED64_PROTOBUF_TYPE_LITERAL, 0); } +		public \
TerminalNode SFIXED32_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.SFIXED32_PROTOBUF_TYPE_LITERAL, 0); } +		public \
TerminalNode SFIXED64_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.SFIXED64_PROTOBUF_TYPE_LITERAL, 0); } +		public \
TerminalNode BOOL_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.BOOL_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
STRING_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.STRING_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
BYTES_PROTOBUF_TYPE_LITERAL() { return \
getToken(ProtoParserParser.BYTES_PROTOBUF_TYPE_LITERAL, 0); } +		public TerminalNode \
BOOL_LITERAL() { return getToken(ProtoParserParser.BOOL_LITERAL, 0); } +		public \
IdentifierContext(ParserRuleContext parent, int invokingState) {  super(parent, \
invokingState);  }
-		@Override public int getRuleIndex() { return RULE_all_identifier; }
+		@Override public int getRuleIndex() { return RULE_identifier; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof ProtoParserListener ) \
((ProtoParserListener)listener).enterAll_identifier(this); +			if ( listener \
instanceof ProtoParserListener ) \
((ProtoParserListener)listener).enterIdentifier(this);  }
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof ProtoParserListener ) \
((ProtoParserListener)listener).exitAll_identifier(this); +			if ( listener \
instanceof ProtoParserListener ) \
((ProtoParserListener)listener).exitIdentifier(this);  }
 	}
 
 	@RuleVersion(0)
-	public final All_identifierContext all_identifier() throws RecognitionException {
-		All_identifierContext _localctx = new All_identifierContext(_ctx, getState());
-		enterRule(_localctx, 0, RULE_all_identifier);
+	public final IdentifierContext identifier() throws RecognitionException {
+		IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
+		enterRule(_localctx, 0, RULE_identifier);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(104);
+			setState(106);
 			_la = _input.LA(1);
-			if ( !(_la==IDENTIFIER || _la==QUALIFIED_IDENTIFIER) ) {
+			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L << \
IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER))) != 0)) ) { \
_errHandler.recoverInline(this);  } else {
 				consume();
@@ -178,8 +214,102 @@ public class ProtoParserParser extends Parser {
 		return _localctx;
 	}
 
+	public static class All_identifierContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode QUALIFIED_IDENTIFIER() { return \
getToken(ProtoParserParser.QUALIFIED_IDENTIFIER, 0); } +		public \
All_identifierContext(ParserRuleContext parent, int invokingState) { \
+			super(parent, invokingState); +		}
+		@Override public int getRuleIndex() { return RULE_all_identifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ProtoParserListener ) \
((ProtoParserListener)listener).enterAll_identifier(this); +		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ProtoParserListener ) \
((ProtoParserListener)listener).exitAll_identifier(this); +		}
+	}
+
+	@RuleVersion(0)
+	public final All_identifierContext all_identifier() throws RecognitionException {
+		All_identifierContext _localctx = new All_identifierContext(_ctx, getState());
+		enterRule(_localctx, 2, RULE_all_identifier);
+		try {
+			setState(110);
+			switch (_input.LA(1)) {
+			case PACKAGE_LITERAL:
+			case IMPORT_LITERAL:
+			case OPTION_LITERAL:
+			case SYNTAX_LITERAL:
+			case ENUM_LITERAL:
+			case MESSAGE_LITERAL:
+			case EXTEND_LITERAL:
+			case EXTENSIONS_DEF_LITERAL:
+			case TO_LITERAL:
+			case MAX_LITERAL:
+			case PUBLIC_LITERAL:
+			case WEAK_LITERAL:
+			case RESERVED_LITERAL:
+			case MAP_LITERAL:
+			case ONEOF_LITERAL:
+			case SERVICE_LITERAL:
+			case RETURNS_LITERAL:
+			case RPC_LITERAL:
+			case REQUIRED_PROTOBUF_SCOPE_LITERAL:
+			case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
+			case REPEATED_PROTOBUF_SCOPE_LITERAL:
+			case DOUBLE_PROTOBUF_TYPE_LITERAL:
+			case FLOAT_PROTOBUF_TYPE_LITERAL:
+			case INT32_PROTOBUF_TYPE_LITERAL:
+			case INT64_PROTOBUF_TYPE_LITERAL:
+			case UINT32_PROTOBUF_TYPE_LITERAL:
+			case UINT64_PROTOBUF_TYPE_LITERAL:
+			case SINT32_PROTOBUF_TYPE_LITERAL:
+			case SINT64_PROTOBUF_TYPE_LITERAL:
+			case FIXED32_PROTOBUF_TYPE_LITERAL:
+			case FIXED64_PROTOBUF_TYPE_LITERAL:
+			case SFIXED32_PROTOBUF_TYPE_LITERAL:
+			case SFIXED64_PROTOBUF_TYPE_LITERAL:
+			case BOOL_PROTOBUF_TYPE_LITERAL:
+			case STRING_PROTOBUF_TYPE_LITERAL:
+			case BYTES_PROTOBUF_TYPE_LITERAL:
+			case BOOL_LITERAL:
+			case IDENTIFIER:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(108);
+				identifier();
+				}
+				break;
+			case QUALIFIED_IDENTIFIER:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(109);
+				match(QUALIFIED_IDENTIFIER);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
 	public static class All_valueContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public Literal_valueContext literal_value() {
 			return getRuleContext(Literal_valueContext.class,0);
 		}
@@ -200,29 +330,24 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final All_valueContext all_value() throws RecognitionException {
 		All_valueContext _localctx = new All_valueContext(_ctx, getState());
-		enterRule(_localctx, 2, RULE_all_value);
+		enterRule(_localctx, 4, RULE_all_value);
 		try {
-			setState(108);
-			switch (_input.LA(1)) {
-			case IDENTIFIER:
+			setState(114);
+			switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(106);
-				match(IDENTIFIER);
+				setState(112);
+				identifier();
 				}
 				break;
-			case INTEGER_LITERAL:
-			case STRING_LITERAL:
-			case BOOL_LITERAL:
-			case FLOAT_LITERAL:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(107);
+				setState(113);
 				literal_value();
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 		}
 		catch (RecognitionException re) {
@@ -258,12 +383,12 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Literal_valueContext literal_value() throws RecognitionException {
 		Literal_valueContext _localctx = new Literal_valueContext(_ctx, getState());
-		enterRule(_localctx, 4, RULE_literal_value);
+		enterRule(_localctx, 6, RULE_literal_value);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(110);
+			setState(116);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << INTEGER_LITERAL) | (1L << \
STRING_LITERAL) | (1L << BOOL_LITERAL) | (1L << FLOAT_LITERAL))) != 0)) ) {  \
_errHandler.recoverInline(this); @@ -313,12 +438,12 @@ public class ProtoParserParser \
extends Parser {  @RuleVersion(0)
 	public final Proto_map_key_typeContext proto_map_key_type() throws \
RecognitionException {  Proto_map_key_typeContext _localctx = new \
                Proto_map_key_typeContext(_ctx, getState());
-		enterRule(_localctx, 6, RULE_proto_map_key_type);
+		enterRule(_localctx, 8, RULE_proto_map_key_type);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(112);
+			setState(118);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL))) != 0)) ) {  \
_errHandler.recoverInline(this); @@ -359,12 +484,12 @@ public class ProtoParserParser \
extends Parser {  @RuleVersion(0)
 	public final Proto_no_map_key_typeContext proto_no_map_key_type() throws \
RecognitionException {  Proto_no_map_key_typeContext _localctx = new \
                Proto_no_map_key_typeContext(_ctx, getState());
-		enterRule(_localctx, 8, RULE_proto_no_map_key_type);
+		enterRule(_localctx, 10, RULE_proto_no_map_key_type);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(114);
+			setState(120);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << \
DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL))) != 0)) ) {  _errHandler.recoverInline(this);
@@ -411,47 +536,31 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Proto_typeContext proto_type() throws RecognitionException {
 		Proto_typeContext _localctx = new Proto_typeContext(_ctx, getState());
-		enterRule(_localctx, 10, RULE_proto_type);
+		enterRule(_localctx, 12, RULE_proto_type);
 		try {
-			setState(119);
-			switch (_input.LA(1)) {
-			case INT32_PROTOBUF_TYPE_LITERAL:
-			case INT64_PROTOBUF_TYPE_LITERAL:
-			case UINT32_PROTOBUF_TYPE_LITERAL:
-			case UINT64_PROTOBUF_TYPE_LITERAL:
-			case SINT32_PROTOBUF_TYPE_LITERAL:
-			case SINT64_PROTOBUF_TYPE_LITERAL:
-			case FIXED32_PROTOBUF_TYPE_LITERAL:
-			case FIXED64_PROTOBUF_TYPE_LITERAL:
-			case SFIXED32_PROTOBUF_TYPE_LITERAL:
-			case SFIXED64_PROTOBUF_TYPE_LITERAL:
-			case BOOL_PROTOBUF_TYPE_LITERAL:
-			case STRING_PROTOBUF_TYPE_LITERAL:
+			setState(125);
+			switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(116);
+				setState(122);
 				proto_map_key_type();
 				}
 				break;
-			case DOUBLE_PROTOBUF_TYPE_LITERAL:
-			case FLOAT_PROTOBUF_TYPE_LITERAL:
-			case BYTES_PROTOBUF_TYPE_LITERAL:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(117);
+				setState(123);
 				proto_no_map_key_type();
 				}
 				break;
-			case IDENTIFIER:
-			case QUALIFIED_IDENTIFIER:
+			case 3:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(118);
+				setState(124);
 				all_identifier();
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 		}
 		catch (RecognitionException re) {
@@ -496,17 +605,17 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final ProtoContext proto() throws RecognitionException {
 		ProtoContext _localctx = new ProtoContext(_ctx, getState());
-		enterRule(_localctx, 12, RULE_proto);
+		enterRule(_localctx, 14, RULE_proto);
 		try {
-			setState(129);
-			switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
+			setState(135);
+			switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
 				{
-				setState(121);
+				setState(127);
 				syntax_def2();
-				setState(122);
+				setState(128);
 				proto2();
 				}
 				}
@@ -515,12 +624,12 @@ public class ProtoParserParser extends Parser {
 				enterOuterAlt(_localctx, 2);
 				{
 				{
-				setState(124);
+				setState(130);
 				syntax_def3();
-				setState(125);
+				setState(131);
 				proto3();
 				}
-				setState(127);
+				setState(133);
 				match(EOF);
 				}
 				break;
@@ -597,57 +706,57 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Proto2Context proto2() throws RecognitionException {
 		Proto2Context _localctx = new Proto2Context(_ctx, getState());
-		enterRule(_localctx, 14, RULE_proto2);
+		enterRule(_localctx, 16, RULE_proto2);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(140);
+			setState(146);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L << \
IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << ENUM_LITERAL) | (1L << \
MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << SERVICE_LITERAL))) != 0)) {  {
-				setState(138);
+				setState(144);
 				switch (_input.LA(1)) {
 				case PACKAGE_LITERAL:
 					{
-					setState(131);
+					setState(137);
 					package_def();
 					}
 					break;
 				case IMPORT_LITERAL:
 					{
-					setState(132);
+					setState(138);
 					import_def();
 					}
 					break;
 				case OPTION_LITERAL:
 					{
-					setState(133);
+					setState(139);
 					option_line_def();
 					}
 					break;
 				case ENUM_LITERAL:
 					{
-					setState(134);
+					setState(140);
 					enum_def();
 					}
 					break;
 				case EXTEND_LITERAL:
 					{
-					setState(135);
+					setState(141);
 					ext_def();
 					}
 					break;
 				case MESSAGE_LITERAL:
 					{
-					setState(136);
+					setState(142);
 					message_def2();
 					}
 					break;
 				case SERVICE_LITERAL:
 					{
-					setState(137);
+					setState(143);
 					service_def();
 					}
 					break;
@@ -655,7 +764,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(142);
+				setState(148);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -726,51 +835,51 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Proto3Context proto3() throws RecognitionException {
 		Proto3Context _localctx = new Proto3Context(_ctx, getState());
-		enterRule(_localctx, 16, RULE_proto3);
+		enterRule(_localctx, 18, RULE_proto3);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(151);
+			setState(157);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L << \
IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << ENUM_LITERAL) | (1L << \
MESSAGE_LITERAL) | (1L << SERVICE_LITERAL))) != 0)) {  {
-				setState(149);
+				setState(155);
 				switch (_input.LA(1)) {
 				case PACKAGE_LITERAL:
 					{
-					setState(143);
+					setState(149);
 					package_def();
 					}
 					break;
 				case IMPORT_LITERAL:
 					{
-					setState(144);
+					setState(150);
 					import_def();
 					}
 					break;
 				case OPTION_LITERAL:
 					{
-					setState(145);
+					setState(151);
 					option_line_def();
 					}
 					break;
 				case ENUM_LITERAL:
 					{
-					setState(146);
+					setState(152);
 					enum_def();
 					}
 					break;
 				case MESSAGE_LITERAL:
 					{
-					setState(147);
+					setState(153);
 					message_def3();
 					}
 					break;
 				case SERVICE_LITERAL:
 					{
-					setState(148);
+					setState(154);
 					service_def();
 					}
 					break;
@@ -778,7 +887,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(153);
+				setState(159);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -818,15 +927,15 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Package_defContext package_def() throws RecognitionException {
 		Package_defContext _localctx = new Package_defContext(_ctx, getState());
-		enterRule(_localctx, 18, RULE_package_def);
+		enterRule(_localctx, 20, RULE_package_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(154);
+			setState(160);
 			match(PACKAGE_LITERAL);
-			setState(155);
+			setState(161);
 			package_name();
-			setState(156);
+			setState(162);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -862,11 +971,11 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Package_nameContext package_name() throws RecognitionException {
 		Package_nameContext _localctx = new Package_nameContext(_ctx, getState());
-		enterRule(_localctx, 20, RULE_package_name);
+		enterRule(_localctx, 22, RULE_package_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(158);
+			setState(164);
 			all_identifier();
 			}
 		}
@@ -906,18 +1015,18 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Import_defContext import_def() throws RecognitionException {
 		Import_defContext _localctx = new Import_defContext(_ctx, getState());
-		enterRule(_localctx, 22, RULE_import_def);
+		enterRule(_localctx, 24, RULE_import_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(160);
+			setState(166);
 			match(IMPORT_LITERAL);
-			setState(162);
+			setState(168);
 			_la = _input.LA(1);
 			if (_la==PUBLIC_LITERAL || _la==WEAK_LITERAL) {
 				{
-				setState(161);
+				setState(167);
 				_la = _input.LA(1);
 				if ( !(_la==PUBLIC_LITERAL || _la==WEAK_LITERAL) ) {
 				_errHandler.recoverInline(this);
@@ -927,9 +1036,9 @@ public class ProtoParserParser extends Parser {
 				}
 			}
 
-			setState(164);
+			setState(170);
 			import_file_name();
-			setState(165);
+			setState(171);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -963,11 +1072,11 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Import_file_nameContext import_file_name() throws RecognitionException \
{  Import_file_nameContext _localctx = new Import_file_nameContext(_ctx, getState());
-		enterRule(_localctx, 24, RULE_import_file_name);
+		enterRule(_localctx, 26, RULE_import_file_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(167);
+			setState(173);
 			match(STRING_LITERAL);
 			}
 		}
@@ -1004,17 +1113,17 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Syntax_def2Context syntax_def2() throws RecognitionException {
 		Syntax_def2Context _localctx = new Syntax_def2Context(_ctx, getState());
-		enterRule(_localctx, 26, RULE_syntax_def2);
+		enterRule(_localctx, 28, RULE_syntax_def2);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(169);
+			setState(175);
 			match(SYNTAX_LITERAL);
-			setState(170);
+			setState(176);
 			match(EQUALS);
-			setState(171);
+			setState(177);
 			match(PROTO2_SYNTAX);
-			setState(172);
+			setState(178);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -1051,17 +1160,17 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Syntax_def3Context syntax_def3() throws RecognitionException {
 		Syntax_def3Context _localctx = new Syntax_def3Context(_ctx, getState());
-		enterRule(_localctx, 28, RULE_syntax_def3);
+		enterRule(_localctx, 30, RULE_syntax_def3);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(174);
+			setState(180);
 			match(SYNTAX_LITERAL);
-			setState(175);
+			setState(181);
 			match(EQUALS);
-			setState(176);
+			setState(182);
 			match(PROTO3_SYNTAX);
-			setState(177);
+			setState(183);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -1103,19 +1212,19 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_line_defContext option_line_def() throws RecognitionException {
 		Option_line_defContext _localctx = new Option_line_defContext(_ctx, getState());
-		enterRule(_localctx, 30, RULE_option_line_def);
+		enterRule(_localctx, 32, RULE_option_line_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(179);
+			setState(185);
 			match(OPTION_LITERAL);
-			setState(180);
+			setState(186);
 			option_name();
-			setState(181);
+			setState(187);
 			match(EQUALS);
-			setState(182);
+			setState(188);
 			option_all_value();
-			setState(183);
+			setState(189);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -1160,32 +1269,32 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_field_defContext option_field_def() throws RecognitionException \
{  Option_field_defContext _localctx = new Option_field_defContext(_ctx, getState());
-		enterRule(_localctx, 32, RULE_option_field_def);
+		enterRule(_localctx, 34, RULE_option_field_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(185);
+			setState(191);
 			match(BRACKET_OPEN);
-			setState(186);
+			setState(192);
 			option_field_item();
-			setState(191);
+			setState(197);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while (_la==COMMA) {
 				{
 				{
-				setState(187);
+				setState(193);
 				match(COMMA);
-				setState(188);
+				setState(194);
 				option_field_item();
 				}
 				}
-				setState(193);
+				setState(199);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
-			setState(194);
+			setState(200);
 			match(BRACKET_CLOSE);
 			}
 		}
@@ -1225,15 +1334,15 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_field_itemContext option_field_item() throws \
RecognitionException {  Option_field_itemContext _localctx = new \
                Option_field_itemContext(_ctx, getState());
-		enterRule(_localctx, 34, RULE_option_field_item);
+		enterRule(_localctx, 36, RULE_option_field_item);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(196);
+			setState(202);
 			option_name();
-			setState(197);
+			setState(203);
 			match(EQUALS);
-			setState(198);
+			setState(204);
 			option_all_value();
 			}
 		}
@@ -1272,10 +1381,46 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_all_valueContext option_all_value() throws RecognitionException \
{  Option_all_valueContext _localctx = new Option_all_valueContext(_ctx, getState());
-		enterRule(_localctx, 36, RULE_option_all_value);
+		enterRule(_localctx, 38, RULE_option_all_value);
 		try {
-			setState(202);
+			setState(208);
 			switch (_input.LA(1)) {
+			case PACKAGE_LITERAL:
+			case IMPORT_LITERAL:
+			case OPTION_LITERAL:
+			case SYNTAX_LITERAL:
+			case ENUM_LITERAL:
+			case MESSAGE_LITERAL:
+			case EXTEND_LITERAL:
+			case EXTENSIONS_DEF_LITERAL:
+			case TO_LITERAL:
+			case MAX_LITERAL:
+			case PUBLIC_LITERAL:
+			case WEAK_LITERAL:
+			case RESERVED_LITERAL:
+			case MAP_LITERAL:
+			case ONEOF_LITERAL:
+			case SERVICE_LITERAL:
+			case RETURNS_LITERAL:
+			case RPC_LITERAL:
+			case REQUIRED_PROTOBUF_SCOPE_LITERAL:
+			case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
+			case REPEATED_PROTOBUF_SCOPE_LITERAL:
+			case DOUBLE_PROTOBUF_TYPE_LITERAL:
+			case FLOAT_PROTOBUF_TYPE_LITERAL:
+			case INT32_PROTOBUF_TYPE_LITERAL:
+			case INT64_PROTOBUF_TYPE_LITERAL:
+			case UINT32_PROTOBUF_TYPE_LITERAL:
+			case UINT64_PROTOBUF_TYPE_LITERAL:
+			case SINT32_PROTOBUF_TYPE_LITERAL:
+			case SINT64_PROTOBUF_TYPE_LITERAL:
+			case FIXED32_PROTOBUF_TYPE_LITERAL:
+			case FIXED64_PROTOBUF_TYPE_LITERAL:
+			case SFIXED32_PROTOBUF_TYPE_LITERAL:
+			case SFIXED64_PROTOBUF_TYPE_LITERAL:
+			case BOOL_PROTOBUF_TYPE_LITERAL:
+			case STRING_PROTOBUF_TYPE_LITERAL:
+			case BYTES_PROTOBUF_TYPE_LITERAL:
 			case INTEGER_LITERAL:
 			case STRING_LITERAL:
 			case BOOL_LITERAL:
@@ -1283,14 +1428,14 @@ public class ProtoParserParser extends Parser {
 			case IDENTIFIER:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(200);
+				setState(206);
 				all_value();
 				}
 				break;
 			case BLOCK_OPEN:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(201);
+				setState(207);
 				option_value_object();
 				}
 				break;
@@ -1335,28 +1480,28 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_value_objectContext option_value_object() throws \
RecognitionException {  Option_value_objectContext _localctx = new \
                Option_value_objectContext(_ctx, getState());
-		enterRule(_localctx, 38, RULE_option_value_object);
+		enterRule(_localctx, 40, RULE_option_value_object);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(204);
+			setState(210);
 			match(BLOCK_OPEN);
-			setState(208);
+			setState(214);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
-			while (_la==IDENTIFIER) {
+			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L << \
IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER))) != 0)) {  \
{  {
-				setState(205);
+				setState(211);
 				option_value_item();
 				}
 				}
-				setState(210);
+				setState(216);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
-			setState(211);
+			setState(217);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -1372,7 +1517,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Option_value_itemContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode COLON() { return getToken(ProtoParserParser.COLON, 0); }
 		public Option_all_valueContext option_all_value() {
 			return getRuleContext(Option_all_valueContext.class,0);
@@ -1394,15 +1541,15 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_value_itemContext option_value_item() throws \
RecognitionException {  Option_value_itemContext _localctx = new \
                Option_value_itemContext(_ctx, getState());
-		enterRule(_localctx, 40, RULE_option_value_item);
+		enterRule(_localctx, 42, RULE_option_value_item);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(213);
-			match(IDENTIFIER);
-			setState(214);
+			setState(219);
+			identifier();
+			setState(220);
 			match(COLON);
-			setState(215);
+			setState(221);
 			option_all_value();
 			}
 		}
@@ -1418,7 +1565,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Option_nameContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode PAREN_OPEN() { return getToken(ProtoParserParser.PAREN_OPEN, \
0); }  public All_identifierContext all_identifier() {
 			return getRuleContext(All_identifierContext.class,0);
@@ -1445,38 +1594,75 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Option_nameContext option_name() throws RecognitionException {
 		Option_nameContext _localctx = new Option_nameContext(_ctx, getState());
-		enterRule(_localctx, 42, RULE_option_name);
+		enterRule(_localctx, 44, RULE_option_name);
 		int _la;
 		try {
-			setState(227);
+			setState(233);
 			switch (_input.LA(1)) {
+			case PACKAGE_LITERAL:
+			case IMPORT_LITERAL:
+			case OPTION_LITERAL:
+			case SYNTAX_LITERAL:
+			case ENUM_LITERAL:
+			case MESSAGE_LITERAL:
+			case EXTEND_LITERAL:
+			case EXTENSIONS_DEF_LITERAL:
+			case TO_LITERAL:
+			case MAX_LITERAL:
+			case PUBLIC_LITERAL:
+			case WEAK_LITERAL:
+			case RESERVED_LITERAL:
+			case MAP_LITERAL:
+			case ONEOF_LITERAL:
+			case SERVICE_LITERAL:
+			case RETURNS_LITERAL:
+			case RPC_LITERAL:
+			case REQUIRED_PROTOBUF_SCOPE_LITERAL:
+			case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
+			case REPEATED_PROTOBUF_SCOPE_LITERAL:
+			case DOUBLE_PROTOBUF_TYPE_LITERAL:
+			case FLOAT_PROTOBUF_TYPE_LITERAL:
+			case INT32_PROTOBUF_TYPE_LITERAL:
+			case INT64_PROTOBUF_TYPE_LITERAL:
+			case UINT32_PROTOBUF_TYPE_LITERAL:
+			case UINT64_PROTOBUF_TYPE_LITERAL:
+			case SINT32_PROTOBUF_TYPE_LITERAL:
+			case SINT64_PROTOBUF_TYPE_LITERAL:
+			case FIXED32_PROTOBUF_TYPE_LITERAL:
+			case FIXED64_PROTOBUF_TYPE_LITERAL:
+			case SFIXED32_PROTOBUF_TYPE_LITERAL:
+			case SFIXED64_PROTOBUF_TYPE_LITERAL:
+			case BOOL_PROTOBUF_TYPE_LITERAL:
+			case STRING_PROTOBUF_TYPE_LITERAL:
+			case BYTES_PROTOBUF_TYPE_LITERAL:
+			case BOOL_LITERAL:
 			case IDENTIFIER:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(217);
-				match(IDENTIFIER);
+				setState(223);
+				identifier();
 				}
 				break;
 			case PAREN_OPEN:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(218);
+				setState(224);
 				match(PAREN_OPEN);
-				setState(219);
+				setState(225);
 				all_identifier();
-				setState(220);
+				setState(226);
 				match(PAREN_CLOSE);
-				setState(224);
+				setState(230);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==FIELD_IDENTIFIER) {
 					{
 					{
-					setState(221);
+					setState(227);
 					match(FIELD_IDENTIFIER);
 					}
 					}
-					setState(226);
+					setState(232);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
@@ -1524,19 +1710,19 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Enum_defContext enum_def() throws RecognitionException {
 		Enum_defContext _localctx = new Enum_defContext(_ctx, getState());
-		enterRule(_localctx, 44, RULE_enum_def);
+		enterRule(_localctx, 46, RULE_enum_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(229);
+			setState(235);
 			match(ENUM_LITERAL);
-			setState(230);
+			setState(236);
 			enum_name();
-			setState(231);
+			setState(237);
 			match(BLOCK_OPEN);
-			setState(232);
+			setState(238);
 			enum_content();
-			setState(233);
+			setState(239);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -1552,7 +1738,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Enum_nameContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public Enum_nameContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1570,12 +1758,12 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Enum_nameContext enum_name() throws RecognitionException {
 		Enum_nameContext _localctx = new Enum_nameContext(_ctx, getState());
-		enterRule(_localctx, 46, RULE_enum_name);
+		enterRule(_localctx, 48, RULE_enum_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(235);
-			match(IDENTIFIER);
+			setState(241);
+			identifier();
 			}
 		}
 		catch (RecognitionException re) {
@@ -1619,35 +1807,33 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Enum_contentContext enum_content() throws RecognitionException {
 		Enum_contentContext _localctx = new Enum_contentContext(_ctx, getState());
-		enterRule(_localctx, 48, RULE_enum_content);
+		enterRule(_localctx, 50, RULE_enum_content);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(241);
+			setState(247);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
-			while (_la==OPTION_LITERAL || _la==IDENTIFIER) {
+			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L << \
IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER))) != 0)) {  \
                {
-				setState(239);
-				switch (_input.LA(1)) {
-				case OPTION_LITERAL:
+				setState(245);
+				switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
+				case 1:
 					{
-					setState(237);
+					setState(243);
 					option_line_def();
 					}
 					break;
-				case IDENTIFIER:
+				case 2:
 					{
-					setState(238);
+					setState(244);
 					enum_item_def();
 					}
 					break;
-				default:
-					throw new NoViableAltException(this);
 				}
 				}
-				setState(243);
+				setState(249);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -1665,7 +1851,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Enum_item_defContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode EQUALS() { return getToken(ProtoParserParser.EQUALS, 0); }
 		public TerminalNode INTEGER_LITERAL() { return \
getToken(ProtoParserParser.INTEGER_LITERAL, 0); }  public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); } @@ \
-1689,27 +1877,27 @@ public class ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Enum_item_defContext enum_item_def() throws RecognitionException {
 		Enum_item_defContext _localctx = new Enum_item_defContext(_ctx, getState());
-		enterRule(_localctx, 50, RULE_enum_item_def);
+		enterRule(_localctx, 52, RULE_enum_item_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(244);
-			match(IDENTIFIER);
-			setState(245);
+			setState(250);
+			identifier();
+			setState(251);
 			match(EQUALS);
-			setState(246);
+			setState(252);
 			match(INTEGER_LITERAL);
-			setState(248);
+			setState(254);
 			_la = _input.LA(1);
 			if (_la==BRACKET_OPEN) {
 				{
-				setState(247);
+				setState(253);
 				option_field_def();
 				}
 			}
 
-			setState(250);
+			setState(256);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -1751,27 +1939,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Message_def2Context message_def2() throws RecognitionException {
 		Message_def2Context _localctx = new Message_def2Context(_ctx, getState());
-		enterRule(_localctx, 52, RULE_message_def2);
+		enterRule(_localctx, 54, RULE_message_def2);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(252);
+			setState(258);
 			match(MESSAGE_LITERAL);
-			setState(253);
+			setState(259);
 			message_name();
-			setState(254);
+			setState(260);
 			match(BLOCK_OPEN);
-			setState(256);
+			setState(262);
 			_la = _input.LA(1);
 			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTENSIONS_DEF_LITERAL) | (1L << \
RESERVED_LITERAL) | (1L << MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << \
REQUIRED_PROTOBUF_SCOPE_LITERAL) | (1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << \
REPEATED_PROTOBUF_SCOPE_LITERAL))) != 0)) {  {
-				setState(255);
+				setState(261);
 				message_content2();
 				}
 			}
 
-			setState(258);
+			setState(264);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -1813,27 +2001,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Message_def3Context message_def3() throws RecognitionException {
 		Message_def3Context _localctx = new Message_def3Context(_ctx, getState());
-		enterRule(_localctx, 54, RULE_message_def3);
+		enterRule(_localctx, 56, RULE_message_def3);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(260);
+			setState(266);
 			match(MESSAGE_LITERAL);
-			setState(261);
+			setState(267);
 			message_name();
-			setState(262);
+			setState(268);
 			match(BLOCK_OPEN);
-			setState(264);
+			setState(270);
 			_la = _input.LA(1);
-			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | (1L \
<< DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << IDENTIFIER) | (1L << QUALIFIED_IDENTIFIER))) != \
0)) { +			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) | (1L \
<< IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER) | (1L << \
QUALIFIED_IDENTIFIER))) != 0)) {  {
-				setState(263);
+				setState(269);
 				message_content3();
 				}
 			}
 
-			setState(266);
+			setState(272);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -1849,7 +2037,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Message_nameContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public Message_nameContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1867,12 +2057,12 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Message_nameContext message_name() throws RecognitionException {
 		Message_nameContext _localctx = new Message_nameContext(_ctx, getState());
-		enterRule(_localctx, 56, RULE_message_name);
+		enterRule(_localctx, 58, RULE_message_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(268);
-			match(IDENTIFIER);
+			setState(274);
+			identifier();
 			}
 		}
 		catch (RecognitionException re) {
@@ -1952,21 +2142,21 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Message_content2Context message_content2() throws RecognitionException \
{  Message_content2Context _localctx = new Message_content2Context(_ctx, getState());
-		enterRule(_localctx, 58, RULE_message_content2);
+		enterRule(_localctx, 60, RULE_message_content2);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(278); 
+			setState(284); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(278);
+				setState(284);
 				switch (_input.LA(1)) {
 				case OPTION_LITERAL:
 					{
-					setState(270);
+					setState(276);
 					option_line_def();
 					}
 					break;
@@ -1974,43 +2164,43 @@ public class ProtoParserParser extends Parser {
 				case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
 				case REPEATED_PROTOBUF_SCOPE_LITERAL:
 					{
-					setState(271);
+					setState(277);
 					message_item_def2();
 					}
 					break;
 				case MESSAGE_LITERAL:
 					{
-					setState(272);
+					setState(278);
 					message_def2();
 					}
 					break;
 				case ENUM_LITERAL:
 					{
-					setState(273);
+					setState(279);
 					enum_def();
 					}
 					break;
 				case EXTENSIONS_DEF_LITERAL:
 					{
-					setState(274);
+					setState(280);
 					message_ext_def();
 					}
 					break;
 				case RESERVED_LITERAL:
 					{
-					setState(275);
+					setState(281);
 					reserved_def();
 					}
 					break;
 				case ONEOF_LITERAL:
 					{
-					setState(276);
+					setState(282);
 					oneof_def();
 					}
 					break;
 				case MAP_LITERAL:
 					{
-					setState(277);
+					setState(283);
 					map_field_def();
 					}
 					break;
@@ -2018,7 +2208,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(280); 
+				setState(286); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L \
<< ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTENSIONS_DEF_LITERAL) | (1L << \
RESERVED_LITERAL) | (1L << MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << \
REQUIRED_PROTOBUF_SCOPE_LITERAL) | (1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << \
REPEATED_PROTOBUF_SCOPE_LITERAL))) != 0) ); @@ -2095,85 +2285,66 @@ public class \
ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Message_content3Context message_content3() throws RecognitionException \
{  Message_content3Context _localctx = new Message_content3Context(_ctx, getState());
-		enterRule(_localctx, 60, RULE_message_content3);
+		enterRule(_localctx, 62, RULE_message_content3);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(289); 
+			setState(295); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(289);
-				switch (_input.LA(1)) {
-				case OPTION_LITERAL:
+				setState(295);
+				switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
+				case 1:
 					{
-					setState(282);
+					setState(288);
 					option_line_def();
 					}
 					break;
-				case REPEATED_PROTOBUF_SCOPE_LITERAL:
-				case DOUBLE_PROTOBUF_TYPE_LITERAL:
-				case FLOAT_PROTOBUF_TYPE_LITERAL:
-				case INT32_PROTOBUF_TYPE_LITERAL:
-				case INT64_PROTOBUF_TYPE_LITERAL:
-				case UINT32_PROTOBUF_TYPE_LITERAL:
-				case UINT64_PROTOBUF_TYPE_LITERAL:
-				case SINT32_PROTOBUF_TYPE_LITERAL:
-				case SINT64_PROTOBUF_TYPE_LITERAL:
-				case FIXED32_PROTOBUF_TYPE_LITERAL:
-				case FIXED64_PROTOBUF_TYPE_LITERAL:
-				case SFIXED32_PROTOBUF_TYPE_LITERAL:
-				case SFIXED64_PROTOBUF_TYPE_LITERAL:
-				case BOOL_PROTOBUF_TYPE_LITERAL:
-				case STRING_PROTOBUF_TYPE_LITERAL:
-				case BYTES_PROTOBUF_TYPE_LITERAL:
-				case IDENTIFIER:
-				case QUALIFIED_IDENTIFIER:
+				case 2:
 					{
-					setState(283);
+					setState(289);
 					message_item_def3();
 					}
 					break;
-				case MESSAGE_LITERAL:
+				case 3:
 					{
-					setState(284);
+					setState(290);
 					message_def3();
 					}
 					break;
-				case ENUM_LITERAL:
+				case 4:
 					{
-					setState(285);
+					setState(291);
 					enum_def();
 					}
 					break;
-				case RESERVED_LITERAL:
+				case 5:
 					{
-					setState(286);
+					setState(292);
 					reserved_def();
 					}
 					break;
-				case ONEOF_LITERAL:
+				case 6:
 					{
-					setState(287);
+					setState(293);
 					oneof_def();
 					}
 					break;
-				case MAP_LITERAL:
+				case 7:
 					{
-					setState(288);
+					setState(294);
 					map_field_def();
 					}
 					break;
-				default:
-					throw new NoViableAltException(this);
 				}
 				}
-				setState(291); 
+				setState(297); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
-			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L \
<< ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | (1L \
<< DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << IDENTIFIER) | (1L << QUALIFIED_IDENTIFIER))) != \
0) ); +			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) \
| (1L << IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER) | (1L << \
QUALIFIED_IDENTIFIER))) != 0) );  }
 		}
 		catch (RecognitionException re) {
@@ -2194,7 +2365,9 @@ public class ProtoParserParser extends Parser {
 		public Proto_typeContext proto_type() {
 			return getRuleContext(Proto_typeContext.class,0);
 		}
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode EQUALS() { return getToken(ProtoParserParser.EQUALS, 0); }
 		public TerminalNode INTEGER_LITERAL() { return \
getToken(ProtoParserParser.INTEGER_LITERAL, 0); }  public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); } @@ \
-2218,31 +2391,31 @@ public class ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Message_item_def2Context message_item_def2() throws \
RecognitionException {  Message_item_def2Context _localctx = new \
                Message_item_def2Context(_ctx, getState());
-		enterRule(_localctx, 62, RULE_message_item_def2);
+		enterRule(_localctx, 64, RULE_message_item_def2);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(293);
+			setState(299);
 			protobuf_scope_literal2();
-			setState(294);
+			setState(300);
 			proto_type();
-			setState(295);
-			match(IDENTIFIER);
-			setState(296);
+			setState(301);
+			identifier();
+			setState(302);
 			match(EQUALS);
-			setState(297);
+			setState(303);
 			match(INTEGER_LITERAL);
-			setState(299);
+			setState(305);
 			_la = _input.LA(1);
 			if (_la==BRACKET_OPEN) {
 				{
-				setState(298);
+				setState(304);
 				option_field_def();
 				}
 			}
 
-			setState(301);
+			setState(307);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -2279,27 +2452,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Protobuf_scope_literal2Context protobuf_scope_literal2() throws \
RecognitionException {  Protobuf_scope_literal2Context _localctx = new \
                Protobuf_scope_literal2Context(_ctx, getState());
-		enterRule(_localctx, 64, RULE_protobuf_scope_literal2);
+		enterRule(_localctx, 66, RULE_protobuf_scope_literal2);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(306);
+			setState(312);
 			switch (_input.LA(1)) {
 			case REQUIRED_PROTOBUF_SCOPE_LITERAL:
 				{
-				setState(303);
+				setState(309);
 				_localctx.v = match(REQUIRED_PROTOBUF_SCOPE_LITERAL);
 				}
 				break;
 			case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
 				{
-				setState(304);
+				setState(310);
 				_localctx.v = match(OPTIONAL_PROTOBUF_SCOPE_LITERAL);
 				}
 				break;
 			case REPEATED_PROTOBUF_SCOPE_LITERAL:
 				{
-				setState(305);
+				setState(311);
 				_localctx.v = match(REPEATED_PROTOBUF_SCOPE_LITERAL);
 				}
 				break;
@@ -2323,7 +2496,9 @@ public class ProtoParserParser extends Parser {
 		public Proto_typeContext proto_type() {
 			return getRuleContext(Proto_typeContext.class,0);
 		}
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode EQUALS() { return getToken(ProtoParserParser.EQUALS, 0); }
 		public TerminalNode INTEGER_LITERAL() { return \
getToken(ProtoParserParser.INTEGER_LITERAL, 0); }  public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); } @@ \
-2348,38 +2523,38 @@ public class ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Message_item_def3Context message_item_def3() throws \
RecognitionException {  Message_item_def3Context _localctx = new \
                Message_item_def3Context(_ctx, getState());
-		enterRule(_localctx, 66, RULE_message_item_def3);
+		enterRule(_localctx, 68, RULE_message_item_def3);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(309);
-			_la = _input.LA(1);
-			if (_la==REPEATED_PROTOBUF_SCOPE_LITERAL) {
+			setState(315);
+			switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) {
+			case 1:
 				{
-				setState(308);
+				setState(314);
 				match(REPEATED_PROTOBUF_SCOPE_LITERAL);
 				}
+				break;
 			}
-
-			setState(311);
+			setState(317);
 			proto_type();
-			setState(312);
-			match(IDENTIFIER);
-			setState(313);
+			setState(318);
+			identifier();
+			setState(319);
 			match(EQUALS);
-			setState(314);
+			setState(320);
 			match(INTEGER_LITERAL);
-			setState(316);
+			setState(322);
 			_la = _input.LA(1);
 			if (_la==BRACKET_OPEN) {
 				{
-				setState(315);
+				setState(321);
 				option_field_def();
 				}
 			}
 
-			setState(318);
+			setState(324);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -2421,34 +2596,34 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Message_ext_defContext message_ext_def() throws RecognitionException {
 		Message_ext_defContext _localctx = new Message_ext_defContext(_ctx, getState());
-		enterRule(_localctx, 68, RULE_message_ext_def);
+		enterRule(_localctx, 70, RULE_message_ext_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(320);
+			setState(326);
 			match(EXTENSIONS_DEF_LITERAL);
-			setState(321);
+			setState(327);
 			match(INTEGER_LITERAL);
-			setState(322);
+			setState(328);
 			match(TO_LITERAL);
-			setState(325);
+			setState(331);
 			switch (_input.LA(1)) {
 			case INTEGER_LITERAL:
 				{
-				setState(323);
+				setState(329);
 				_localctx.v = match(INTEGER_LITERAL);
 				}
 				break;
 			case MAX_LITERAL:
 				{
-				setState(324);
+				setState(330);
 				_localctx.v = match(MAX_LITERAL);
 				}
 				break;
 			default:
 				throw new NoViableAltException(this);
 			}
-			setState(327);
+			setState(333);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -2488,23 +2663,23 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Reserved_defContext reserved_def() throws RecognitionException {
 		Reserved_defContext _localctx = new Reserved_defContext(_ctx, getState());
-		enterRule(_localctx, 70, RULE_reserved_def);
+		enterRule(_localctx, 72, RULE_reserved_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(329);
+			setState(335);
 			match(RESERVED_LITERAL);
-			setState(332);
+			setState(338);
 			switch (_input.LA(1)) {
 			case INTEGER_LITERAL:
 				{
-				setState(330);
+				setState(336);
 				reserved_ranges();
 				}
 				break;
 			case STRING_LITERAL:
 				{
-				setState(331);
+				setState(337);
 				reserved_field_names();
 				}
 				break;
@@ -2559,49 +2734,49 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Reserved_rangesContext reserved_ranges() throws RecognitionException {
 		Reserved_rangesContext _localctx = new Reserved_rangesContext(_ctx, getState());
-		enterRule(_localctx, 72, RULE_reserved_ranges);
+		enterRule(_localctx, 74, RULE_reserved_ranges);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(334);
+			setState(340);
 			match(INTEGER_LITERAL);
-			setState(335);
+			setState(341);
 			match(TO_LITERAL);
-			setState(338);
+			setState(344);
 			switch (_input.LA(1)) {
 			case INTEGER_LITERAL:
 				{
-				setState(336);
+				setState(342);
 				_localctx.v = match(INTEGER_LITERAL);
 				}
 				break;
 			case MAX_LITERAL:
 				{
-				setState(337);
+				setState(343);
 				_localctx.v = match(MAX_LITERAL);
 				}
 				break;
 			default:
 				throw new NoViableAltException(this);
 			}
-			setState(344);
+			setState(350);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					{
 					{
-					setState(340);
+					setState(346);
 					match(COMMA);
-					setState(341);
+					setState(347);
 					reserved_ranges();
 					}
 					} 
 				}
-				setState(346);
+				setState(352);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,29,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,30,_ctx);
 			}
 			}
 		}
@@ -2642,26 +2817,26 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Reserved_field_namesContext reserved_field_names() throws \
RecognitionException {  Reserved_field_namesContext _localctx = new \
                Reserved_field_namesContext(_ctx, getState());
-		enterRule(_localctx, 74, RULE_reserved_field_names);
+		enterRule(_localctx, 76, RULE_reserved_field_names);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(347);
+			setState(353);
 			match(STRING_LITERAL);
-			setState(352);
+			setState(358);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			while (_la==COMMA) {
 				{
 				{
-				setState(348);
+				setState(354);
 				match(COMMA);
-				setState(349);
+				setState(355);
 				match(STRING_LITERAL);
 				}
 				}
-				setState(354);
+				setState(360);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			}
@@ -2680,7 +2855,9 @@ public class ProtoParserParser extends Parser {
 
 	public static class Oneof_defContext extends ParserRuleContext {
 		public TerminalNode ONEOF_LITERAL() { return \
                getToken(ProtoParserParser.ONEOF_LITERAL, 0); }
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode BLOCK_OPEN() { return getToken(ProtoParserParser.BLOCK_OPEN, \
0); }  public Oneof_contentContext oneof_content() {
 			return getRuleContext(Oneof_contentContext.class,0);
@@ -2703,19 +2880,19 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Oneof_defContext oneof_def() throws RecognitionException {
 		Oneof_defContext _localctx = new Oneof_defContext(_ctx, getState());
-		enterRule(_localctx, 76, RULE_oneof_def);
+		enterRule(_localctx, 78, RULE_oneof_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(355);
+			setState(361);
 			match(ONEOF_LITERAL);
-			setState(356);
-			match(IDENTIFIER);
-			setState(357);
+			setState(362);
+			identifier();
+			setState(363);
 			match(BLOCK_OPEN);
-			setState(358);
+			setState(364);
 			oneof_content();
-			setState(359);
+			setState(365);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -2760,54 +2937,36 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Oneof_contentContext oneof_content() throws RecognitionException {
 		Oneof_contentContext _localctx = new Oneof_contentContext(_ctx, getState());
-		enterRule(_localctx, 78, RULE_oneof_content);
+		enterRule(_localctx, 80, RULE_oneof_content);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(363); 
+			setState(369); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(363);
-				switch (_input.LA(1)) {
-				case OPTION_LITERAL:
+				setState(369);
+				switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
+				case 1:
 					{
-					setState(361);
+					setState(367);
 					option_line_def();
 					}
 					break;
-				case DOUBLE_PROTOBUF_TYPE_LITERAL:
-				case FLOAT_PROTOBUF_TYPE_LITERAL:
-				case INT32_PROTOBUF_TYPE_LITERAL:
-				case INT64_PROTOBUF_TYPE_LITERAL:
-				case UINT32_PROTOBUF_TYPE_LITERAL:
-				case UINT64_PROTOBUF_TYPE_LITERAL:
-				case SINT32_PROTOBUF_TYPE_LITERAL:
-				case SINT64_PROTOBUF_TYPE_LITERAL:
-				case FIXED32_PROTOBUF_TYPE_LITERAL:
-				case FIXED64_PROTOBUF_TYPE_LITERAL:
-				case SFIXED32_PROTOBUF_TYPE_LITERAL:
-				case SFIXED64_PROTOBUF_TYPE_LITERAL:
-				case BOOL_PROTOBUF_TYPE_LITERAL:
-				case STRING_PROTOBUF_TYPE_LITERAL:
-				case BYTES_PROTOBUF_TYPE_LITERAL:
-				case IDENTIFIER:
-				case QUALIFIED_IDENTIFIER:
+				case 2:
 					{
-					setState(362);
+					setState(368);
 					oneof_field_def();
 					}
 					break;
-				default:
-					throw new NoViableAltException(this);
 				}
 				}
-				setState(365); 
+				setState(371); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
-			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L \
<< DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << IDENTIFIER) | (1L << QUALIFIED_IDENTIFIER))) != \
0) ); +			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PACKAGE_LITERAL) \
| (1L << IMPORT_LITERAL) | (1L << OPTION_LITERAL) | (1L << SYNTAX_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << EXTEND_LITERAL) | (1L << \
EXTENSIONS_DEF_LITERAL) | (1L << TO_LITERAL) | (1L << MAX_LITERAL) | (1L << \
PUBLIC_LITERAL) | (1L << WEAK_LITERAL) | (1L << RESERVED_LITERAL) | (1L << \
MAP_LITERAL) | (1L << ONEOF_LITERAL) | (1L << SERVICE_LITERAL) | (1L << \
RETURNS_LITERAL) | (1L << RPC_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL) | \
(1L << DOUBLE_PROTOBUF_TYPE_LITERAL) | (1L << FLOAT_PROTOBUF_TYPE_LITERAL) | (1L << \
INT32_PROTOBUF_TYPE_LITERAL) | (1L << INT64_PROTOBUF_TYPE_LITERAL) | (1L << \
UINT32_PROTOBUF_TYPE_LITERAL) | (1L << UINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
SINT32_PROTOBUF_TYPE_LITERAL) | (1L << SINT64_PROTOBUF_TYPE_LITERAL) | (1L << \
FIXED32_PROTOBUF_TYPE_LITERAL) | (1L << FIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
SFIXED32_PROTOBUF_TYPE_LITERAL) | (1L << SFIXED64_PROTOBUF_TYPE_LITERAL) | (1L << \
BOOL_PROTOBUF_TYPE_LITERAL) | (1L << STRING_PROTOBUF_TYPE_LITERAL) | (1L << \
BYTES_PROTOBUF_TYPE_LITERAL) | (1L << BOOL_LITERAL) | (1L << IDENTIFIER) | (1L << \
QUALIFIED_IDENTIFIER))) != 0) );  }
 		}
 		catch (RecognitionException re) {
@@ -2825,7 +2984,9 @@ public class ProtoParserParser extends Parser {
 		public Proto_typeContext proto_type() {
 			return getRuleContext(Proto_typeContext.class,0);
 		}
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode EQUALS() { return getToken(ProtoParserParser.EQUALS, 0); }
 		public TerminalNode INTEGER_LITERAL() { return \
getToken(ProtoParserParser.INTEGER_LITERAL, 0); }  public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); } @@ \
-2849,29 +3010,29 @@ public class ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Oneof_field_defContext oneof_field_def() throws RecognitionException {
 		Oneof_field_defContext _localctx = new Oneof_field_defContext(_ctx, getState());
-		enterRule(_localctx, 80, RULE_oneof_field_def);
+		enterRule(_localctx, 82, RULE_oneof_field_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(367);
+			setState(373);
 			proto_type();
-			setState(368);
-			match(IDENTIFIER);
-			setState(369);
+			setState(374);
+			identifier();
+			setState(375);
 			match(EQUALS);
-			setState(370);
+			setState(376);
 			match(INTEGER_LITERAL);
-			setState(372);
+			setState(378);
 			_la = _input.LA(1);
 			if (_la==BRACKET_OPEN) {
 				{
-				setState(371);
+				setState(377);
 				option_field_def();
 				}
 			}
 
-			setState(374);
+			setState(380);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -2897,7 +3058,9 @@ public class ProtoParserParser extends Parser {
 			return getRuleContext(Proto_typeContext.class,0);
 		}
 		public TerminalNode GT() { return getToken(ProtoParserParser.GT, 0); }
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public TerminalNode EQUALS() { return getToken(ProtoParserParser.EQUALS, 0); }
 		public TerminalNode INTEGER_LITERAL() { return \
getToken(ProtoParserParser.INTEGER_LITERAL, 0); }  public TerminalNode \
ITEM_TERMINATOR() { return getToken(ProtoParserParser.ITEM_TERMINATOR, 0); } @@ \
-2918,29 +3081,29 @@ public class ProtoParserParser extends Parser {  @RuleVersion(0)
 	public final Map_field_defContext map_field_def() throws RecognitionException {
 		Map_field_defContext _localctx = new Map_field_defContext(_ctx, getState());
-		enterRule(_localctx, 82, RULE_map_field_def);
+		enterRule(_localctx, 84, RULE_map_field_def);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(376);
+			setState(382);
 			match(MAP_LITERAL);
-			setState(377);
+			setState(383);
 			match(LT);
-			setState(378);
+			setState(384);
 			proto_map_key_type();
-			setState(379);
+			setState(385);
 			match(COMMA);
-			setState(380);
+			setState(386);
 			proto_type();
-			setState(381);
+			setState(387);
 			match(GT);
-			setState(382);
-			match(IDENTIFIER);
-			setState(383);
+			setState(388);
+			identifier();
+			setState(389);
 			match(EQUALS);
-			setState(384);
+			setState(390);
 			match(INTEGER_LITERAL);
-			setState(385);
+			setState(391);
 			match(ITEM_TERMINATOR);
 			}
 		}
@@ -2982,27 +3145,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Ext_defContext ext_def() throws RecognitionException {
 		Ext_defContext _localctx = new Ext_defContext(_ctx, getState());
-		enterRule(_localctx, 84, RULE_ext_def);
+		enterRule(_localctx, 86, RULE_ext_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(387);
+			setState(393);
 			match(EXTEND_LITERAL);
-			setState(388);
+			setState(394);
 			ext_name();
-			setState(389);
+			setState(395);
 			match(BLOCK_OPEN);
-			setState(391);
+			setState(397);
 			_la = _input.LA(1);
 			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L << \
ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) | \
(1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL))) \
!= 0)) {  {
-				setState(390);
+				setState(396);
 				ext_content();
 				}
 			}
 
-			setState(393);
+			setState(399);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -3038,11 +3201,11 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Ext_nameContext ext_name() throws RecognitionException {
 		Ext_nameContext _localctx = new Ext_nameContext(_ctx, getState());
-		enterRule(_localctx, 86, RULE_ext_name);
+		enterRule(_localctx, 88, RULE_ext_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(395);
+			setState(401);
 			all_identifier();
 			}
 		}
@@ -3099,21 +3262,21 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Ext_contentContext ext_content() throws RecognitionException {
 		Ext_contentContext _localctx = new Ext_contentContext(_ctx, getState());
-		enterRule(_localctx, 88, RULE_ext_content);
+		enterRule(_localctx, 90, RULE_ext_content);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(401); 
+			setState(407); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(401);
+				setState(407);
 				switch (_input.LA(1)) {
 				case OPTION_LITERAL:
 					{
-					setState(397);
+					setState(403);
 					option_line_def();
 					}
 					break;
@@ -3121,19 +3284,19 @@ public class ProtoParserParser extends Parser {
 				case OPTIONAL_PROTOBUF_SCOPE_LITERAL:
 				case REPEATED_PROTOBUF_SCOPE_LITERAL:
 					{
-					setState(398);
+					setState(404);
 					message_item_def2();
 					}
 					break;
 				case MESSAGE_LITERAL:
 					{
-					setState(399);
+					setState(405);
 					message_def2();
 					}
 					break;
 				case ENUM_LITERAL:
 					{
-					setState(400);
+					setState(406);
 					enum_def();
 					}
 					break;
@@ -3141,7 +3304,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(403); 
+				setState(409); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTION_LITERAL) | (1L \
<< ENUM_LITERAL) | (1L << MESSAGE_LITERAL) | (1L << REQUIRED_PROTOBUF_SCOPE_LITERAL) \
| (1L << OPTIONAL_PROTOBUF_SCOPE_LITERAL) | (1L << REPEATED_PROTOBUF_SCOPE_LITERAL))) \
!= 0) ); @@ -3185,27 +3348,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Service_defContext service_def() throws RecognitionException {
 		Service_defContext _localctx = new Service_defContext(_ctx, getState());
-		enterRule(_localctx, 90, RULE_service_def);
+		enterRule(_localctx, 92, RULE_service_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(405);
+			setState(411);
 			match(SERVICE_LITERAL);
-			setState(406);
+			setState(412);
 			service_name();
-			setState(407);
+			setState(413);
 			match(BLOCK_OPEN);
-			setState(409);
+			setState(415);
 			_la = _input.LA(1);
 			if (_la==OPTION_LITERAL || _la==RPC_LITERAL) {
 				{
-				setState(408);
+				setState(414);
 				service_content();
 				}
 			}
 
-			setState(411);
+			setState(417);
 			match(BLOCK_CLOSE);
 			}
 		}
@@ -3221,7 +3384,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Service_nameContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public Service_nameContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -3239,12 +3404,12 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Service_nameContext service_name() throws RecognitionException {
 		Service_nameContext _localctx = new Service_nameContext(_ctx, getState());
-		enterRule(_localctx, 92, RULE_service_name);
+		enterRule(_localctx, 94, RULE_service_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(413);
-			match(IDENTIFIER);
+			setState(419);
+			identifier();
 			}
 		}
 		catch (RecognitionException re) {
@@ -3288,27 +3453,27 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Service_contentContext service_content() throws RecognitionException {
 		Service_contentContext _localctx = new Service_contentContext(_ctx, getState());
-		enterRule(_localctx, 94, RULE_service_content);
+		enterRule(_localctx, 96, RULE_service_content);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(417); 
+			setState(423); 
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			do {
 				{
-				setState(417);
+				setState(423);
 				switch (_input.LA(1)) {
 				case OPTION_LITERAL:
 					{
-					setState(415);
+					setState(421);
 					option_line_def();
 					}
 					break;
 				case RPC_LITERAL:
 					{
-					setState(416);
+					setState(422);
 					rpc_def();
 					}
 					break;
@@ -3316,7 +3481,7 @@ public class ProtoParserParser extends Parser {
 					throw new NoViableAltException(this);
 				}
 				}
-				setState(419); 
+				setState(425); 
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 			} while ( _la==OPTION_LITERAL || _la==RPC_LITERAL );
@@ -3379,56 +3544,56 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Rpc_defContext rpc_def() throws RecognitionException {
 		Rpc_defContext _localctx = new Rpc_defContext(_ctx, getState());
-		enterRule(_localctx, 96, RULE_rpc_def);
+		enterRule(_localctx, 98, RULE_rpc_def);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(421);
+			setState(427);
 			match(RPC_LITERAL);
-			setState(422);
+			setState(428);
 			rpc_name();
-			setState(423);
+			setState(429);
 			match(PAREN_OPEN);
-			setState(424);
+			setState(430);
 			req_name();
-			setState(425);
+			setState(431);
 			match(PAREN_CLOSE);
-			setState(426);
+			setState(432);
 			match(RETURNS_LITERAL);
-			setState(427);
+			setState(433);
 			match(PAREN_OPEN);
-			setState(428);
+			setState(434);
 			resp_name();
-			setState(429);
+			setState(435);
 			match(PAREN_CLOSE);
-			setState(442);
+			setState(448);
 			switch (_input.LA(1)) {
 			case BLOCK_OPEN:
 				{
-				setState(430);
+				setState(436);
 				match(BLOCK_OPEN);
-				setState(434);
+				setState(440);
 				_errHandler.sync(this);
 				_la = _input.LA(1);
 				while (_la==OPTION_LITERAL) {
 					{
 					{
-					setState(431);
+					setState(437);
 					option_line_def();
 					}
 					}
-					setState(436);
+					setState(442);
 					_errHandler.sync(this);
 					_la = _input.LA(1);
 				}
-				setState(437);
+				setState(443);
 				match(BLOCK_CLOSE);
-				setState(439);
+				setState(445);
 				_la = _input.LA(1);
 				if (_la==ITEM_TERMINATOR) {
 					{
-					setState(438);
+					setState(444);
 					match(ITEM_TERMINATOR);
 					}
 				}
@@ -3437,7 +3602,7 @@ public class ProtoParserParser extends Parser {
 				break;
 			case ITEM_TERMINATOR:
 				{
-				setState(441);
+				setState(447);
 				match(ITEM_TERMINATOR);
 				}
 				break;
@@ -3458,7 +3623,9 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static class Rpc_nameContext extends ParserRuleContext {
-		public TerminalNode IDENTIFIER() { return getToken(ProtoParserParser.IDENTIFIER, \
0); } +		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
 		public Rpc_nameContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -3476,12 +3643,12 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Rpc_nameContext rpc_name() throws RecognitionException {
 		Rpc_nameContext _localctx = new Rpc_nameContext(_ctx, getState());
-		enterRule(_localctx, 98, RULE_rpc_name);
+		enterRule(_localctx, 100, RULE_rpc_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(444);
-			match(IDENTIFIER);
+			setState(450);
+			identifier();
 			}
 		}
 		catch (RecognitionException re) {
@@ -3516,11 +3683,11 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Req_nameContext req_name() throws RecognitionException {
 		Req_nameContext _localctx = new Req_nameContext(_ctx, getState());
-		enterRule(_localctx, 100, RULE_req_name);
+		enterRule(_localctx, 102, RULE_req_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(446);
+			setState(452);
 			all_identifier();
 			}
 		}
@@ -3556,11 +3723,11 @@ public class ProtoParserParser extends Parser {
 	@RuleVersion(0)
 	public final Resp_nameContext resp_name() throws RecognitionException {
 		Resp_nameContext _localctx = new Resp_nameContext(_ctx, getState());
-		enterRule(_localctx, 102, RULE_resp_name);
+		enterRule(_localctx, 104, RULE_resp_name);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(448);
+			setState(454);
 			all_identifier();
 			}
 		}
@@ -3576,168 +3743,171 @@ public class ProtoParserParser extends Parser {
 	}
 
 	public static final String _serializedATN =
-		"\3\uaf6f\u8320\u479d\ub75c\u4880\u1605\u191c\uab37\3>\u01c5\4\2\t\2\4"+
+		"\3\uaf6f\u8320\u479d\ub75c\u4880\u1605\u191c\uab37\3>\u01cb\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
 		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
 		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
 		",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
-		"\64\4\65\t\65\3\2\3\2\3\3\3\3\5\3o\n\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7"+
-		"\3\7\5\7z\n\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u0084\n\b\3\t\3\t\3"+
-		"\t\3\t\3\t\3\t\3\t\7\t\u008d\n\t\f\t\16\t\u0090\13\t\3\n\3\n\3\n\3\n\3"+
-		"\n\3\n\7\n\u0098\n\n\f\n\16\n\u009b\13\n\3\13\3\13\3\13\3\13\3\f\3\f\3"+
-		"\r\3\r\5\r\u00a5\n\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3"+
-		"\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+
-		"\22\7\22\u00c0\n\22\f\22\16\22\u00c3\13\22\3\22\3\22\3\23\3\23\3\23\3"+
-		"\23\3\24\3\24\5\24\u00cd\n\24\3\25\3\25\7\25\u00d1\n\25\f\25\16\25\u00d4"+
-		"\13\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\7\27\u00e1"+
-		"\n\27\f\27\16\27\u00e4\13\27\5\27\u00e6\n\27\3\30\3\30\3\30\3\30\3\30"+
-		"\3\30\3\31\3\31\3\32\3\32\7\32\u00f2\n\32\f\32\16\32\u00f5\13\32\3\33"+
-		"\3\33\3\33\3\33\5\33\u00fb\n\33\3\33\3\33\3\34\3\34\3\34\3\34\5\34\u0103"+
-		"\n\34\3\34\3\34\3\35\3\35\3\35\3\35\5\35\u010b\n\35\3\35\3\35\3\36\3\36"+
-		"\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\6\37\u0119\n\37\r\37\16\37\u011a"+
-		"\3 \3 \3 \3 \3 \3 \3 \6 \u0124\n \r \16 \u0125\3!\3!\3!\3!\3!\3!\5!\u012e"+
-		"\n!\3!\3!\3\"\3\"\3\"\5\"\u0135\n\"\3#\5#\u0138\n#\3#\3#\3#\3#\3#\5#\u013f"+
-		"\n#\3#\3#\3$\3$\3$\3$\3$\5$\u0148\n$\3$\3$\3%\3%\3%\5%\u014f\n%\3&\3&"+
-		"\3&\3&\5&\u0155\n&\3&\3&\7&\u0159\n&\f&\16&\u015c\13&\3\'\3\'\3\'\7\'"+
-		"\u0161\n\'\f\'\16\'\u0164\13\'\3(\3(\3(\3(\3(\3(\3)\3)\6)\u016e\n)\r)"+
-		"\16)\u016f\3*\3*\3*\3*\3*\5*\u0177\n*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3"+
-		"+\3+\3+\3,\3,\3,\3,\5,\u018a\n,\3,\3,\3-\3-\3.\3.\3.\3.\6.\u0194\n.\r"+
-		".\16.\u0195\3/\3/\3/\3/\5/\u019c\n/\3/\3/\3\60\3\60\3\61\3\61\6\61\u01a4"+
-		"\n\61\r\61\16\61\u01a5\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3"+
-		"\62\3\62\7\62\u01b3\n\62\f\62\16\62\u01b6\13\62\3\62\3\62\5\62\u01ba\n"+
-		"\62\3\62\5\62\u01bd\n\62\3\63\3\63\3\64\3\64\3\65\3\65\3\65\2\2\2\66\2"+
-		"\2\4\2\6\2\b\2\n\2\f\2\16\2\20\2\22\2\24\2\26\2\30\2\32\2\34\2\36\2 \2"+
-		"\"\2$\2&\2(\2*\2,\2.\2\60\2\62\2\64\2\66\28\2:\2<\2>\2@\2B\2D\2F\2H\2"+
-		"J\2L\2N\2P\2R\2T\2V\2X\2Z\2\\\2^\2`\2b\2d\2f\2h\2\2\7\3\29:\3\2\658\3"+
-		"\2(\63\4\2&\'\64\64\3\2\r\16\u01d3\2j\3\2\2\2\4n\3\2\2\2\6p\3\2\2\2\b"+
-		"r\3\2\2\2\nt\3\2\2\2\fy\3\2\2\2\16\u0083\3\2\2\2\20\u008e\3\2\2\2\22\u0099"+
-		"\3\2\2\2\24\u009c\3\2\2\2\26\u00a0\3\2\2\2\30\u00a2\3\2\2\2\32\u00a9\3"+
-		"\2\2\2\34\u00ab\3\2\2\2\36\u00b0\3\2\2\2 \u00b5\3\2\2\2\"\u00bb\3\2\2"+
-		"\2$\u00c6\3\2\2\2&\u00cc\3\2\2\2(\u00ce\3\2\2\2*\u00d7\3\2\2\2,\u00e5"+
-		"\3\2\2\2.\u00e7\3\2\2\2\60\u00ed\3\2\2\2\62\u00f3\3\2\2\2\64\u00f6\3\2"+
-		"\2\2\66\u00fe\3\2\2\28\u0106\3\2\2\2:\u010e\3\2\2\2<\u0118\3\2\2\2>\u0123"+
-		"\3\2\2\2@\u0127\3\2\2\2B\u0134\3\2\2\2D\u0137\3\2\2\2F\u0142\3\2\2\2H"+
-		"\u014b\3\2\2\2J\u0150\3\2\2\2L\u015d\3\2\2\2N\u0165\3\2\2\2P\u016d\3\2"+
-		"\2\2R\u0171\3\2\2\2T\u017a\3\2\2\2V\u0185\3\2\2\2X\u018d\3\2\2\2Z\u0193"+
-		"\3\2\2\2\\\u0197\3\2\2\2^\u019f\3\2\2\2`\u01a3\3\2\2\2b\u01a7\3\2\2\2"+
-		"d\u01be\3\2\2\2f\u01c0\3\2\2\2h\u01c2\3\2\2\2jk\t\2\2\2k\3\3\2\2\2lo\7"+
-		"9\2\2mo\5\6\4\2nl\3\2\2\2nm\3\2\2\2o\5\3\2\2\2pq\t\3\2\2q\7\3\2\2\2rs"+
-		"\t\4\2\2s\t\3\2\2\2tu\t\5\2\2u\13\3\2\2\2vz\5\b\5\2wz\5\n\6\2xz\5\2\2"+
-		"\2yv\3\2\2\2yw\3\2\2\2yx\3\2\2\2z\r\3\2\2\2{|\5\34\17\2|}\5\20\t\2}\u0084"+
-		"\3\2\2\2~\177\5\36\20\2\177\u0080\5\22\n\2\u0080\u0081\3\2\2\2\u0081\u0082"+
-		"\7\2\2\3\u0082\u0084\3\2\2\2\u0083{\3\2\2\2\u0083~\3\2\2\2\u0084\17\3"+
-		"\2\2\2\u0085\u008d\5\24\13\2\u0086\u008d\5\30\r\2\u0087\u008d\5 \21\2"+
-		"\u0088\u008d\5.\30\2\u0089\u008d\5V,\2\u008a\u008d\5\66\34\2\u008b\u008d"+
-		"\5\\/\2\u008c\u0085\3\2\2\2\u008c\u0086\3\2\2\2\u008c\u0087\3\2\2\2\u008c"+
-		"\u0088\3\2\2\2\u008c\u0089\3\2\2\2\u008c\u008a\3\2\2\2\u008c\u008b\3\2"+
-		"\2\2\u008d\u0090\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008f\3\2\2\2\u008f"+
-		"\21\3\2\2\2\u0090\u008e\3\2\2\2\u0091\u0098\5\24\13\2\u0092\u0098\5\30"+
-		"\r\2\u0093\u0098\5 \21\2\u0094\u0098\5.\30\2\u0095\u0098\58\35\2\u0096"+
-		"\u0098\5\\/\2\u0097\u0091\3\2\2\2\u0097\u0092\3\2\2\2\u0097\u0093\3\2"+
-		"\2\2\u0097\u0094\3\2\2\2\u0097\u0095\3\2\2\2\u0097\u0096\3\2\2\2\u0098"+
-		"\u009b\3\2\2\2\u0099\u0097\3\2\2\2\u0099\u009a\3\2\2\2\u009a\23\3\2\2"+
-		"\2\u009b\u0099\3\2\2\2\u009c\u009d\7\3\2\2\u009d\u009e\5\26\f\2\u009e"+
-		"\u009f\7\36\2\2\u009f\25\3\2\2\2\u00a0\u00a1\5\2\2\2\u00a1\27\3\2\2\2"+
-		"\u00a2\u00a4\7\4\2\2\u00a3\u00a5\t\6\2\2\u00a4\u00a3\3\2\2\2\u00a4\u00a5"+
-		"\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a7\5\32\16\2\u00a7\u00a8\7\36\2"+
-		"\2\u00a8\31\3\2\2\2\u00a9\u00aa\7\66\2\2\u00aa\33\3\2\2\2\u00ab\u00ac"+
-		"\7\6\2\2\u00ac\u00ad\7\33\2\2\u00ad\u00ae\7!\2\2\u00ae\u00af\7\36\2\2"+
-		"\u00af\35\3\2\2\2\u00b0\u00b1\7\6\2\2\u00b1\u00b2\7\33\2\2\u00b2\u00b3"+
-		"\7\"\2\2\u00b3\u00b4\7\36\2\2\u00b4\37\3\2\2\2\u00b5\u00b6\7\5\2\2\u00b6"+
-		"\u00b7\5,\27\2\u00b7\u00b8\7\33\2\2\u00b8\u00b9\5&\24\2\u00b9\u00ba\7"+
-		"\36\2\2\u00ba!\3\2\2\2\u00bb\u00bc\7\31\2\2\u00bc\u00c1\5$\23\2\u00bd"+
-		"\u00be\7\35\2\2\u00be\u00c0\5$\23\2\u00bf\u00bd\3\2\2\2\u00c0\u00c3\3"+
-		"\2\2\2\u00c1\u00bf\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2\u00c4\3\2\2\2\u00c3"+
-		"\u00c1\3\2\2\2\u00c4\u00c5\7\32\2\2\u00c5#\3\2\2\2\u00c6\u00c7\5,\27\2"+
-		"\u00c7\u00c8\7\33\2\2\u00c8\u00c9\5&\24\2\u00c9%\3\2\2\2\u00ca\u00cd\5"+
-		"\4\3\2\u00cb\u00cd\5(\25\2\u00cc\u00ca\3\2\2\2\u00cc\u00cb\3\2\2\2\u00cd"+
-		"\'\3\2\2\2\u00ce\u00d2\7\25\2\2\u00cf\u00d1\5*\26\2\u00d0\u00cf\3\2\2"+
-		"\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00d5"+
-		"\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5\u00d6\7\26\2\2\u00d6)\3\2\2\2\u00d7"+
-		"\u00d8\79\2\2\u00d8\u00d9\7\34\2\2\u00d9\u00da\5&\24\2\u00da+\3\2\2\2"+
-		"\u00db\u00e6\79\2\2\u00dc\u00dd\7\27\2\2\u00dd\u00de\5\2\2\2\u00de\u00e2"+
-		"\7\30\2\2\u00df\u00e1\7;\2\2\u00e0\u00df\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2"+
-		"\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3\2"+
-		"\2\2\u00e5\u00db\3\2\2\2\u00e5\u00dc\3\2\2\2\u00e6-\3\2\2\2\u00e7\u00e8"+
-		"\7\7\2\2\u00e8\u00e9\5\60\31\2\u00e9\u00ea\7\25\2\2\u00ea\u00eb\5\62\32"+
-		"\2\u00eb\u00ec\7\26\2\2\u00ec/\3\2\2\2\u00ed\u00ee\79\2\2\u00ee\61\3\2"+
-		"\2\2\u00ef\u00f2\5 \21\2\u00f0\u00f2\5\64\33\2\u00f1\u00ef\3\2\2\2\u00f1"+
-		"\u00f0\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f3\u00f4\3\2"+
-		"\2\2\u00f4\63\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f7\79\2\2\u00f7\u00f8"+
-		"\7\33\2\2\u00f8\u00fa\7\65\2\2\u00f9\u00fb\5\"\22\2\u00fa\u00f9\3\2\2"+
-		"\2\u00fa\u00fb\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\u00fd\7\36\2\2\u00fd"+
-		"\65\3\2\2\2\u00fe\u00ff\7\b\2\2\u00ff\u0100\5:\36\2\u0100\u0102\7\25\2"+
-		"\2\u0101\u0103\5<\37\2\u0102\u0101\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0104"+
-		"\3\2\2\2\u0104\u0105\7\26\2\2\u0105\67\3\2\2\2\u0106\u0107\7\b\2\2\u0107"+
-		"\u0108\5:\36\2\u0108\u010a\7\25\2\2\u0109\u010b\5> \2\u010a\u0109\3\2"+
-		"\2\2\u010a\u010b\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\7\26\2\2\u010d"+
-		"9\3\2\2\2\u010e\u010f\79\2\2\u010f;\3\2\2\2\u0110\u0119\5 \21\2\u0111"+
-		"\u0119\5@!\2\u0112\u0119\5\66\34\2\u0113\u0119\5.\30\2\u0114\u0119\5F"+
-		"$\2\u0115\u0119\5H%\2\u0116\u0119\5N(\2\u0117\u0119\5T+\2\u0118\u0110"+
-		"\3\2\2\2\u0118\u0111\3\2\2\2\u0118\u0112\3\2\2\2\u0118\u0113\3\2\2\2\u0118"+
-		"\u0114\3\2\2\2\u0118\u0115\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0117\3\2"+
-		"\2\2\u0119\u011a\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b"+
-		"=\3\2\2\2\u011c\u0124\5 \21\2\u011d\u0124\5D#\2\u011e\u0124\58\35\2\u011f"+
-		"\u0124\5.\30\2\u0120\u0124\5H%\2\u0121\u0124\5N(\2\u0122\u0124\5T+\2\u0123"+
-		"\u011c\3\2\2\2\u0123\u011d\3\2\2\2\u0123\u011e\3\2\2\2\u0123\u011f\3\2"+
-		"\2\2\u0123\u0120\3\2\2\2\u0123\u0121\3\2\2\2\u0123\u0122\3\2\2\2\u0124"+
-		"\u0125\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126?\3\2\2\2"+
-		"\u0127\u0128\5B\"\2\u0128\u0129\5\f\7\2\u0129\u012a\79\2\2\u012a\u012b"+
-		"\7\33\2\2\u012b\u012d\7\65\2\2\u012c\u012e\5\"\22\2\u012d\u012c\3\2\2"+
-		"\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0130\7\36\2\2\u0130"+
-		"A\3\2\2\2\u0131\u0135\7#\2\2\u0132\u0135\7$\2\2\u0133\u0135\7%\2\2\u0134"+
-		"\u0131\3\2\2\2\u0134\u0132\3\2\2\2\u0134\u0133\3\2\2\2\u0135C\3\2\2\2"+
-		"\u0136\u0138\7%\2\2\u0137\u0136\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u0139"+
-		"\3\2\2\2\u0139\u013a\5\f\7\2\u013a\u013b\79\2\2\u013b\u013c\7\33\2\2\u013c"+
-		"\u013e\7\65\2\2\u013d\u013f\5\"\22\2\u013e\u013d\3\2\2\2\u013e\u013f\3"+
-		"\2\2\2\u013f\u0140\3\2\2\2\u0140\u0141\7\36\2\2\u0141E\3\2\2\2\u0142\u0143"+
-		"\7\n\2\2\u0143\u0144\7\65\2\2\u0144\u0147\7\13\2\2\u0145\u0148\7\65\2"+
-		"\2\u0146\u0148\7\f\2\2\u0147\u0145\3\2\2\2\u0147\u0146\3\2\2\2\u0148\u0149"+
-		"\3\2\2\2\u0149\u014a\7\36\2\2\u014aG\3\2\2\2\u014b\u014e\7\17\2\2\u014c"+
-		"\u014f\5J&\2\u014d\u014f\5L\'\2\u014e\u014c\3\2\2\2\u014e\u014d\3\2\2"+
-		"\2\u014fI\3\2\2\2\u0150\u0151\7\65\2\2\u0151\u0154\7\13\2\2\u0152\u0155"+
-		"\7\65\2\2\u0153\u0155\7\f\2\2\u0154\u0152\3\2\2\2\u0154\u0153\3\2\2\2"+
-		"\u0155\u015a\3\2\2\2\u0156\u0157\7\35\2\2\u0157\u0159\5J&\2\u0158\u0156"+
-		"\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b\3\2\2\2\u015b"+
-		"K\3\2\2\2\u015c\u015a\3\2\2\2\u015d\u0162\7\66\2\2\u015e\u015f\7\35\2"+
-		"\2\u015f\u0161\7\66\2\2\u0160\u015e\3\2\2\2\u0161\u0164\3\2\2\2\u0162"+
-		"\u0160\3\2\2\2\u0162\u0163\3\2\2\2\u0163M\3\2\2\2\u0164\u0162\3\2\2\2"+
-		"\u0165\u0166\7\21\2\2\u0166\u0167\79\2\2\u0167\u0168\7\25\2\2\u0168\u0169"+
-		"\5P)\2\u0169\u016a\7\26\2\2\u016aO\3\2\2\2\u016b\u016e\5 \21\2\u016c\u016e"+
-		"\5R*\2\u016d\u016b\3\2\2\2\u016d\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f"+
-		"\u016d\3\2\2\2\u016f\u0170\3\2\2\2\u0170Q\3\2\2\2\u0171\u0172\5\f\7\2"+
-		"\u0172\u0173\79\2\2\u0173\u0174\7\33\2\2\u0174\u0176\7\65\2\2\u0175\u0177"+
-		"\5\"\22\2\u0176\u0175\3\2\2\2\u0176\u0177\3\2\2\2\u0177\u0178\3\2\2\2"+
-		"\u0178\u0179\7\36\2\2\u0179S\3\2\2\2\u017a\u017b\7\20\2\2\u017b\u017c"+
-		"\7\37\2\2\u017c\u017d\5\b\5\2\u017d\u017e\7\35\2\2\u017e\u017f\5\f\7\2"+
-		"\u017f\u0180\7 \2\2\u0180\u0181\79\2\2\u0181\u0182\7\33\2\2\u0182\u0183"+
-		"\7\65\2\2\u0183\u0184\7\36\2\2\u0184U\3\2\2\2\u0185\u0186\7\t\2\2\u0186"+
-		"\u0187\5X-\2\u0187\u0189\7\25\2\2\u0188\u018a\5Z.\2\u0189\u0188\3\2\2"+
-		"\2\u0189\u018a\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u018c\7\26\2\2\u018c"+
-		"W\3\2\2\2\u018d\u018e\5\2\2\2\u018eY\3\2\2\2\u018f\u0194\5 \21\2\u0190"+
-		"\u0194\5@!\2\u0191\u0194\5\66\34\2\u0192\u0194\5.\30\2\u0193\u018f\3\2"+
-		"\2\2\u0193\u0190\3\2\2\2\u0193\u0191\3\2\2\2\u0193\u0192\3\2\2\2\u0194"+
-		"\u0195\3\2\2\2\u0195\u0193\3\2\2\2\u0195\u0196\3\2\2\2\u0196[\3\2\2\2"+
-		"\u0197\u0198\7\22\2\2\u0198\u0199\5^\60\2\u0199\u019b\7\25\2\2\u019a\u019c"+
-		"\5`\61\2\u019b\u019a\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019d\3\2\2\2\u019d"+
-		"\u019e\7\26\2\2\u019e]\3\2\2\2\u019f\u01a0\79\2\2\u01a0_\3\2\2\2\u01a1"+
-		"\u01a4\5 \21\2\u01a2\u01a4\5b\62\2\u01a3\u01a1\3\2\2\2\u01a3\u01a2\3\2"+
-		"\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a3\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
-		"a\3\2\2\2\u01a7\u01a8\7\24\2\2\u01a8\u01a9\5d\63\2\u01a9\u01aa\7\27\2"+
-		"\2\u01aa\u01ab\5f\64\2\u01ab\u01ac\7\30\2\2\u01ac\u01ad\7\23\2\2\u01ad"+
-		"\u01ae\7\27\2\2\u01ae\u01af\5h\65\2\u01af\u01bc\7\30\2\2\u01b0\u01b4\7"+
-		"\25\2\2\u01b1\u01b3\5 \21\2\u01b2\u01b1\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4"+
-		"\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b7\3\2\2\2\u01b6\u01b4\3\2"+
-		"\2\2\u01b7\u01b9\7\26\2\2\u01b8\u01ba\7\36\2\2\u01b9\u01b8\3\2\2\2\u01b9"+
-		"\u01ba\3\2\2\2\u01ba\u01bd\3\2\2\2\u01bb\u01bd\7\36\2\2\u01bc\u01b0\3"+
-		"\2\2\2\u01bc\u01bb\3\2\2\2\u01bdc\3\2\2\2\u01be\u01bf\79\2\2\u01bfe\3"+
-		"\2\2\2\u01c0\u01c1\5\2\2\2\u01c1g\3\2\2\2\u01c2\u01c3\5\2\2\2\u01c3i\3"+
-		"\2\2\2-ny\u0083\u008c\u008e\u0097\u0099\u00a4\u00c1\u00cc\u00d2\u00e2"+
-		"\u00e5\u00f1\u00f3\u00fa\u0102\u010a\u0118\u011a\u0123\u0125\u012d\u0134"+
-		"\u0137\u013e\u0147\u014e\u0154\u015a\u0162\u016d\u016f\u0176\u0189\u0193"+
-		"\u0195\u019b\u01a3\u01a5\u01b4\u01b9\u01bc";
+		"\64\4\65\t\65\4\66\t\66\3\2\3\2\3\3\3\3\5\3q\n\3\3\4\3\4\5\4u\n\4\3\5"+
+		"\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\b\5\b\u0080\n\b\3\t\3\t\3\t\3\t\3\t\3\t"+
+		"\3\t\3\t\5\t\u008a\n\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\7\n\u0093\n\n\f\n\16"+
+		"\n\u0096\13\n\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u009e\n\13\f\13\16\13"+
+		"\u00a1\13\13\3\f\3\f\3\f\3\f\3\r\3\r\3\16\3\16\5\16\u00ab\n\16\3\16\3"+
+		"\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3"+
+		"\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\7\23\u00c6\n\23\f\23"+
+		"\16\23\u00c9\13\23\3\23\3\23\3\24\3\24\3\24\3\24\3\25\3\25\5\25\u00d3"+
+		"\n\25\3\26\3\26\7\26\u00d7\n\26\f\26\16\26\u00da\13\26\3\26\3\26\3\27"+
+		"\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\7\30\u00e7\n\30\f\30\16\30\u00ea"+
+		"\13\30\5\30\u00ec\n\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\33\3"+
+		"\33\7\33\u00f8\n\33\f\33\16\33\u00fb\13\33\3\34\3\34\3\34\3\34\5\34\u0101"+
+		"\n\34\3\34\3\34\3\35\3\35\3\35\3\35\5\35\u0109\n\35\3\35\3\35\3\36\3\36"+
+		"\3\36\3\36\5\36\u0111\n\36\3\36\3\36\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3"+
+		" \6 \u011f\n \r \16 \u0120\3!\3!\3!\3!\3!\3!\3!\6!\u012a\n!\r!\16!\u012b"+
+		"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u0134\n\"\3\"\3\"\3#\3#\3#\5#\u013b\n#\3"+
+		"$\5$\u013e\n$\3$\3$\3$\3$\3$\5$\u0145\n$\3$\3$\3%\3%\3%\3%\3%\5%\u014e"+
+		"\n%\3%\3%\3&\3&\3&\5&\u0155\n&\3\'\3\'\3\'\3\'\5\'\u015b\n\'\3\'\3\'\7"+
+		"\'\u015f\n\'\f\'\16\'\u0162\13\'\3(\3(\3(\7(\u0167\n(\f(\16(\u016a\13"+
+		"(\3)\3)\3)\3)\3)\3)\3*\3*\6*\u0174\n*\r*\16*\u0175\3+\3+\3+\3+\3+\5+\u017d"+
+		"\n+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\5-\u0190\n-\3-"+
+		"\3-\3.\3.\3/\3/\3/\3/\6/\u019a\n/\r/\16/\u019b\3\60\3\60\3\60\3\60\5\60"+
+		"\u01a2\n\60\3\60\3\60\3\61\3\61\3\62\3\62\6\62\u01aa\n\62\r\62\16\62\u01ab"+
+		"\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u01b9\n\63"+
+		"\f\63\16\63\u01bc\13\63\3\63\3\63\5\63\u01c0\n\63\3\63\5\63\u01c3\n\63"+
+		"\3\64\3\64\3\65\3\65\3\66\3\66\3\66\2\2\2\67\2\2\4\2\6\2\b\2\n\2\f\2\16"+
+		"\2\20\2\22\2\24\2\26\2\30\2\32\2\34\2\36\2 \2\"\2$\2&\2(\2*\2,\2.\2\60"+
+		"\2\62\2\64\2\66\28\2:\2<\2>\2@\2B\2D\2F\2H\2J\2L\2N\2P\2R\2T\2V\2X\2Z"+
+		"\2\\\2^\2`\2b\2d\2f\2h\2j\2\2\7\6\2\3\24#\64\67\6799\3\2\658\3\2(\63\4"+
+		"\2&\'\64\64\3\2\r\16\u01d9\2l\3\2\2\2\4p\3\2\2\2\6t\3\2\2\2\bv\3\2\2\2"+
+		"\nx\3\2\2\2\fz\3\2\2\2\16\177\3\2\2\2\20\u0089\3\2\2\2\22\u0094\3\2\2"+
+		"\2\24\u009f\3\2\2\2\26\u00a2\3\2\2\2\30\u00a6\3\2\2\2\32\u00a8\3\2\2\2"+
+		"\34\u00af\3\2\2\2\36\u00b1\3\2\2\2 \u00b6\3\2\2\2\"\u00bb\3\2\2\2$\u00c1"+
+		"\3\2\2\2&\u00cc\3\2\2\2(\u00d2\3\2\2\2*\u00d4\3\2\2\2,\u00dd\3\2\2\2."+
+		"\u00eb\3\2\2\2\60\u00ed\3\2\2\2\62\u00f3\3\2\2\2\64\u00f9\3\2\2\2\66\u00fc"+
+		"\3\2\2\28\u0104\3\2\2\2:\u010c\3\2\2\2<\u0114\3\2\2\2>\u011e\3\2\2\2@"+
+		"\u0129\3\2\2\2B\u012d\3\2\2\2D\u013a\3\2\2\2F\u013d\3\2\2\2H\u0148\3\2"+
+		"\2\2J\u0151\3\2\2\2L\u0156\3\2\2\2N\u0163\3\2\2\2P\u016b\3\2\2\2R\u0173"+
+		"\3\2\2\2T\u0177\3\2\2\2V\u0180\3\2\2\2X\u018b\3\2\2\2Z\u0193\3\2\2\2\\"+
+		"\u0199\3\2\2\2^\u019d\3\2\2\2`\u01a5\3\2\2\2b\u01a9\3\2\2\2d\u01ad\3\2"+
+		"\2\2f\u01c4\3\2\2\2h\u01c6\3\2\2\2j\u01c8\3\2\2\2lm\t\2\2\2m\3\3\2\2\2"+
+		"nq\5\2\2\2oq\7:\2\2pn\3\2\2\2po\3\2\2\2q\5\3\2\2\2ru\5\2\2\2su\5\b\5\2"+
+		"tr\3\2\2\2ts\3\2\2\2u\7\3\2\2\2vw\t\3\2\2w\t\3\2\2\2xy\t\4\2\2y\13\3\2"+
+		"\2\2z{\t\5\2\2{\r\3\2\2\2|\u0080\5\n\6\2}\u0080\5\f\7\2~\u0080\5\4\3\2"+
+		"\177|\3\2\2\2\177}\3\2\2\2\177~\3\2\2\2\u0080\17\3\2\2\2\u0081\u0082\5"+
+		"\36\20\2\u0082\u0083\5\22\n\2\u0083\u008a\3\2\2\2\u0084\u0085\5 \21\2"+
+		"\u0085\u0086\5\24\13\2\u0086\u0087\3\2\2\2\u0087\u0088\7\2\2\3\u0088\u008a"+
+		"\3\2\2\2\u0089\u0081\3\2\2\2\u0089\u0084\3\2\2\2\u008a\21\3\2\2\2\u008b"+
+		"\u0093\5\26\f\2\u008c\u0093\5\32\16\2\u008d\u0093\5\"\22\2\u008e\u0093"+
+		"\5\60\31\2\u008f\u0093\5X-\2\u0090\u0093\58\35\2\u0091\u0093\5^\60\2\u0092"+
+		"\u008b\3\2\2\2\u0092\u008c\3\2\2\2\u0092\u008d\3\2\2\2\u0092\u008e\3\2"+
+		"\2\2\u0092\u008f\3\2\2\2\u0092\u0090\3\2\2\2\u0092\u0091\3\2\2\2\u0093"+
+		"\u0096\3\2\2\2\u0094\u0092\3\2\2\2\u0094\u0095\3\2\2\2\u0095\23\3\2\2"+
+		"\2\u0096\u0094\3\2\2\2\u0097\u009e\5\26\f\2\u0098\u009e\5\32\16\2\u0099"+
+		"\u009e\5\"\22\2\u009a\u009e\5\60\31\2\u009b\u009e\5:\36\2\u009c\u009e"+
+		"\5^\60\2\u009d\u0097\3\2\2\2\u009d\u0098\3\2\2\2\u009d\u0099\3\2\2\2\u009d"+
+		"\u009a\3\2\2\2\u009d\u009b\3\2\2\2\u009d\u009c\3\2\2\2\u009e\u00a1\3\2"+
+		"\2\2\u009f\u009d\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\25\3\2\2\2\u00a1\u009f"+
+		"\3\2\2\2\u00a2\u00a3\7\3\2\2\u00a3\u00a4\5\30\r\2\u00a4\u00a5\7\36\2\2"+
+		"\u00a5\27\3\2\2\2\u00a6\u00a7\5\4\3\2\u00a7\31\3\2\2\2\u00a8\u00aa\7\4"+
+		"\2\2\u00a9\u00ab\t\6\2\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab"+
+		"\u00ac\3\2\2\2\u00ac\u00ad\5\34\17\2\u00ad\u00ae\7\36\2\2\u00ae\33\3\2"+
+		"\2\2\u00af\u00b0\7\66\2\2\u00b0\35\3\2\2\2\u00b1\u00b2\7\6\2\2\u00b2\u00b3"+
+		"\7\33\2\2\u00b3\u00b4\7!\2\2\u00b4\u00b5\7\36\2\2\u00b5\37\3\2\2\2\u00b6"+
+		"\u00b7\7\6\2\2\u00b7\u00b8\7\33\2\2\u00b8\u00b9\7\"\2\2\u00b9\u00ba\7"+
+		"\36\2\2\u00ba!\3\2\2\2\u00bb\u00bc\7\5\2\2\u00bc\u00bd\5.\30\2\u00bd\u00be"+
+		"\7\33\2\2\u00be\u00bf\5(\25\2\u00bf\u00c0\7\36\2\2\u00c0#\3\2\2\2\u00c1"+
+		"\u00c2\7\31\2\2\u00c2\u00c7\5&\24\2\u00c3\u00c4\7\35\2\2\u00c4\u00c6\5"+
+		"&\24\2\u00c5\u00c3\3\2\2\2\u00c6\u00c9\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c7"+
+		"\u00c8\3\2\2\2\u00c8\u00ca\3\2\2\2\u00c9\u00c7\3\2\2\2\u00ca\u00cb\7\32"+
+		"\2\2\u00cb%\3\2\2\2\u00cc\u00cd\5.\30\2\u00cd\u00ce\7\33\2\2\u00ce\u00cf"+
+		"\5(\25\2\u00cf\'\3\2\2\2\u00d0\u00d3\5\6\4\2\u00d1\u00d3\5*\26\2\u00d2"+
+		"\u00d0\3\2\2\2\u00d2\u00d1\3\2\2\2\u00d3)\3\2\2\2\u00d4\u00d8\7\25\2\2"+
+		"\u00d5\u00d7\5,\27\2\u00d6\u00d5\3\2\2\2\u00d7\u00da\3\2\2\2\u00d8\u00d6"+
+		"\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00db\3\2\2\2\u00da\u00d8\3\2\2\2\u00db"+
+		"\u00dc\7\26\2\2\u00dc+\3\2\2\2\u00dd\u00de\5\2\2\2\u00de\u00df\7\34\2"+
+		"\2\u00df\u00e0\5(\25\2\u00e0-\3\2\2\2\u00e1\u00ec\5\2\2\2\u00e2\u00e3"+
+		"\7\27\2\2\u00e3\u00e4\5\4\3\2\u00e4\u00e8\7\30\2\2\u00e5\u00e7\7;\2\2"+
+		"\u00e6\u00e5\3\2\2\2\u00e7\u00ea\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e8\u00e9"+
+		"\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00eb\u00e1\3\2\2\2\u00eb"+
+		"\u00e2\3\2\2\2\u00ec/\3\2\2\2\u00ed\u00ee\7\7\2\2\u00ee\u00ef\5\62\32"+
+		"\2\u00ef\u00f0\7\25\2\2\u00f0\u00f1\5\64\33\2\u00f1\u00f2\7\26\2\2\u00f2"+
+		"\61\3\2\2\2\u00f3\u00f4\5\2\2\2\u00f4\63\3\2\2\2\u00f5\u00f8\5\"\22\2"+
+		"\u00f6\u00f8\5\66\34\2\u00f7\u00f5\3\2\2\2\u00f7\u00f6\3\2\2\2\u00f8\u00fb"+
+		"\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\65\3\2\2\2\u00fb"+
+		"\u00f9\3\2\2\2\u00fc\u00fd\5\2\2\2\u00fd\u00fe\7\33\2\2\u00fe\u0100\7"+
+		"\65\2\2\u00ff\u0101\5$\23\2\u0100\u00ff\3\2\2\2\u0100\u0101\3\2\2\2\u0101"+
+		"\u0102\3\2\2\2\u0102\u0103\7\36\2\2\u0103\67\3\2\2\2\u0104\u0105\7\b\2"+
+		"\2\u0105\u0106\5<\37\2\u0106\u0108\7\25\2\2\u0107\u0109\5> \2\u0108\u0107"+
+		"\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010b\7\26\2\2"+
+		"\u010b9\3\2\2\2\u010c\u010d\7\b\2\2\u010d\u010e\5<\37\2\u010e\u0110\7"+
+		"\25\2\2\u010f\u0111\5@!\2\u0110\u010f\3\2\2\2\u0110\u0111\3\2\2\2\u0111"+
+		"\u0112\3\2\2\2\u0112\u0113\7\26\2\2\u0113;\3\2\2\2\u0114\u0115\5\2\2\2"+
+		"\u0115=\3\2\2\2\u0116\u011f\5\"\22\2\u0117\u011f\5B\"\2\u0118\u011f\5"+
+		"8\35\2\u0119\u011f\5\60\31\2\u011a\u011f\5H%\2\u011b\u011f\5J&\2\u011c"+
+		"\u011f\5P)\2\u011d\u011f\5V,\2\u011e\u0116\3\2\2\2\u011e\u0117\3\2\2\2"+
+		"\u011e\u0118\3\2\2\2\u011e\u0119\3\2\2\2\u011e\u011a\3\2\2\2\u011e\u011b"+
+		"\3\2\2\2\u011e\u011c\3\2\2\2\u011e\u011d\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+
+		"\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121?\3\2\2\2\u0122\u012a\5\"\22\2"+
+		"\u0123\u012a\5F$\2\u0124\u012a\5:\36\2\u0125\u012a\5\60\31\2\u0126\u012a"+
+		"\5J&\2\u0127\u012a\5P)\2\u0128\u012a\5V,\2\u0129\u0122\3\2\2\2\u0129\u0123"+
+		"\3\2\2\2\u0129\u0124\3\2\2\2\u0129\u0125\3\2\2\2\u0129\u0126\3\2\2\2\u0129"+
+		"\u0127\3\2\2\2\u0129\u0128\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u0129\3\2"+
+		"\2\2\u012b\u012c\3\2\2\2\u012cA\3\2\2\2\u012d\u012e\5D#\2\u012e\u012f"+
+		"\5\16\b\2\u012f\u0130\5\2\2\2\u0130\u0131\7\33\2\2\u0131\u0133\7\65\2"+
+		"\2\u0132\u0134\5$\23\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0135"+
+		"\3\2\2\2\u0135\u0136\7\36\2\2\u0136C\3\2\2\2\u0137\u013b\7#\2\2\u0138"+
+		"\u013b\7$\2\2\u0139\u013b\7%\2\2\u013a\u0137\3\2\2\2\u013a\u0138\3\2\2"+
+		"\2\u013a\u0139\3\2\2\2\u013bE\3\2\2\2\u013c\u013e\7%\2\2\u013d\u013c\3"+
+		"\2\2\2\u013d\u013e\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\5\16\b\2\u0140"+
+		"\u0141\5\2\2\2\u0141\u0142\7\33\2\2\u0142\u0144\7\65\2\2\u0143\u0145\5"+
+		"$\23\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2\2\2\u0146"+
+		"\u0147\7\36\2\2\u0147G\3\2\2\2\u0148\u0149\7\n\2\2\u0149\u014a\7\65\2"+
+		"\2\u014a\u014d\7\13\2\2\u014b\u014e\7\65\2\2\u014c\u014e\7\f\2\2\u014d"+
+		"\u014b\3\2\2\2\u014d\u014c\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0150\7\36"+
+		"\2\2\u0150I\3\2\2\2\u0151\u0154\7\17\2\2\u0152\u0155\5L\'\2\u0153\u0155"+
+		"\5N(\2\u0154\u0152\3\2\2\2\u0154\u0153\3\2\2\2\u0155K\3\2\2\2\u0156\u0157"+
+		"\7\65\2\2\u0157\u015a\7\13\2\2\u0158\u015b\7\65\2\2\u0159\u015b\7\f\2"+
+		"\2\u015a\u0158\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u0160\3\2\2\2\u015c\u015d"+
+		"\7\35\2\2\u015d\u015f\5L\'\2\u015e\u015c\3\2\2\2\u015f\u0162\3\2\2\2\u0160"+
+		"\u015e\3\2\2\2\u0160\u0161\3\2\2\2\u0161M\3\2\2\2\u0162\u0160\3\2\2\2"+
+		"\u0163\u0168\7\66\2\2\u0164\u0165\7\35\2\2\u0165\u0167\7\66\2\2\u0166"+
+		"\u0164\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2"+
+		"\2\2\u0169O\3\2\2\2\u016a\u0168\3\2\2\2\u016b\u016c\7\21\2\2\u016c\u016d"+
+		"\5\2\2\2\u016d\u016e\7\25\2\2\u016e\u016f\5R*\2\u016f\u0170\7\26\2\2\u0170"+
+		"Q\3\2\2\2\u0171\u0174\5\"\22\2\u0172\u0174\5T+\2\u0173\u0171\3\2\2\2\u0173"+
+		"\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0173\3\2\2\2\u0175\u0176\3\2"+
+		"\2\2\u0176S\3\2\2\2\u0177\u0178\5\16\b\2\u0178\u0179\5\2\2\2\u0179\u017a"+
+		"\7\33\2\2\u017a\u017c\7\65\2\2\u017b\u017d\5$\23\2\u017c\u017b\3\2\2\2"+
+		"\u017c\u017d\3\2\2\2\u017d\u017e\3\2\2\2\u017e\u017f\7\36\2\2\u017fU\3"+
+		"\2\2\2\u0180\u0181\7\20\2\2\u0181\u0182\7\37\2\2\u0182\u0183\5\n\6\2\u0183"+
+		"\u0184\7\35\2\2\u0184\u0185\5\16\b\2\u0185\u0186\7 \2\2\u0186\u0187\5"+
+		"\2\2\2\u0187\u0188\7\33\2\2\u0188\u0189\7\65\2\2\u0189\u018a\7\36\2\2"+
+		"\u018aW\3\2\2\2\u018b\u018c\7\t\2\2\u018c\u018d\5Z.\2\u018d\u018f\7\25"+
+		"\2\2\u018e\u0190\5\\/\2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190"+
+		"\u0191\3\2\2\2\u0191\u0192\7\26\2\2\u0192Y\3\2\2\2\u0193\u0194\5\4\3\2"+
+		"\u0194[\3\2\2\2\u0195\u019a\5\"\22\2\u0196\u019a\5B\"\2\u0197\u019a\5"+
+		"8\35\2\u0198\u019a\5\60\31\2\u0199\u0195\3\2\2\2\u0199\u0196\3\2\2\2\u0199"+
+		"\u0197\3\2\2\2\u0199\u0198\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u0199\3\2"+
+		"\2\2\u019b\u019c\3\2\2\2\u019c]\3\2\2\2\u019d\u019e\7\22\2\2\u019e\u019f"+
+		"\5`\61\2\u019f\u01a1\7\25\2\2\u01a0\u01a2\5b\62\2\u01a1\u01a0\3\2\2\2"+
+		"\u01a1\u01a2\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a4\7\26\2\2\u01a4_\3"+
+		"\2\2\2\u01a5\u01a6\5\2\2\2\u01a6a\3\2\2\2\u01a7\u01aa\5\"\22\2\u01a8\u01aa"+
+		"\5d\63\2\u01a9\u01a7\3\2\2\2\u01a9\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab"+
+		"\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01acc\3\2\2\2\u01ad\u01ae\7\24\2\2"+
+		"\u01ae\u01af\5f\64\2\u01af\u01b0\7\27\2\2\u01b0\u01b1\5h\65\2\u01b1\u01b2"+
+		"\7\30\2\2\u01b2\u01b3\7\23\2\2\u01b3\u01b4\7\27\2\2\u01b4\u01b5\5j\66"+
+		"\2\u01b5\u01c2\7\30\2\2\u01b6\u01ba\7\25\2\2\u01b7\u01b9\5\"\22\2\u01b8"+
+		"\u01b7\3\2\2\2\u01b9\u01bc\3\2\2\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3\2"+
+		"\2\2\u01bb\u01bd\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bd\u01bf\7\26\2\2\u01be"+
+		"\u01c0\7\36\2\2\u01bf\u01be\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c3\3"+
+		"\2\2\2\u01c1\u01c3\7\36\2\2\u01c2\u01b6\3\2\2\2\u01c2\u01c1\3\2\2\2\u01c3"+
+		"e\3\2\2\2\u01c4\u01c5\5\2\2\2\u01c5g\3\2\2\2\u01c6\u01c7\5\4\3\2\u01c7"+
+		"i\3\2\2\2\u01c8\u01c9\5\4\3\2\u01c9k\3\2\2\2.pt\177\u0089\u0092\u0094"+
+		"\u009d\u009f\u00aa\u00c7\u00d2\u00d8\u00e8\u00eb\u00f7\u00f9\u0100\u0108"+
+		"\u0110\u011e\u0120\u0129\u012b\u0133\u013a\u013d\u0144\u014d\u0154\u015a"+
+		"\u0160\u0168\u0173\u0175\u017c\u018f\u0199\u019b\u01a1\u01a9\u01ab\u01ba"+
+		"\u01bf\u01c2";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {

-----------------------------------------------------------------------

Summary of changes:
 build.xml                                          |    6 +
 resources/antlr4/ProtoParser.g4                    |   75 +-
 sidekick/protobuf/ProtobufNode.java                |    2 +-
 sidekick/protobuf/ProtobufSideKickListener.java    |   32 +-
 .../protobuf/hyperlinks/PBHyperlinkSource.java     |    2 +-
 .../protobuf/parser/ProtoParserBaseListener.java   |   12 +
 sidekick/protobuf/parser/ProtoParserListener.java  |   10 +
 sidekick/protobuf/parser/ProtoParserParser.java    | 1396 +++++++++++---------
 test/data/sample2.proto                            |   23 +
 test/data/sample2.txt                              |   15 +
 test/data/sample3.proto                            |   34 +
 test/data/sample_simple3.proto                     |   10 +
 test/protobuf/ProtobufTestUtils.java               |  190 +++
 .../protobuf/hyperlinks/HyperlinkTest.java         |  172 +++
 test/sidekick/protobuf/parser/ParseTest.java       |  146 ++
 15 files changed, 1481 insertions(+), 644 deletions(-)
 create mode 100644 test/data/sample2.proto
 create mode 100644 test/data/sample2.txt
 create mode 100644 test/data/sample3.proto
 create mode 100644 test/data/sample_simple3.proto
 create mode 100644 test/protobuf/ProtobufTestUtils.java
 create mode 100644 test/sidekick/protobuf/hyperlinks/HyperlinkTest.java
 create mode 100644 test/sidekick/protobuf/parser/ParseTest.java


hooks/post-receive
-- 
ProtocolBuffer jEdit plugin


_______________________________________________
jEdit-CVS mailing list
jEdit-CVS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jedit-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic