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##%&((,?Aac|~~\u0080\u0080\4\2\f\f\17\17\13\2##%&((*?Aac|~~\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\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 extends T> visitor) {
+ if ( visitor instanceof NginxVisitor ) return ((NginxVisitor extends T>)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 extends T> 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 extends T> 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