Skip to content

Commit 00f5a96

Browse files
committed
wip2
1 parent 4ce9cf7 commit 00f5a96

11 files changed

+1887
-0
lines changed

antlr4/CwlEcmaStringLexer.g4

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
lexer grammar CwlEcmaStringLexer;
2+
3+
ANYCHAR: .;
4+
DOLLARPAREN: '$(' -> pushMode(ParenExpr);
5+
LPAREN: '(';
6+
RPAREN: ')';
7+
DOLLARBRACE: '${' -> pushMode(BraceExpr);
8+
LBRACE: '{';
9+
RBRACE: '}';
10+
DOLLARPARENESC: '\\$(';
11+
DOLLARBRACEESC: '\\${';
12+
BACKSLASH: '\\';
13+
BACKSLASHESC: '\\\\';
14+
15+
mode ParenExpr;
16+
17+
EscPart: BACKSLASH ANYCHAR;
18+
SubExprStart: LPAREN -> pushMode(SubExpr);
19+
ExprEnd: RPAREN -> popMode;
20+
ExprPart: ~[)];
21+
22+
mode SubExpr;
23+
24+
SubEscPart: BACKSLASH ANYCHAR -> type(SubExprPart);
25+
SubSubExprStart: LPAREN -> pushMode(SubExpr);
26+
SubExprEnd: RPAREN -> popMode;
27+
SubExprPart: ~[)];
28+
29+
mode BraceExpr;
30+
31+
BraceEscPart: BACKSLASH ANYCHAR -> type(EscPart);
32+
BraceSubExprStart: LBRACE -> pushMode(BraceSubExpr), type(SubExprStart);
33+
BraceExprEnd: RBRACE -> popMode, type(ExprEnd);
34+
BraceExprPart: ~[}] -> type(ExprPart);
35+
36+
mode BraceSubExpr;
37+
38+
BraceSubEscPart: BACKSLASH ANYCHAR -> type(SubExprPart);
39+
BraceSubSubExprStart: LBRACE -> pushMode(BraceSubExpr), type(SubSubExprStart);
40+
BraceSubExprEnd: RBRACE -> popMode, type(SubExprEnd);
41+
BraceSubExprPart: ~[}] -> type(SubExprPart);

antlr4/CwlEcmaStringParser.g4

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
parser grammar CwlEcmaStringParser;
2+
3+
options {
4+
tokenVocab=CwlEcmaStringLexer;
5+
}
6+
7+
sub_sub_expr
8+
: SubSubExprStart sub_expr_part* SubExprEnd
9+
;
10+
11+
sub_expr_part
12+
: SubExprPart
13+
| sub_sub_expr
14+
;
15+
16+
sub_expr
17+
: SubExprStart sub_expr_part* SubExprEnd
18+
;
19+
20+
expr_part
21+
: ExprPart
22+
| EscPart
23+
| sub_expr
24+
;
25+
26+
paren_expr
27+
: DOLLARPAREN expr_part+ ExprEnd
28+
;
29+
30+
brace_expr
31+
: DOLLARBRACE expr_part+ ExprEnd
32+
;
33+
34+
interpolated_string_part
35+
: BACKSLASHESC
36+
| DOLLARPARENESC
37+
| DOLLARBRACEESC
38+
| paren_expr
39+
| brace_expr
40+
| ANYCHAR
41+
;
42+
43+
interpolated_string
44+
: interpolated_string_part+
45+
;

