From 19b9b7058da5074b1ed50e39c89d886811be85ef Mon Sep 17 00:00:00 2001 From: jumkey Date: Mon, 23 Sep 2019 16:46:19 +0800 Subject: [PATCH] fix comment semicolon --- pom.xml | 2 +- .../odiszapc/nginxparser/antlr/Nginx.tokens | 6 +- .../nginxparser/antlr/NginxBaseListener.java | 12 + .../nginxparser/antlr/NginxBaseVisitor.java | 7 + .../nginxparser/antlr/NginxLexer.java | 81 ++-- .../nginxparser/antlr/NginxLexer.tokens | 6 +- .../nginxparser/antlr/NginxListener.java | 10 + .../nginxparser/antlr/NginxListenerImpl.java | 7 +- .../nginxparser/antlr/NginxParser.java | 418 +++++++++++------- .../nginxparser/antlr/NginxVisitor.java | 6 + src/main/resources/grammar/Nginx.g4 | 24 +- .../odiszapc/nginxparser/ComplexTest.java | 14 +- .../odiszapc/nginxparser/TestUtils.java | 2 +- src/test/resources/complex/issues_11.conf | 4 + 14 files changed, 378 insertions(+), 221 deletions(-) create mode 100644 src/test/resources/complex/issues_11.conf diff --git a/pom.xml b/pom.xml index e02bdec..1614cc5 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ com.github.odiszapc nginxparser - 0.9.6 + 0.9.7-SNAPSHOT jar ${project.groupId}:${project.artifactId} diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/Nginx.tokens b/src/main/java/com/github/odiszapc/nginxparser/antlr/Nginx.tokens index efeda04..4bcffa0 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/Nginx.tokens +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/Nginx.tokens @@ -12,9 +12,9 @@ T__10=11 T__11=12 T__12=13 T__13=14 -Value=15 -STR_EXT=16 -Comment=17 +Comment=15 +Value=16 +STR_EXT=17 REGEXP_PREFIXED=18 QUOTED_STRING=19 SINGLE_QUOTED=20 diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseListener.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseListener.java index 6fa80ac..9e6c9bf 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseListener.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseListener.java @@ -122,6 +122,18 @@ public class NginxBaseListener implements NginxListener { *

The default implementation does nothing.

*/ @Override public void exitRegexp(NginxParser.RegexpContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExp(NginxParser.ExpContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExp(NginxParser.ExpContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseVisitor.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseVisitor.java index 0af9ad7..813246a 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseVisitor.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxBaseVisitor.java @@ -77,6 +77,13 @@ public class NginxBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitRegexp(NginxParser.RegexpContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExp(NginxParser.ExpContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.java index dc49462..47e275f 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.java @@ -20,15 +20,15 @@ public class NginxLexer extends Lexer { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, - T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, Value=15, STR_EXT=16, - Comment=17, REGEXP_PREFIXED=18, QUOTED_STRING=19, SINGLE_QUOTED=20, WS=21; + T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, Comment=15, Value=16, + STR_EXT=17, REGEXP_PREFIXED=18, QUOTED_STRING=19, SINGLE_QUOTED=20, WS=21; public static String[] modeNames = { "DEFAULT_MODE" }; public static final String[] ruleNames = { "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", - "T__9", "T__10", "T__11", "T__12", "T__13", "Value", "STR_EXT", "Comment", + "T__9", "T__10", "T__11", "T__12", "T__13", "Comment", "Value", "STR_EXT", "REGEXP_PREFIXED", "QUOTED_STRING", "RegexpPrefix", "StringCharacters", "NON_ASCII", "EscapeSequence", "SINGLE_QUOTED", "WS" }; @@ -39,7 +39,7 @@ public class NginxLexer extends Lexer { }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "Value", "STR_EXT", "Comment", "REGEXP_PREFIXED", "QUOTED_STRING", + null, null, null, "Comment", "Value", "STR_EXT", "REGEXP_PREFIXED", "QUOTED_STRING", "SINGLE_QUOTED", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -105,23 +105,23 @@ public NginxLexer(CharStream input) { "\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13"+ "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r"+ "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17"+ - "\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\5\20z\n\20\3\21\3\21\6\21~\n"+ - "\21\r\21\16\21\177\3\22\3\22\7\22\u0084\n\22\f\22\16\22\u0087\13\22\3"+ - "\23\3\23\6\23\u008b\n\23\r\23\16\23\u008c\3\24\3\24\5\24\u0091\n\24\3"+ - "\24\3\24\3\25\3\25\5\25\u0097\n\25\3\26\3\26\6\26\u009b\n\26\r\26\16\26"+ - "\u009c\3\27\3\27\3\30\3\30\5\30\u00a3\n\30\3\31\3\31\7\31\u00a7\n\31\f"+ - "\31\16\31\u00aa\13\31\3\31\3\31\3\32\6\32\u00af\n\32\r\32\16\32\u00b0"+ + "\3\17\3\17\3\17\3\17\3\17\3\20\3\20\7\20y\n\20\f\20\16\20|\13\20\3\21"+ + "\3\21\3\21\5\21\u0081\n\21\3\22\3\22\6\22\u0085\n\22\r\22\16\22\u0086"+ + "\3\23\3\23\6\23\u008b\n\23\r\23\16\23\u008c\3\24\3\24\5\24\u0091\n\24"+ + "\3\24\3\24\3\25\3\25\5\25\u0097\n\25\3\26\3\26\6\26\u009b\n\26\r\26\16"+ + "\26\u009c\3\27\3\27\3\30\3\30\5\30\u00a3\n\30\3\31\3\31\7\31\u00a7\n\31"+ + "\f\31\16\31\u00aa\13\31\3\31\3\31\3\32\6\32\u00af\n\32\r\32\16\32\u00b0"+ "\3\32\3\32\2\2\33\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+ "\16\33\17\35\20\37\21!\22#\23%\24\'\25)\2+\2-\2/\2\61\26\63\27\3\2\13"+ - "\13\2##%&((,\3\2\2\2\r@\3\2\2"+ - "\2\17B\3\2\2\2\21E\3\2\2\2\23G\3\2\2\2\25P\3\2\2\2\27X\3\2\2\2\31]\3\2"+ - "\2\2\33c\3\2\2\2\35l\3\2\2\2\37y\3\2\2\2!}\3\2\2\2#\u0081\3\2\2\2%\u0088"+ + "\4\2\f\f\17\17\n\2##%&((,<>ac|~~\u0080\u0080\n\2##%&((*<>ac|~~\u0080\u0080"+ + "\3\2\u0080\u0080\3\2,,\4\2$$^^\n\2$$))^^ddhhppttvv\4\2))^^\5\2\13\f\17"+ + "\17\"\"\u00bc\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2"+ + "\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2"+ + "\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2"+ + "\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\3\65"+ + "\3\2\2\2\5\67\3\2\2\2\79\3\2\2\2\t;\3\2\2\2\13>\3\2\2\2\r@\3\2\2\2\17"+ + "B\3\2\2\2\21E\3\2\2\2\23G\3\2\2\2\25P\3\2\2\2\27X\3\2\2\2\31]\3\2\2\2"+ + "\33c\3\2\2\2\35l\3\2\2\2\37v\3\2\2\2!\u0080\3\2\2\2#\u0084\3\2\2\2%\u0088"+ "\3\2\2\2\'\u008e\3\2\2\2)\u0094\3\2\2\2+\u009a\3\2\2\2-\u009e\3\2\2\2"+ "/\u00a0\3\2\2\2\61\u00a4\3\2\2\2\63\u00ae\3\2\2\2\65\66\7=\2\2\66\4\3"+ "\2\2\2\678\7}\2\28\6\3\2\2\29:\7\177\2\2:\b\3\2\2\2;<\7k\2\2<=\7h\2\2"+ @@ -132,27 +132,28 @@ public NginxLexer(CharStream input) { "c\2\2Z[\7u\2\2[\\\7v\2\2\\\30\3\2\2\2]^\7d\2\2^_\7t\2\2_`\7g\2\2`a\7c"+ "\2\2ab\7m\2\2b\32\3\2\2\2cd\7t\2\2de\7g\2\2ef\7f\2\2fg\7k\2\2gh\7t\2\2"+ "hi\7g\2\2ij\7e\2\2jk\7v\2\2k\34\3\2\2\2lm\7r\2\2mn\7g\2\2no\7t\2\2op\7"+ - "o\2\2pq\7c\2\2qr\7p\2\2rs\7g\2\2st\7p\2\2tu\7v\2\2u\36\3\2\2\2vz\5!\21"+ - "\2wz\5\'\24\2xz\5\61\31\2yv\3\2\2\2yw\3\2\2\2yx\3\2\2\2z \3\2\2\2{~\t"+ - "\2\2\2|~\5-\27\2}{\3\2\2\2}|\3\2\2\2~\177\3\2\2\2\177}\3\2\2\2\177\u0080"+ - "\3\2\2\2\u0080\"\3\2\2\2\u0081\u0085\7%\2\2\u0082\u0084\n\3\2\2\u0083"+ - "\u0082\3\2\2\2\u0084\u0087\3\2\2\2\u0085\u0083\3\2\2\2\u0085\u0086\3\2"+ - "\2\2\u0086$\3\2\2\2\u0087\u0085\3\2\2\2\u0088\u008a\5)\25\2\u0089\u008b"+ - "\t\4\2\2\u008a\u0089\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008a\3\2\2\2\u008c"+ - "\u008d\3\2\2\2\u008d&\3\2\2\2\u008e\u0090\7$\2\2\u008f\u0091\5+\26\2\u0090"+ - "\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u0093\7$"+ - "\2\2\u0093(\3\2\2\2\u0094\u0096\t\5\2\2\u0095\u0097\t\6\2\2\u0096\u0095"+ - "\3\2\2\2\u0096\u0097\3\2\2\2\u0097*\3\2\2\2\u0098\u009b\n\7\2\2\u0099"+ - "\u009b\5/\30\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\u009c\3\2"+ - "\2\2\u009c\u009a\3\2\2\2\u009c\u009d\3\2\2\2\u009d,\3\2\2\2\u009e\u009f"+ - "\4\u0082\1\2\u009f.\3\2\2\2\u00a0\u00a2\7^\2\2\u00a1\u00a3\t\b\2\2\u00a2"+ - "\u00a1\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\60\3\2\2\2\u00a4\u00a8\7)\2\2"+ - "\u00a5\u00a7\n\t\2\2\u00a6\u00a5\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6"+ - "\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00ab\3\2\2\2\u00aa\u00a8\3\2\2\2\u00ab"+ - "\u00ac\7)\2\2\u00ac\62\3\2\2\2\u00ad\u00af\t\n\2\2\u00ae\u00ad\3\2\2\2"+ - "\u00af\u00b0\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2"+ - "\3\2\2\2\u00b2\u00b3\b\32\2\2\u00b3\64\3\2\2\2\17\2y}\177\u0085\u008c"+ - "\u0090\u0096\u009a\u009c\u00a2\u00a8\u00b0\3\b\2\2"; + "o\2\2pq\7c\2\2qr\7p\2\2rs\7g\2\2st\7p\2\2tu\7v\2\2u\36\3\2\2\2vz\7%\2"+ + "\2wy\n\2\2\2xw\3\2\2\2y|\3\2\2\2zx\3\2\2\2z{\3\2\2\2{ \3\2\2\2|z\3\2\2"+ + "\2}\u0081\5#\22\2~\u0081\5\'\24\2\177\u0081\5\61\31\2\u0080}\3\2\2\2\u0080"+ + "~\3\2\2\2\u0080\177\3\2\2\2\u0081\"\3\2\2\2\u0082\u0085\t\3\2\2\u0083"+ + "\u0085\5-\27\2\u0084\u0082\3\2\2\2\u0084\u0083\3\2\2\2\u0085\u0086\3\2"+ + "\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087$\3\2\2\2\u0088\u008a"+ + "\5)\25\2\u0089\u008b\t\4\2\2\u008a\u0089\3\2\2\2\u008b\u008c\3\2\2\2\u008c"+ + "\u008a\3\2\2\2\u008c\u008d\3\2\2\2\u008d&\3\2\2\2\u008e\u0090\7$\2\2\u008f"+ + "\u0091\5+\26\2\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2"+ + "\2\2\u0092\u0093\7$\2\2\u0093(\3\2\2\2\u0094\u0096\t\5\2\2\u0095\u0097"+ + "\t\6\2\2\u0096\u0095\3\2\2\2\u0096\u0097\3\2\2\2\u0097*\3\2\2\2\u0098"+ + "\u009b\n\7\2\2\u0099\u009b\5/\30\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2"+ + "\2\2\u009b\u009c\3\2\2\2\u009c\u009a\3\2\2\2\u009c\u009d\3\2\2\2\u009d"+ + ",\3\2\2\2\u009e\u009f\4\u0082\1\2\u009f.\3\2\2\2\u00a0\u00a2\7^\2\2\u00a1"+ + "\u00a3\t\b\2\2\u00a2\u00a1\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\60\3\2\2"+ + "\2\u00a4\u00a8\7)\2\2\u00a5\u00a7\n\t\2\2\u00a6\u00a5\3\2\2\2\u00a7\u00aa"+ + "\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00ab\3\2\2\2\u00aa"+ + "\u00a8\3\2\2\2\u00ab\u00ac\7)\2\2\u00ac\62\3\2\2\2\u00ad\u00af\t\n\2\2"+ + "\u00ae\u00ad\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1"+ + "\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b3\b\32\2\2\u00b3\64\3\2\2\2\17"+ + "\2z\u0080\u0084\u0086\u008c\u0090\u0096\u009a\u009c\u00a2\u00a8\u00b0"+ + "\3\b\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.tokens b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.tokens index efeda04..4bcffa0 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.tokens +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxLexer.tokens @@ -12,9 +12,9 @@ T__10=11 T__11=12 T__12=13 T__13=14 -Value=15 -STR_EXT=16 -Comment=17 +Comment=15 +Value=16 +STR_EXT=17 REGEXP_PREFIXED=18 QUOTED_STRING=19 SINGLE_QUOTED=20 diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListener.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListener.java index 4613194..c58e86d 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListener.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListener.java @@ -100,6 +100,16 @@ public interface NginxListener extends ParseTreeListener { * @param ctx the parse tree */ void exitRegexp(NginxParser.RegexpContext ctx); + /** + * Enter a parse tree produced by {@link NginxParser#exp}. + * @param ctx the parse tree + */ + void enterExp(NginxParser.ExpContext ctx); + /** + * Exit a parse tree produced by {@link NginxParser#exp}. + * @param ctx the parse tree + */ + void exitExp(NginxParser.ExpContext ctx); /** * Enter a parse tree produced by {@link NginxParser#locationBlockHeader}. * @param ctx the parse tree diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListenerImpl.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListenerImpl.java index b23e945..40be062 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListenerImpl.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxListenerImpl.java @@ -1,11 +1,6 @@ package com.github.odiszapc.nginxparser.antlr; import com.github.odiszapc.nginxparser.NgxConfig; -import org.antlr.v4.runtime.misc.NotNull; -import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.TerminalNode; - -import java.util.List; public class NginxListenerImpl extends NginxBaseListener { @@ -17,7 +12,7 @@ public NgxConfig getResult() { } @Override - public void enterConfig(@NotNull NginxParser.ConfigContext ctx) { + public void enterConfig(NginxParser.ConfigContext ctx) { result = ctx.ret; } } diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java index 7610218..f422f34 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxParser.java @@ -21,15 +21,15 @@ public class NginxParser extends Parser { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, - T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, Value=15, STR_EXT=16, - Comment=17, REGEXP_PREFIXED=18, QUOTED_STRING=19, SINGLE_QUOTED=20, WS=21; + T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, Comment=15, Value=16, + STR_EXT=17, REGEXP_PREFIXED=18, QUOTED_STRING=19, SINGLE_QUOTED=20, WS=21; public static final int RULE_config = 0, RULE_statement = 1, RULE_genericStatement = 2, RULE_regexHeaderStatement = 3, RULE_block = 4, RULE_genericBlockHeader = 5, RULE_if_statement = 6, RULE_if_body = 7, - RULE_regexp = 8, RULE_locationBlockHeader = 9, RULE_rewriteStatement = 10; + RULE_regexp = 8, RULE_exp = 9, RULE_locationBlockHeader = 10, RULE_rewriteStatement = 11; public static final String[] ruleNames = { "config", "statement", "genericStatement", "regexHeaderStatement", "block", - "genericBlockHeader", "if_statement", "if_body", "regexp", "locationBlockHeader", + "genericBlockHeader", "if_statement", "if_body", "regexp", "exp", "locationBlockHeader", "rewriteStatement" }; @@ -39,7 +39,7 @@ public class NginxParser extends Parser { }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "Value", "STR_EXT", "Comment", "REGEXP_PREFIXED", "QUOTED_STRING", + null, null, null, "Comment", "Value", "STR_EXT", "REGEXP_PREFIXED", "QUOTED_STRING", "SINGLE_QUOTED", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -139,41 +139,41 @@ public final ConfigContext config() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(30); + setState(32); _errHandler.sync(this); _la = _input.LA(1); do { { - setState(30); + setState(32); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: { - setState(22); + setState(24); ((ConfigContext)_localctx).statement = statement(); _localctx.ret.addEntry(((ConfigContext)_localctx).statement.ret); } break; case 2: { - setState(25); + setState(27); ((ConfigContext)_localctx).block = block(); _localctx.ret.addEntry(((ConfigContext)_localctx).block.ret); } break; case 3: { - setState(28); + setState(30); ((ConfigContext)_localctx).Comment = match(Comment); _localctx.ret.addEntry(new NgxComment((((ConfigContext)_localctx).Comment!=null?((ConfigContext)_localctx).Comment.getText():null))); } break; } } - setState(32); + setState(34); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << Value) | (1L << Comment) | (1L << REGEXP_PREFIXED))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << Comment) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0) ); } } catch (RecognitionException re) { @@ -226,25 +226,25 @@ public final StatementContext statement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(43); + setState(45); switch (_input.LA(1)) { case T__9: { - setState(34); + setState(36); ((StatementContext)_localctx).rewriteStatement = rewriteStatement(); ((StatementContext)_localctx).ret = ((StatementContext)_localctx).rewriteStatement.ret; } break; case Value: { - setState(37); + setState(39); ((StatementContext)_localctx).genericStatement = genericStatement(); ((StatementContext)_localctx).ret = ((StatementContext)_localctx).genericStatement.ret; } break; case REGEXP_PREFIXED: { - setState(40); + setState(42); ((StatementContext)_localctx).regexHeaderStatement = regexHeaderStatement(); ((StatementContext)_localctx).ret = ((StatementContext)_localctx).regexHeaderStatement.ret; } @@ -252,7 +252,7 @@ public final StatementContext statement() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(45); + setState(47); match(T__0); } } @@ -270,11 +270,16 @@ public final StatementContext statement() throws RecognitionException { public static class GenericStatementContext extends ParserRuleContext { public NgxParam ret; public Token Value; - public RegexpContext r; + public Token REGEXP_PREFIXED; + public RegexpContext regexp; public List Value() { return getTokens(NginxParser.Value); } public TerminalNode Value(int i) { return getToken(NginxParser.Value, i); } + public List REGEXP_PREFIXED() { return getTokens(NginxParser.REGEXP_PREFIXED); } + public TerminalNode REGEXP_PREFIXED(int i) { + return getToken(NginxParser.REGEXP_PREFIXED, i); + } public List regexp() { return getRuleContexts(RegexpContext.class); } @@ -308,34 +313,41 @@ public final GenericStatementContext genericStatement() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(47); + setState(49); ((GenericStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((GenericStatementContext)_localctx).Value!=null?((GenericStatementContext)_localctx).Value.getText():null)); - setState(56); + setState(60); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0)) { { - setState(54); + setState(58); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { case 1: { - setState(49); + setState(51); ((GenericStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((GenericStatementContext)_localctx).Value!=null?((GenericStatementContext)_localctx).Value.getText():null)); } break; case 2: { - setState(51); - ((GenericStatementContext)_localctx).r = regexp(); - _localctx.ret.addValue(((GenericStatementContext)_localctx).r.ret); + setState(53); + ((GenericStatementContext)_localctx).REGEXP_PREFIXED = match(REGEXP_PREFIXED); + _localctx.ret.addValue((((GenericStatementContext)_localctx).REGEXP_PREFIXED!=null?((GenericStatementContext)_localctx).REGEXP_PREFIXED.getText():null)); + } + break; + case 3: + { + setState(55); + ((GenericStatementContext)_localctx).regexp = regexp(); + _localctx.ret.addValue(((GenericStatementContext)_localctx).regexp.ret); } break; } } - setState(58); + setState(62); _errHandler.sync(this); _la = _input.LA(1); } @@ -384,10 +396,10 @@ public final RegexHeaderStatementContext regexHeaderStatement() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(59); + setState(63); ((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED = match(REGEXP_PREFIXED); _localctx.ret.addValue((((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED!=null?((RegexHeaderStatementContext)_localctx).REGEXP_PREFIXED.getText():null)); - setState(61); + setState(65); ((RegexHeaderStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RegexHeaderStatementContext)_localctx).Value!=null?((RegexHeaderStatementContext)_localctx).Value.getText():null)); } @@ -466,18 +478,18 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(70); + setState(74); switch (_input.LA(1)) { case T__8: { - setState(64); + setState(68); ((BlockContext)_localctx).locationBlockHeader = locationBlockHeader(); _localctx.ret.getTokens().addAll(((BlockContext)_localctx).locationBlockHeader.ret); } break; case Value: { - setState(67); + setState(71); ((BlockContext)_localctx).genericBlockHeader = genericBlockHeader(); _localctx.ret.getTokens().addAll(((BlockContext)_localctx).genericBlockHeader.ret); } @@ -485,60 +497,60 @@ public final BlockContext block() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(73); + setState(77); _la = _input.LA(1); if (_la==Comment) { { - setState(72); + setState(76); ((BlockContext)_localctx).Comment = match(Comment); } } - setState(75); + setState(79); match(T__1); - setState(89); + setState(93); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << Value) | (1L << Comment) | (1L << REGEXP_PREFIXED))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << Comment) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0)) { { - setState(87); + setState(91); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { - setState(76); + setState(80); ((BlockContext)_localctx).statement = statement(); _localctx.ret.addEntry(((BlockContext)_localctx).statement.ret); } break; case 2: { - setState(79); + setState(83); ((BlockContext)_localctx).b = block(); _localctx.ret.addEntry(((BlockContext)_localctx).b.ret); } break; case 3: { - setState(82); + setState(86); ((BlockContext)_localctx).if_statement = if_statement(); _localctx.ret.addEntry(((BlockContext)_localctx).if_statement.ret); } break; case 4: { - setState(85); + setState(89); ((BlockContext)_localctx).Comment = match(Comment); _localctx.ret.addEntry(new NgxComment((((BlockContext)_localctx).Comment!=null?((BlockContext)_localctx).Comment.getText():null))); } break; } } - setState(91); + setState(95); _errHandler.sync(this); _la = _input.LA(1); } - setState(92); + setState(96); match(T__2); } } @@ -594,34 +606,34 @@ public final GenericBlockHeaderContext genericBlockHeader() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(94); + setState(98); ((GenericBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((GenericBlockHeaderContext)_localctx).Value!=null?((GenericBlockHeaderContext)_localctx).Value.getText():null))); - setState(103); + setState(107); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__7) | (1L << Value))) != 0)) { { - setState(101); + setState(105); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { case 1: { - setState(96); + setState(100); ((GenericBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((GenericBlockHeaderContext)_localctx).Value!=null?((GenericBlockHeaderContext)_localctx).Value.getText():null))); } break; case 2: { - setState(98); + setState(102); ((GenericBlockHeaderContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((GenericBlockHeaderContext)_localctx).regexp.ret)); } break; } } - setState(105); + setState(109); _errHandler.sync(this); _la = _input.LA(1); } @@ -680,39 +692,39 @@ public final If_statementContext if_statement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(106); + setState(110); ((If_statementContext)_localctx).id = match(T__3); _localctx.ret.addValue(new NgxToken((((If_statementContext)_localctx).id!=null?((If_statementContext)_localctx).id.getText():null))); - setState(108); + setState(112); ((If_statementContext)_localctx).if_body = if_body(); _localctx.ret.getTokens().addAll(((If_statementContext)_localctx).if_body.ret); - setState(111); + setState(115); _la = _input.LA(1); if (_la==Comment) { { - setState(110); + setState(114); match(Comment); } } - setState(113); + setState(117); match(T__1); - setState(119); + setState(123); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__9) | (1L << Value) | (1L << REGEXP_PREFIXED))) != 0)) { { { - setState(114); + setState(118); ((If_statementContext)_localctx).statement = statement(); _localctx.ret.addEntry(((If_statementContext)_localctx).statement.ret); } } - setState(121); + setState(125); _errHandler.sync(this); _la = _input.LA(1); } - setState(122); + setState(126); match(T__2); } } @@ -764,41 +776,41 @@ public final If_bodyContext if_body() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(124); + setState(128); match(T__4); - setState(125); + setState(129); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); - setState(129); + setState(133); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(127); + setState(131); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); } break; } - setState(136); + setState(140); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(131); + setState(135); ((If_bodyContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((If_bodyContext)_localctx).Value!=null?((If_bodyContext)_localctx).Value.getText():null))); } break; case 2: { - setState(133); + setState(137); ((If_bodyContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((If_bodyContext)_localctx).regexp.ret)); } break; } - setState(138); + setState(142); match(T__5); } } @@ -817,16 +829,16 @@ public static class RegexpContext extends ParserRuleContext { public String ret; public Token id; public Token Value; - public RegexpContext r; + public ExpContext r; public List Value() { return getTokens(NginxParser.Value); } public TerminalNode Value(int i) { return getToken(NginxParser.Value, i); } - public List regexp() { - return getRuleContexts(RegexpContext.class); + public List exp() { + return getRuleContexts(ExpContext.class); } - public RegexpContext regexp(int i) { - return getRuleContext(RegexpContext.class,i); + public ExpContext exp(int i) { + return getRuleContext(ExpContext.class,i); } public RegexpContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -855,45 +867,41 @@ public final RegexpContext regexp() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(151); + setState(153); _errHandler.sync(this); _alt = 1; do { switch (_alt) { case 1: { - setState(151); + setState(153); switch (_input.LA(1)) { case T__6: { - setState(140); + setState(144); ((RegexpContext)_localctx).id = match(T__6); _localctx.ret += (((RegexpContext)_localctx).id!=null?((RegexpContext)_localctx).id.getText():null); } break; case T__7: { - setState(142); + setState(146); ((RegexpContext)_localctx).id = match(T__7); _localctx.ret += (((RegexpContext)_localctx).id!=null?((RegexpContext)_localctx).id.getText():null); } break; case Value: { - setState(144); + setState(148); ((RegexpContext)_localctx).Value = match(Value); _localctx.ret += (((RegexpContext)_localctx).Value!=null?((RegexpContext)_localctx).Value.getText():null); } break; case T__4: { - setState(146); - match(T__4); - setState(147); - ((RegexpContext)_localctx).r = regexp(); - _localctx.ret += "(".concat(((RegexpContext)_localctx).r.ret).concat(")"); - setState(149); - match(T__5); + setState(150); + ((RegexpContext)_localctx).r = exp(); + _localctx.ret += ((RegexpContext)_localctx).r.ret; } break; default: @@ -904,7 +912,7 @@ public final RegexpContext regexp() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(153); + setState(155); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -921,6 +929,95 @@ public final RegexpContext regexp() throws RecognitionException { return _localctx; } + public static class ExpContext extends ParserRuleContext { + public String ret; + public RegexpContext r; + public Token id; + public List regexp() { + return getRuleContexts(RegexpContext.class); + } + public RegexpContext regexp(int i) { + return getRuleContext(RegexpContext.class,i); + } + public ExpContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exp; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof NginxListener ) ((NginxListener)listener).enterExp(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof NginxListener ) ((NginxListener)listener).exitExp(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof NginxVisitor ) return ((NginxVisitor)visitor).visitExp(this); + else return visitor.visitChildren(this); + } + } + + public final ExpContext exp() throws RecognitionException { + ExpContext _localctx = new ExpContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_exp); + ((ExpContext)_localctx).ret = ""; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(157); + match(T__4); + setState(165); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,18,_ctx); + while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1+1 ) { + { + setState(163); + switch (_input.LA(1)) { + case T__4: + case T__6: + case T__7: + case Value: + { + setState(158); + ((ExpContext)_localctx).r = regexp(); + _localctx.ret += ((ExpContext)_localctx).r.ret; + } + break; + case T__0: + { + setState(161); + ((ExpContext)_localctx).id = match(T__0); + _localctx.ret += (((ExpContext)_localctx).id!=null?((ExpContext)_localctx).id.getText():null); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + setState(167); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,18,_ctx); + } + setState(168); + match(T__5); + ((ExpContext)_localctx).ret = "(".concat(_localctx.ret).concat(")"); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class LocationBlockHeaderContext extends ParserRuleContext { public List ret; public Token id; @@ -954,38 +1051,38 @@ public T accept(ParseTreeVisitor visitor) { public final LocationBlockHeaderContext locationBlockHeader() throws RecognitionException { LocationBlockHeaderContext _localctx = new LocationBlockHeaderContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_locationBlockHeader); + enterRule(_localctx, 20, RULE_locationBlockHeader); ((LocationBlockHeaderContext)_localctx).ret = new ArrayList(); try { enterOuterAlt(_localctx, 1); { - setState(155); + setState(171); ((LocationBlockHeaderContext)_localctx).id = match(T__8); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).id!=null?((LocationBlockHeaderContext)_localctx).id.getText():null))); - setState(159); + setState(175); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: { - setState(157); + setState(173); ((LocationBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).Value!=null?((LocationBlockHeaderContext)_localctx).Value.getText():null))); } break; } - setState(166); + setState(182); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: { - setState(161); + setState(177); ((LocationBlockHeaderContext)_localctx).Value = match(Value); _localctx.ret.add(new NgxToken((((LocationBlockHeaderContext)_localctx).Value!=null?((LocationBlockHeaderContext)_localctx).Value.getText():null))); } break; case 2: { - setState(163); + setState(179); ((LocationBlockHeaderContext)_localctx).regexp = regexp(); _localctx.ret.add(new NgxToken(((LocationBlockHeaderContext)_localctx).regexp.ret)); } @@ -1038,41 +1135,41 @@ public T accept(ParseTreeVisitor visitor) { public final RewriteStatementContext rewriteStatement() throws RecognitionException { RewriteStatementContext _localctx = new RewriteStatementContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_rewriteStatement); + enterRule(_localctx, 22, RULE_rewriteStatement); ((RewriteStatementContext)_localctx).ret = new NgxParam(); int _la; try { enterOuterAlt(_localctx, 1); { - setState(168); + setState(184); ((RewriteStatementContext)_localctx).id = match(T__9); _localctx.ret.addValue((((RewriteStatementContext)_localctx).id!=null?((RewriteStatementContext)_localctx).id.getText():null)); - setState(175); + setState(191); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { case 1: { - setState(170); + setState(186); ((RewriteStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RewriteStatementContext)_localctx).Value!=null?((RewriteStatementContext)_localctx).Value.getText():null)); } break; case 2: { - setState(172); + setState(188); ((RewriteStatementContext)_localctx).regexp = regexp(); _localctx.ret.addValue(((RewriteStatementContext)_localctx).regexp.ret); } break; } - setState(177); + setState(193); ((RewriteStatementContext)_localctx).Value = match(Value); _localctx.ret.addValue((((RewriteStatementContext)_localctx).Value!=null?((RewriteStatementContext)_localctx).Value.getText():null)); - setState(181); + setState(197); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13))) != 0)) { { - setState(179); + setState(195); ((RewriteStatementContext)_localctx).opt = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13))) != 0)) ) { @@ -1098,61 +1195,68 @@ public final RewriteStatementContext rewriteStatement() throws RecognitionExcept } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\27\u00ba\4\2\t\2"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\27\u00ca\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\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\6\2!\n\2\r\2\16\2\"\3\3"+ - "\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\5\3.\n\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+ - "\3\4\3\4\7\49\n\4\f\4\16\4<\13\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\5\6I\n\6\3\6\5\6L\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\7\6Z\n\6\f\6\16\6]\13\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\7\7"+ - "h\n\7\f\7\16\7k\13\7\3\b\3\b\3\b\3\b\3\b\5\br\n\b\3\b\3\b\3\b\3\b\7\b"+ - "x\n\b\f\b\16\b{\13\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\5\t\u0084\n\t\3\t\3\t"+ - "\3\t\3\t\3\t\5\t\u008b\n\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+ - "\3\n\3\n\6\n\u009a\n\n\r\n\16\n\u009b\3\13\3\13\3\13\3\13\5\13\u00a2\n"+ - "\13\3\13\3\13\3\13\3\13\3\13\5\13\u00a9\n\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+ - "\f\5\f\u00b2\n\f\3\f\3\f\3\f\3\f\5\f\u00b8\n\f\3\f\2\2\r\2\4\6\b\n\f\16"+ - "\20\22\24\26\2\3\3\2\r\20\u00ca\2 \3\2\2\2\4-\3\2\2\2\6\61\3\2\2\2\b="+ - "\3\2\2\2\nH\3\2\2\2\f`\3\2\2\2\16l\3\2\2\2\20~\3\2\2\2\22\u0099\3\2\2"+ - "\2\24\u009d\3\2\2\2\26\u00aa\3\2\2\2\30\31\5\4\3\2\31\32\b\2\1\2\32!\3"+ - "\2\2\2\33\34\5\n\6\2\34\35\b\2\1\2\35!\3\2\2\2\36\37\7\23\2\2\37!\b\2"+ - "\1\2 \30\3\2\2\2 \33\3\2\2\2 \36\3\2\2\2!\"\3\2\2\2\" \3\2\2\2\"#\3\2"+ - "\2\2#\3\3\2\2\2$%\5\26\f\2%&\b\3\1\2&.\3\2\2\2\'(\5\6\4\2()\b\3\1\2)."+ - "\3\2\2\2*+\5\b\5\2+,\b\3\1\2,.\3\2\2\2-$\3\2\2\2-\'\3\2\2\2-*\3\2\2\2"+ - "./\3\2\2\2/\60\7\3\2\2\60\5\3\2\2\2\61\62\7\21\2\2\62:\b\4\1\2\63\64\7"+ - "\21\2\2\649\b\4\1\2\65\66\5\22\n\2\66\67\b\4\1\2\679\3\2\2\28\63\3\2\2"+ - "\28\65\3\2\2\29<\3\2\2\2:8\3\2\2\2:;\3\2\2\2;\7\3\2\2\2<:\3\2\2\2=>\7"+ - "\24\2\2>?\b\5\1\2?@\7\21\2\2@A\b\5\1\2A\t\3\2\2\2BC\5\24\13\2CD\b\6\1"+ - "\2DI\3\2\2\2EF\5\f\7\2FG\b\6\1\2GI\3\2\2\2HB\3\2\2\2HE\3\2\2\2IK\3\2\2"+ - "\2JL\7\23\2\2KJ\3\2\2\2KL\3\2\2\2LM\3\2\2\2M[\7\4\2\2NO\5\4\3\2OP\b\6"+ - "\1\2PZ\3\2\2\2QR\5\n\6\2RS\b\6\1\2SZ\3\2\2\2TU\5\16\b\2UV\b\6\1\2VZ\3"+ - "\2\2\2WX\7\23\2\2XZ\b\6\1\2YN\3\2\2\2YQ\3\2\2\2YT\3\2\2\2YW\3\2\2\2Z]"+ - "\3\2\2\2[Y\3\2\2\2[\\\3\2\2\2\\^\3\2\2\2][\3\2\2\2^_\7\5\2\2_\13\3\2\2"+ - "\2`a\7\21\2\2ai\b\7\1\2bc\7\21\2\2ch\b\7\1\2de\5\22\n\2ef\b\7\1\2fh\3"+ - "\2\2\2gb\3\2\2\2gd\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2j\r\3\2\2\2ki"+ - "\3\2\2\2lm\7\6\2\2mn\b\b\1\2no\5\20\t\2oq\b\b\1\2pr\7\23\2\2qp\3\2\2\2"+ - "qr\3\2\2\2rs\3\2\2\2sy\7\4\2\2tu\5\4\3\2uv\b\b\1\2vx\3\2\2\2wt\3\2\2\2"+ - "x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z|\3\2\2\2{y\3\2\2\2|}\7\5\2\2}\17\3\2\2"+ - "\2~\177\7\7\2\2\177\u0080\7\21\2\2\u0080\u0083\b\t\1\2\u0081\u0082\7\21"+ - "\2\2\u0082\u0084\b\t\1\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084"+ - "\u008a\3\2\2\2\u0085\u0086\7\21\2\2\u0086\u008b\b\t\1\2\u0087\u0088\5"+ - "\22\n\2\u0088\u0089\b\t\1\2\u0089\u008b\3\2\2\2\u008a\u0085\3\2\2\2\u008a"+ - "\u0087\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u008d\7\b"+ - "\2\2\u008d\21\3\2\2\2\u008e\u008f\7\t\2\2\u008f\u009a\b\n\1\2\u0090\u0091"+ - "\7\n\2\2\u0091\u009a\b\n\1\2\u0092\u0093\7\21\2\2\u0093\u009a\b\n\1\2"+ - "\u0094\u0095\7\7\2\2\u0095\u0096\5\22\n\2\u0096\u0097\b\n\1\2\u0097\u0098"+ - "\7\b\2\2\u0098\u009a\3\2\2\2\u0099\u008e\3\2\2\2\u0099\u0090\3\2\2\2\u0099"+ - "\u0092\3\2\2\2\u0099\u0094\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u0099\3\2"+ - "\2\2\u009b\u009c\3\2\2\2\u009c\23\3\2\2\2\u009d\u009e\7\13\2\2\u009e\u00a1"+ - "\b\13\1\2\u009f\u00a0\7\21\2\2\u00a0\u00a2\b\13\1\2\u00a1\u009f\3\2\2"+ - "\2\u00a1\u00a2\3\2\2\2\u00a2\u00a8\3\2\2\2\u00a3\u00a4\7\21\2\2\u00a4"+ - "\u00a9\b\13\1\2\u00a5\u00a6\5\22\n\2\u00a6\u00a7\b\13\1\2\u00a7\u00a9"+ - "\3\2\2\2\u00a8\u00a3\3\2\2\2\u00a8\u00a5\3\2\2\2\u00a9\25\3\2\2\2\u00aa"+ - "\u00ab\7\f\2\2\u00ab\u00b1\b\f\1\2\u00ac\u00ad\7\21\2\2\u00ad\u00b2\b"+ - "\f\1\2\u00ae\u00af\5\22\n\2\u00af\u00b0\b\f\1\2\u00b0\u00b2\3\2\2\2\u00b1"+ - "\u00ac\3\2\2\2\u00b1\u00ae\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\7\21"+ - "\2\2\u00b4\u00b7\b\f\1\2\u00b5\u00b6\t\2\2\2\u00b6\u00b8\b\f\1\2\u00b7"+ - "\u00b5\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\27\3\2\2\2\27 \"-8:HKY[giqy\u0083"+ - "\u008a\u0099\u009b\u00a1\u00a8\u00b1\u00b7"; + "\t\13\4\f\t\f\4\r\t\r\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\6\2#\n\2\r\2\16"+ + "\2$\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\5\3\60\n\3\3\3\3\3\3\4\3\4\3\4"+ + "\3\4\3\4\3\4\3\4\3\4\3\4\7\4=\n\4\f\4\16\4@\13\4\3\5\3\5\3\5\3\5\3\5\3"+ + "\6\3\6\3\6\3\6\3\6\3\6\5\6M\n\6\3\6\5\6P\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ + "\6\3\6\3\6\3\6\3\6\3\6\7\6^\n\6\f\6\16\6a\13\6\3\6\3\6\3\7\3\7\3\7\3\7"+ + "\3\7\3\7\3\7\7\7l\n\7\f\7\16\7o\13\7\3\b\3\b\3\b\3\b\3\b\5\bv\n\b\3\b"+ + "\3\b\3\b\3\b\7\b|\n\b\f\b\16\b\177\13\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\5"+ + "\t\u0088\n\t\3\t\3\t\3\t\3\t\3\t\5\t\u008f\n\t\3\t\3\t\3\n\3\n\3\n\3\n"+ + "\3\n\3\n\3\n\3\n\3\n\6\n\u009c\n\n\r\n\16\n\u009d\3\13\3\13\3\13\3\13"+ + "\3\13\3\13\7\13\u00a6\n\13\f\13\16\13\u00a9\13\13\3\13\3\13\3\13\3\f\3"+ + "\f\3\f\3\f\5\f\u00b2\n\f\3\f\3\f\3\f\3\f\3\f\5\f\u00b9\n\f\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\5\r\u00c2\n\r\3\r\3\r\3\r\3\r\5\r\u00c8\n\r\3\r\3\u00a7"+ + "\2\16\2\4\6\b\n\f\16\20\22\24\26\30\2\3\3\2\r\20\u00dc\2\"\3\2\2\2\4/"+ + "\3\2\2\2\6\63\3\2\2\2\bA\3\2\2\2\nL\3\2\2\2\fd\3\2\2\2\16p\3\2\2\2\20"+ + "\u0082\3\2\2\2\22\u009b\3\2\2\2\24\u009f\3\2\2\2\26\u00ad\3\2\2\2\30\u00ba"+ + "\3\2\2\2\32\33\5\4\3\2\33\34\b\2\1\2\34#\3\2\2\2\35\36\5\n\6\2\36\37\b"+ + "\2\1\2\37#\3\2\2\2 !\7\21\2\2!#\b\2\1\2\"\32\3\2\2\2\"\35\3\2\2\2\" \3"+ + "\2\2\2#$\3\2\2\2$\"\3\2\2\2$%\3\2\2\2%\3\3\2\2\2&\'\5\30\r\2\'(\b\3\1"+ + "\2(\60\3\2\2\2)*\5\6\4\2*+\b\3\1\2+\60\3\2\2\2,-\5\b\5\2-.\b\3\1\2.\60"+ + "\3\2\2\2/&\3\2\2\2/)\3\2\2\2/,\3\2\2\2\60\61\3\2\2\2\61\62\7\3\2\2\62"+ + "\5\3\2\2\2\63\64\7\22\2\2\64>\b\4\1\2\65\66\7\22\2\2\66=\b\4\1\2\678\7"+ + "\24\2\28=\b\4\1\29:\5\22\n\2:;\b\4\1\2;=\3\2\2\2<\65\3\2\2\2<\67\3\2\2"+ + "\2<9\3\2\2\2=@\3\2\2\2><\3\2\2\2>?\3\2\2\2?\7\3\2\2\2@>\3\2\2\2AB\7\24"+ + "\2\2BC\b\5\1\2CD\7\22\2\2DE\b\5\1\2E\t\3\2\2\2FG\5\26\f\2GH\b\6\1\2HM"+ + "\3\2\2\2IJ\5\f\7\2JK\b\6\1\2KM\3\2\2\2LF\3\2\2\2LI\3\2\2\2MO\3\2\2\2N"+ + "P\7\21\2\2ON\3\2\2\2OP\3\2\2\2PQ\3\2\2\2Q_\7\4\2\2RS\5\4\3\2ST\b\6\1\2"+ + "T^\3\2\2\2UV\5\n\6\2VW\b\6\1\2W^\3\2\2\2XY\5\16\b\2YZ\b\6\1\2Z^\3\2\2"+ + "\2[\\\7\21\2\2\\^\b\6\1\2]R\3\2\2\2]U\3\2\2\2]X\3\2\2\2][\3\2\2\2^a\3"+ + "\2\2\2_]\3\2\2\2_`\3\2\2\2`b\3\2\2\2a_\3\2\2\2bc\7\5\2\2c\13\3\2\2\2d"+ + "e\7\22\2\2em\b\7\1\2fg\7\22\2\2gl\b\7\1\2hi\5\22\n\2ij\b\7\1\2jl\3\2\2"+ + "\2kf\3\2\2\2kh\3\2\2\2lo\3\2\2\2mk\3\2\2\2mn\3\2\2\2n\r\3\2\2\2om\3\2"+ + "\2\2pq\7\6\2\2qr\b\b\1\2rs\5\20\t\2su\b\b\1\2tv\7\21\2\2ut\3\2\2\2uv\3"+ + "\2\2\2vw\3\2\2\2w}\7\4\2\2xy\5\4\3\2yz\b\b\1\2z|\3\2\2\2{x\3\2\2\2|\177"+ + "\3\2\2\2}{\3\2\2\2}~\3\2\2\2~\u0080\3\2\2\2\177}\3\2\2\2\u0080\u0081\7"+ + "\5\2\2\u0081\17\3\2\2\2\u0082\u0083\7\7\2\2\u0083\u0084\7\22\2\2\u0084"+ + "\u0087\b\t\1\2\u0085\u0086\7\22\2\2\u0086\u0088\b\t\1\2\u0087\u0085\3"+ + "\2\2\2\u0087\u0088\3\2\2\2\u0088\u008e\3\2\2\2\u0089\u008a\7\22\2\2\u008a"+ + "\u008f\b\t\1\2\u008b\u008c\5\22\n\2\u008c\u008d\b\t\1\2\u008d\u008f\3"+ + "\2\2\2\u008e\u0089\3\2\2\2\u008e\u008b\3\2\2\2\u008e\u008f\3\2\2\2\u008f"+ + "\u0090\3\2\2\2\u0090\u0091\7\b\2\2\u0091\21\3\2\2\2\u0092\u0093\7\t\2"+ + "\2\u0093\u009c\b\n\1\2\u0094\u0095\7\n\2\2\u0095\u009c\b\n\1\2\u0096\u0097"+ + "\7\22\2\2\u0097\u009c\b\n\1\2\u0098\u0099\5\24\13\2\u0099\u009a\b\n\1"+ + "\2\u009a\u009c\3\2\2\2\u009b\u0092\3\2\2\2\u009b\u0094\3\2\2\2\u009b\u0096"+ + "\3\2\2\2\u009b\u0098\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u009b\3\2\2\2\u009d"+ + "\u009e\3\2\2\2\u009e\23\3\2\2\2\u009f\u00a7\7\7\2\2\u00a0\u00a1\5\22\n"+ + "\2\u00a1\u00a2\b\13\1\2\u00a2\u00a6\3\2\2\2\u00a3\u00a4\7\3\2\2\u00a4"+ + "\u00a6\b\13\1\2\u00a5\u00a0\3\2\2\2\u00a5\u00a3\3\2\2\2\u00a6\u00a9\3"+ + "\2\2\2\u00a7\u00a8\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a8\u00aa\3\2\2\2\u00a9"+ + "\u00a7\3\2\2\2\u00aa\u00ab\7\b\2\2\u00ab\u00ac\b\13\1\2\u00ac\25\3\2\2"+ + "\2\u00ad\u00ae\7\13\2\2\u00ae\u00b1\b\f\1\2\u00af\u00b0\7\22\2\2\u00b0"+ + "\u00b2\b\f\1\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b8\3\2"+ + "\2\2\u00b3\u00b4\7\22\2\2\u00b4\u00b9\b\f\1\2\u00b5\u00b6\5\22\n\2\u00b6"+ + "\u00b7\b\f\1\2\u00b7\u00b9\3\2\2\2\u00b8\u00b3\3\2\2\2\u00b8\u00b5\3\2"+ + "\2\2\u00b9\27\3\2\2\2\u00ba\u00bb\7\f\2\2\u00bb\u00c1\b\r\1\2\u00bc\u00bd"+ + "\7\22\2\2\u00bd\u00c2\b\r\1\2\u00be\u00bf\5\22\n\2\u00bf\u00c0\b\r\1\2"+ + "\u00c0\u00c2\3\2\2\2\u00c1\u00bc\3\2\2\2\u00c1\u00be\3\2\2\2\u00c2\u00c3"+ + "\3\2\2\2\u00c3\u00c4\7\22\2\2\u00c4\u00c7\b\r\1\2\u00c5\u00c6\t\2\2\2"+ + "\u00c6\u00c8\b\r\1\2\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\31"+ + "\3\2\2\2\31\"$/<>LO]_kmu}\u0087\u008e\u009b\u009d\u00a5\u00a7\u00b1\u00b8"+ + "\u00c1\u00c7"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxVisitor.java b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxVisitor.java index d7e3666..2e4200b 100644 --- a/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxVisitor.java +++ b/src/main/java/com/github/odiszapc/nginxparser/antlr/NginxVisitor.java @@ -67,6 +67,12 @@ public interface NginxVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitRegexp(NginxParser.RegexpContext ctx); + /** + * Visit a parse tree produced by {@link NginxParser#exp}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExp(NginxParser.ExpContext ctx); /** * Visit a parse tree produced by {@link NginxParser#locationBlockHeader}. * @param ctx the parse tree diff --git a/src/main/resources/grammar/Nginx.g4 b/src/main/resources/grammar/Nginx.g4 index 2e35262..a25bb14 100644 --- a/src/main/resources/grammar/Nginx.g4 +++ b/src/main/resources/grammar/Nginx.g4 @@ -37,7 +37,9 @@ genericStatement returns [NgxParam ret] ( Value { $ret.addValue($Value.text); } | - r=regexp { $ret.addValue($r.ret); } + REGEXP_PREFIXED { $ret.addValue($REGEXP_PREFIXED.text); } + | + regexp { $ret.addValue($regexp.ret); } )* ; @@ -114,9 +116,15 @@ regexp returns [String ret] id='\\.' { $ret += $id.text; } | id='^' { $ret += $id.text; } | Value { $ret += $Value.text; } - | '(' r=regexp { $ret += "(".concat($r.ret).concat(")"); } ')' + | r=exp { $ret += $r.ret; } )+; +exp returns [String ret] +@init { $ret = ""; } +: + '(' (r=regexp { $ret += $r.ret; } | id=';' { $ret += $id.text; })*? ')' { $ret = "(".concat($ret).concat(")"); } +; + locationBlockHeader returns [List ret] @init { $ret = new ArrayList(); } : @@ -140,20 +148,20 @@ rewriteStatement returns [NgxParam ret] //QUOTED_STRING //: '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"'; +// '#'priority Comment>Value +Comment + : + '#' ~[\r\n]*; Value: STR_EXT | QUOTED_STRING | SINGLE_QUOTED ; STR_EXT : - ([a-zA-Z0-9_/\.,\-:=~+!?$&^*\[\]@|#] | NON_ASCII)+; - -Comment - : - '#' ~[\r\n]*; + ([a-zA-Z0-9_/\\<>.,\-:=~+!?$&^*[\]@|#] | NON_ASCII)+; REGEXP_PREFIXED - : (RegexpPrefix)[a-zA-Z0-9_/\.,\-:=~+!?$&^*\[\]@|#)(]+ + : (RegexpPrefix)[a-zA-Z0-9_/\\<>.,\-:=~+!?$&^*[\]@|#)(]+ ; QUOTED_STRING diff --git a/src/test/java/com/github/odiszapc/nginxparser/ComplexTest.java b/src/test/java/com/github/odiszapc/nginxparser/ComplexTest.java index bd3362c..032157b 100644 --- a/src/test/java/com/github/odiszapc/nginxparser/ComplexTest.java +++ b/src/test/java/com/github/odiszapc/nginxparser/ComplexTest.java @@ -1,7 +1,6 @@ package com.github.odiszapc.nginxparser; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import java.util.Iterator; @@ -60,7 +59,6 @@ public void mapWithRegexps() throws Exception { } @Test - @Ignore("Semicolon is broken") public void semicolon() throws Exception { final NgxConfig parsedConfig = parse("complex/semicolon.conf"); NgxDumper ngxDumper = new NgxDumper(parsedConfig); @@ -72,4 +70,16 @@ public void semicolon() throws Exception { Assert.assertEquals(1, loc.getEntries().size()); Assert.assertFalse(it.hasNext()); } + + @Test + public void issues11() throws Exception { + final NgxConfig parsedConfig = parse("complex/issues_11.conf"); + NgxDumper ngxDumper = new NgxDumper(parsedConfig); + ngxDumper.dump(System.out); + + Iterator it = parsedConfig.getEntries().iterator(); + TestUtils.assertParam(it.next(), "proxy_redirect", "~^(http://[^:]+):\\d+(/.+)$", "$1$2"); + it.next();it.next(); + TestUtils.assertParam(it.next(), "server_name", "~^(?.+)\\.example\\.com$"); + } } diff --git a/src/test/java/com/github/odiszapc/nginxparser/TestUtils.java b/src/test/java/com/github/odiszapc/nginxparser/TestUtils.java index 707ac92..e955873 100644 --- a/src/test/java/com/github/odiszapc/nginxparser/TestUtils.java +++ b/src/test/java/com/github/odiszapc/nginxparser/TestUtils.java @@ -47,7 +47,7 @@ public static void assertParam(NgxEntry entry, String name, String... values) { Iterator it = ((NgxParam) entry).getValues().iterator(); for (String value : values) { - Assert.assertEquals(it.next(), value); + Assert.assertEquals(it.next().replaceAll("\r\n?","\n"), value); } } diff --git a/src/test/resources/complex/issues_11.conf b/src/test/resources/complex/issues_11.conf new file mode 100644 index 0000000..f2f9ead --- /dev/null +++ b/src/test/resources/complex/issues_11.conf @@ -0,0 +1,4 @@ +proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2; +# +## +server_name ~^(?.+)\.example\.com$; \ No newline at end of file