-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathT2TSnippetConverterParser.lemon
127 lines (104 loc) · 3.77 KB
/
T2TSnippetConverterParser.lemon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
%include {
#import <Foundation/Foundation.h>
#import "T2TSnippetConverterShared.h"
#ifndef CHAR_PAYLOAD_TO_STRING
#define CHAR_PAYLOAD_TO_STRING(p) ({ T2TSnippetToken tok = p; [[NSString alloc] initWithBytes:&(tok.payloadChar) length:1 encoding:NSUTF8StringEncoding]; })
#endif
#ifndef PAYLOAD_TO_STRING
#define PAYLOAD_TO_STRING(p) ({ T2TSnippetToken tok = p; [[NSString alloc] initWithBytes:tok.payloadStart length:tok.payloadEnd - tok.payloadStart encoding:NSUTF8StringEncoding]; })
#endif
#ifndef ESCAPE_SNIPPET_STRING
#define ESCAPE_SNIPPET_STRING(s) ({ \
NSMutableString *newString = [s mutableCopy]; \
[newString replaceOccurrencesOfString:@"\\" withString:@"\\\\" options:NSLiteralSearch range:NSMakeRange(0, [newString length])]; \
[newString replaceOccurrencesOfString:@"\"" withString:@"\\\"" options:NSLiteralSearch range:NSMakeRange(0, [newString length])]; \
newString; \
})
#endif
}
%token_type {T2TSnippetToken}
%extra_argument {NSMutableString *output}
%syntax_error {
printf("Syntax error\n");
}
%name {T2TParse}
%type main {NSString*}
main ::= superroot(x). {
[output appendString:x]; }
%type superroot {NSString*}
superroot(r) ::= superroot(r2) superroot_inner(i). {
r = [(r2 ?: @"") stringByAppendingString:(i ?: @"")]; }
superroot(r) ::= superroot_inner(i). {
r = i; }
superroot(r) ::= . {
r = @""; }
%type root {NSString*}
root(r) ::= root(r2) root_inner(i). {
r = [(r2 ?: @"") stringByAppendingString:(i ?: @"")]; }
root(r) ::= root_inner(i). {
r = i; }
root(r) ::= . {
r = @""; }
%type superroot_inner {NSString*}
superroot_inner(i) ::= superverbatim(v). {
i = v; }
superroot_inner(i) ::= root_inner_no_verbatim(t). {
i = t; }
superroot_inner(i) ::= verbatim(v). {
i = v; }
%type root_inner {NSString*}
root_inner(i) ::= root_inner_no_verbatim(t). {
i = t; /*[@"%" stringByAppendingString:t];*/ }
root_inner(i) ::= verbatim(v). {
i = ESCAPE_SNIPPET_STRING(v); }
%type root_inner_no_verbatim {NSString*}
root_inner_no_verbatim(i) ::= tabstop(t). {
i = t; }
root_inner_no_verbatim(i) ::= variable(v). {
i = v; }
root_inner_no_verbatim(i) ::= shell(s). {
i = s; }
%type tabstop {NSString*}
tabstop(t) ::= DOLLAR NUMERIC(n). {
t = [NSString stringWithFormat:@"%%{%@}", PAYLOAD_TO_STRING(n)]; }
tabstop(t) ::= DOLLAR_CURLY NUMERIC(n) misc(m) CURLY. {
t = [NSString stringWithFormat:@"%%{%@%@}", PAYLOAD_TO_STRING(n), m]; }
%type variable {NSString*}
variable(v) ::= DOLLAR IDENTIFIER(n). {
v = [NSString stringWithFormat:@"%%{%@}", PAYLOAD_TO_STRING(n)]; }
variable(v) ::= DOLLAR_CURLY IDENTIFIER(n) misc(m) CURLY. {
v = [NSString stringWithFormat:@"%%{%@%@}", PAYLOAD_TO_STRING(n), m]; }
%type misc {NSString*}
// Note that this rule must be above the misc(m) ::= COLON root(r). rule in order to sort out the ambiguity
misc(m) ::= COLON SHELL(r). {
m = [NSString stringWithFormat:@"=%@", PAYLOAD_TO_STRING(r)]; }
misc(m) ::= COLON root(r). {
m = [NSString stringWithFormat:@"=\"%@\"", r]; }
misc(m) ::= REGEXY(r). {
m = PAYLOAD_TO_STRING(r); }
misc(m) ::= . {
m = @""; }
%type shell {NSString*}
shell(s1) ::= SHELL(s2). {
s1 = [NSString stringWithFormat:@"%%{%@}", PAYLOAD_TO_STRING(s2)]; // PAYLOAD_TO_STRING(s2);
}
shell(s1) ::= DOLLAR_CURLY SHELL(s2) misc(m) CURLY. {
s1 = [NSString stringWithFormat:@"%%{%@%@}", PAYLOAD_TO_STRING(s2), m]; }
%type superverbatim {NSString*}
superverbatim(v) ::= CURLY(c). {
v = PAYLOAD_TO_STRING(c); }
%type verbatim {NSString*}
verbatim(v) ::= REGEXY(r). {
v = PAYLOAD_TO_STRING(r); }
verbatim(v) ::= CHAR(c). {
v = CHAR_PAYLOAD_TO_STRING(c); }
verbatim(v) ::= DOLLAR_CURLY. {
v = @"${"; }
verbatim(v) ::= DOLLAR. {
v = @"$"; }
verbatim(v) ::= COLON. {
v = @":"; }
verbatim(v) ::= IDENTIFIER(d). {
v = PAYLOAD_TO_STRING(d); }
verbatim(v) ::= NUMERIC(n). {
v = PAYLOAD_TO_STRING(n); }