antlr4/CwlParameterReferenceLexer.g4

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
lexer grammar CwlParameterReferenceLexer;
2+
3+
DOT: '.';
4+
LBRACKET: '[';
5+
RBRACKET: ']';
6+
DOLLARPAREN: '$(' -> pushMode(ParenExpr);
7+
RPAREN: ')';
8+
DOLLARPARENESC: '\\$(';
9+
BACKSLASH: '\\';
10+
BACKSLASHESC: '\\\\';
11+
ANYCHAR: .;
12+
LBRACKETSINGLEQ: '[\'';
13+
LBRACKETDOUBLEQ: '["';
14+
SINGLEQRBRACKET: '\']';
15+
DOUBLEQRBRACKET: '"]';
16+
17+
mode ParenExpr;
18+
19+
ExprDot: DOT;
20+
ExprSymbol: CompleteSymbol;
21+
ExprSingleQ: LBRACKETSINGLEQ -> pushMode(SingleQString);
22+
ExprDoubleQ: LBRACKETDOUBLEQ -> pushMode(DoubleQString);
23+
ExprIntIndex: LBRACKET -> pushMode(IntIndex);
24+
EndParenExpr: RPAREN -> popMode;
25+
26+
mode SingleQString;
27+
28+
StringIndexEscPart: BACKSLASH ANYCHAR;
29+
EndSingleQ: SINGLEQRBRACKET -> popMode, type(ExprSingleQ);
30+
StringIndexPart: ~[\\']+;
31+
LiteralBackslash: BACKSLASH -> type(StringIndexPart);
32+
33+
mode DoubleQString;
34+
35+
DoubleQEscapedChar: BACKSLASH ANYCHAR -> type(StringIndexEscPart);
36+
EndDoubleQ: DOUBLEQRBRACKET -> popMode, type(ExprDoubleQ);
37+
DoubleQStringIndexPart: ~[\\"]+ -> type(StringIndexPart);
38+
DoubleQLiteralBackslash: BACKSLASH -> type(StringIndexPart);
39+
40+
mode IntIndex;
41+
42+
EndIndex: RBRACKET -> popMode, type(ExprIntIndex);
43+
IntIndexPart: DecimalNumber;
44+
45+
fragment CompleteSymbol
46+
: SymbolStart SymbolFollow*
47+
;
48+
49+
fragment SymbolStart
50+
: [a-zA-Z]
51+
;
52+
53+
fragment SymbolFollow
54+
: [a-zA-Z0-9_]+
55+
;
56+
57+
fragment DecimalNumber
58+
: DecimalDigit+
59+
;
60+
61+
fragment DecimalDigit
62+
: [0-9]
63+
;
64+
65+
fragment HexDigit
66+
: [0-9a-fA-F]
67+
;

antlr4/CwlParameterReferenceParser.g4

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
parser grammar CwlParameterReferenceParser;
2+
3+
options {
4+
tokenVocab=CwlParameterReferenceLexer;
5+
}
6+
7+
expr_dot_symbol
8+
: ExprDot ExprSymbol
9+
;
10+
11+
int_index
12+
: ExprIntIndex IntIndexPart ExprIntIndex
13+
;
14+
15+
string_index_part
16+
: StringIndexPart
17+
| StringIndexEscPart
18+
;
19+
20+
string_index
21+
: ExprSingleQ string_index_part+ ExprSingleQ
22+
| ExprDoubleQ string_index_part+ ExprDoubleQ
23+
;
24+
25+
expr_segment
26+
: expr_dot_symbol
27+
| int_index
28+
| string_index
29+
;
30+
31+
paren_expr
32+
: DOLLARPAREN ExprSymbol expr_segment* EndParenExpr
33+
;
34+
35+
interpolated_string_part
36+
: BACKSLASHESC
37+
| DOLLARPARENESC
38+
| paren_expr
39+
| ANYCHAR
40+
;
41+
42+
interpolated_string
43+
: interpolated_string_part+
44+
;
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# Generated from antlr4/CwlEcmaStringLexer.g4 by ANTLR 4.7.2
2+
from antlr4 import *
3+
from io import StringIO
4+
from typing.io import TextIO
5+
import sys
6+
7+
8+
def serializedATN():
9+
with StringIO() as buf:
10+
buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\24")
11+
buf.write("\u00a0\b\1\b\1\b\1\b\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5")
12+
buf.write("\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")
13+
buf.write("\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t")
14+
buf.write("\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26")
15+
buf.write("\4\27\t\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34")
16+
buf.write("\t\34\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6")
17+
buf.write("\3\6\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3")
18+
buf.write("\n\3\n\3\n\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16")
19+
buf.write("\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20\3\21\3\21\3\21")
20+
buf.write("\3\21\3\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\24")
21+
buf.write("\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26")
22+
buf.write("\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31")
23+
buf.write("\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33")
24+
buf.write("\3\33\3\33\3\34\3\34\3\34\3\34\2\2\35\7\3\t\4\13\5\r\6")
25+
buf.write("\17\7\21\b\23\t\25\n\27\13\31\f\33\r\35\16\37\17!\20#")
26+
buf.write("\21%\2\'\22)\23+\24-\2/\2\61\2\63\2\65\2\67\29\2;\2\7")
27+
buf.write("\2\3\4\5\6\4\3\2++\3\2\177\177\2\u009b\2\7\3\2\2\2\2\t")
28+
buf.write("\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")
29+
buf.write("\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")
30+
buf.write("\2\2\2\33\3\2\2\2\3\35\3\2\2\2\3\37\3\2\2\2\3!\3\2\2\2")
31+
buf.write("\3#\3\2\2\2\4%\3\2\2\2\4\'\3\2\2\2\4)\3\2\2\2\4+\3\2\2")
32+
buf.write("\2\5-\3\2\2\2\5/\3\2\2\2\5\61\3\2\2\2\5\63\3\2\2\2\6\65")
33+
buf.write("\3\2\2\2\6\67\3\2\2\2\69\3\2\2\2\6;\3\2\2\2\7=\3\2\2\2")
34+
buf.write("\t?\3\2\2\2\13D\3\2\2\2\rF\3\2\2\2\17H\3\2\2\2\21M\3\2")
35+
buf.write("\2\2\23O\3\2\2\2\25Q\3\2\2\2\27U\3\2\2\2\31Y\3\2\2\2\33")
36+
buf.write("[\3\2\2\2\35^\3\2\2\2\37a\3\2\2\2!e\3\2\2\2#i\3\2\2\2")
37+
buf.write("%k\3\2\2\2\'p\3\2\2\2)t\3\2\2\2+x\3\2\2\2-z\3\2\2\2/\177")
38+
buf.write("\3\2\2\2\61\u0084\3\2\2\2\63\u0089\3\2\2\2\65\u008d\3")
39+
buf.write("\2\2\2\67\u0092\3\2\2\29\u0097\3\2\2\2;\u009c\3\2\2\2")
40+
buf.write("=>\13\2\2\2>\b\3\2\2\2?@\7&\2\2@A\7*\2\2AB\3\2\2\2BC\b")
41+
buf.write("\3\2\2C\n\3\2\2\2DE\7*\2\2E\f\3\2\2\2FG\7+\2\2G\16\3\2")
42+
buf.write("\2\2HI\7&\2\2IJ\7}\2\2JK\3\2\2\2KL\b\6\3\2L\20\3\2\2\2")
43+
buf.write("MN\7}\2\2N\22\3\2\2\2OP\7\177\2\2P\24\3\2\2\2QR\7^\2\2")
44+
buf.write("RS\7&\2\2ST\7*\2\2T\26\3\2\2\2UV\7^\2\2VW\7&\2\2WX\7}")
45+
buf.write("\2\2X\30\3\2\2\2YZ\7^\2\2Z\32\3\2\2\2[\\\7^\2\2\\]\7^")
46+
buf.write("\2\2]\34\3\2\2\2^_\5\31\13\2_`\5\7\2\2`\36\3\2\2\2ab\5")
47+
buf.write("\13\4\2bc\3\2\2\2cd\b\16\4\2d \3\2\2\2ef\5\r\5\2fg\3\2")
48+
buf.write("\2\2gh\b\17\5\2h\"\3\2\2\2ij\n\2\2\2j$\3\2\2\2kl\5\31")
49+
buf.write("\13\2lm\5\7\2\2mn\3\2\2\2no\b\21\6\2o&\3\2\2\2pq\5\13")
50+
buf.write("\4\2qr\3\2\2\2rs\b\22\4\2s(\3\2\2\2tu\5\r\5\2uv\3\2\2")
51+
buf.write("\2vw\b\23\5\2w*\3\2\2\2xy\n\2\2\2y,\3\2\2\2z{\5\31\13")
52+
buf.write("\2{|\5\7\2\2|}\3\2\2\2}~\b\25\7\2~.\3\2\2\2\177\u0080")
53+
buf.write("\5\21\7\2\u0080\u0081\3\2\2\2\u0081\u0082\b\26\b\2\u0082")
54+
buf.write("\u0083\b\26\t\2\u0083\60\3\2\2\2\u0084\u0085\5\23\b\2")
55+
buf.write("\u0085\u0086\3\2\2\2\u0086\u0087\b\27\5\2\u0087\u0088")
56+
buf.write("\b\27\n\2\u0088\62\3\2\2\2\u0089\u008a\n\3\2\2\u008a\u008b")
57+
buf.write("\3\2\2\2\u008b\u008c\b\30\13\2\u008c\64\3\2\2\2\u008d")
58+
buf.write("\u008e\5\31\13\2\u008e\u008f\5\7\2\2\u008f\u0090\3\2\2")
59+
buf.write("\2\u0090\u0091\b\31\6\2\u0091\66\3\2\2\2\u0092\u0093\5")
60+
buf.write("\21\7\2\u0093\u0094\3\2\2\2\u0094\u0095\b\32\b\2\u0095")
61+
buf.write("\u0096\b\32\f\2\u00968\3\2\2\2\u0097\u0098\5\23\b\2\u0098")
62+
buf.write("\u0099\3\2\2\2\u0099\u009a\b\33\5\2\u009a\u009b\b\33\r")
63+
buf.write("\2\u009b:\3\2\2\2\u009c\u009d\n\3\2\2\u009d\u009e\3\2")
64+
buf.write("\2\2\u009e\u009f\b\34\6\2\u009f<\3\2\2\2\7\2\3\4\5\6\16")
65+
buf.write("\7\3\2\7\5\2\7\4\2\6\2\2\t\24\2\t\16\2\7\6\2\t\17\2\t")
66+
buf.write("\20\2\t\21\2\t\22\2\t\23\2")
67+
return buf.getvalue()
68+
69+
70+
class CwlEcmaStringLexer(Lexer):
71+
72+
atn = ATNDeserializer().deserialize(serializedATN())
73+
74+
decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
75+
76+
ParenExpr = 1
77+
SubExpr = 2
78+
BraceExpr = 3
79+
BraceSubExpr = 4
80+
81+
ANYCHAR = 1
82+
DOLLARPAREN = 2
83+
LPAREN = 3
84+
RPAREN = 4
85+
DOLLARBRACE = 5
86+
LBRACE = 6
87+
RBRACE = 7
88+
DOLLARPARENESC = 8
89+
DOLLARBRACEESC = 9
90+
BACKSLASH = 10
91+
BACKSLASHESC = 11
92+
EscPart = 12
93+
SubExprStart = 13
94+
ExprEnd = 14
95+
ExprPart = 15
96+
SubSubExprStart = 16
97+
SubExprEnd = 17
98+
SubExprPart = 18
99+
100+
channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
101+
102+
modeNames = [ "DEFAULT_MODE", "ParenExpr", "SubExpr", "BraceExpr", "BraceSubExpr" ]
103+
104+
literalNames = [ "<INVALID>",
105+
"'$('", "'('", "')'", "'${'", "'{'", "'}'", "'\\$('", "'\\${'",
106+
"'\\'", "'\\\\'" ]
107+
108+
symbolicNames = [ "<INVALID>",
109+
"ANYCHAR", "DOLLARPAREN", "LPAREN", "RPAREN", "DOLLARBRACE",
110+
"LBRACE", "RBRACE", "DOLLARPARENESC", "DOLLARBRACEESC", "BACKSLASH",
111+
"BACKSLASHESC", "EscPart", "SubExprStart", "ExprEnd", "ExprPart",
112+
"SubSubExprStart", "SubExprEnd", "SubExprPart" ]
113+
114+
ruleNames = [ "ANYCHAR", "DOLLARPAREN", "LPAREN", "RPAREN", "DOLLARBRACE",
115+
"LBRACE", "RBRACE", "DOLLARPARENESC", "DOLLARBRACEESC",
116+
"BACKSLASH", "BACKSLASHESC", "EscPart", "SubExprStart",
117+
"ExprEnd", "ExprPart", "SubEscPart", "SubSubExprStart",
118+
"SubExprEnd", "SubExprPart", "BraceEscPart", "BraceSubExprStart",
119+
"BraceExprEnd", "BraceExprPart", "BraceSubEscPart", "BraceSubSubExprStart",
120+
"BraceSubExprEnd", "BraceSubExprPart" ]
121+
122+
grammarFileName = "CwlEcmaStringLexer.g4"
123+
124+
def __init__(self, input=None, output:TextIO = sys.stdout):
125+
super().__init__(input, output)
126+
self.checkVersion("4.7.2")
127+
self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
128+
self._actions = None
129+
self._predicates = None
130+
131+

0 commit comments

Comments
 (0)