Skip to content

Commit fece18c

Browse files
committed
YACC: rewrite as an optlib parser
This change does: * introduce "token" kind for extracting %token TOKEN0 TOKEN1 ..., * make the code for extracting labels more robust, and * fill typeref field by parsing %type <...>. The change was inspired by the proposal #1640 submitted by @jannick0. Close #1640. Signed-off-by: Masatake YAMATO <[email protected]>
1 parent 29f3d60 commit fece18c

File tree

10 files changed

+538
-243
lines changed

10 files changed

+538
-243
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
x input.y /^int x;$/;" v line:2 typeref:typename:int
2-
y input.y /^int y;/;" v line:8 typeref:typename:int
2+
y input.y /^int y;$/;" v line:8 typeref:typename:int

Units/parser-yacc.r/nested.d/expected.tags

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,48 @@
1-
CfgFile input.y /^CfgFile $/;" l language:YACC
2-
CfgEntryList input.y /^CfgEntryList : CfgEntryList CfgEntry$/;" l language:YACC
3-
CfgEntry input.y /^CfgEntry : EventDef ActionDef$/;" l language:YACC
4-
VarDef input.y /^VarDef : Ident EQUALS NameSpec$/;" l language:YACC
5-
EventDef input.y /^EventDef : EventType OPAREN OptNameSpec CPAREN$/;" l language:YACC
6-
EventType input.y /^EventType : BELL { $$= XkbBellNotify; }$/;" l language:YACC
7-
ActionDef input.y /^ActionDef : ActionType OptString$/;" l language:YACC
8-
ActionType input.y /^ActionType : NONE { $$ = NoAction; }$/;" l language:YACC
9-
OptNameSpec input.y /^OptNameSpec : NameSpec { $$= $1; }$/;" l language:YACC
10-
NameSpec input.y /^NameSpec : Ident { $$= $1; }$/;" l language:YACC
11-
Ident input.y /^Ident : IDENT { $$= scanStr; scanStr= NULL; }$/;" l language:YACC
12-
OptString input.y /^OptString : String { $$= $1; }$/;" l language:YACC
13-
String input.y /^String : STRING { $$= scanStr; scanStr= NULL; }$/;" l language:YACC
1+
END_OF_FILE input.y /^ END_OF_FILE 0$/;" t language:YACC
2+
ERROR input.y /^ ERROR 255$/;" t language:YACC
3+
BELL input.y /^ BELL 1$/;" t language:YACC
4+
ACCESSX input.y /^ ACCESSX 2$/;" t language:YACC
5+
MESSAGE input.y /^ MESSAGE 3$/;" t language:YACC
6+
NONE input.y /^ NONE 20$/;" t language:YACC
7+
IGNORE input.y /^ IGNORE 21$/;" t language:YACC
8+
ECHO input.y /^ ECHO 22$/;" t language:YACC
9+
PRINT_EV input.y /^ PRINT_EV 23$/;" t language:YACC
10+
SHELL input.y /^ SHELL 24$/;" t language:YACC
11+
SOUND input.y /^ SOUND 25$/;" t language:YACC
12+
EQUALS input.y /^ EQUALS 40$/;" t language:YACC
13+
PLUS input.y /^ PLUS 41$/;" t language:YACC
14+
MINUS input.y /^ MINUS 42$/;" t language:YACC
15+
DIVIDE input.y /^ DIVIDE 43$/;" t language:YACC
16+
TIMES input.y /^ TIMES 44$/;" t language:YACC
17+
OBRACE input.y /^ OBRACE 45$/;" t language:YACC
18+
CBRACE input.y /^ CBRACE 46$/;" t language:YACC
19+
OPAREN input.y /^ OPAREN 47$/;" t language:YACC
20+
CPAREN input.y /^ CPAREN 48$/;" t language:YACC
21+
OBRACKET input.y /^ OBRACKET 49$/;" t language:YACC
22+
CBRACKET input.y /^ CBRACKET 50$/;" t language:YACC
23+
DOT input.y /^ DOT 51$/;" t language:YACC
24+
COMMA input.y /^ COMMA 52$/;" t language:YACC
25+
SEMI input.y /^ SEMI 53$/;" t language:YACC
26+
EXCLAM input.y /^ EXCLAM 54$/;" t language:YACC
27+
INVERT input.y /^ INVERT 55$/;" t language:YACC
28+
STRING input.y /^ STRING 60$/;" t language:YACC
29+
INTEGER input.y /^ INTEGER 61$/;" t language:YACC
30+
FLOAT input.y /^ FLOAT 62$/;" t language:YACC
31+
IDENT input.y /^ IDENT 63$/;" t language:YACC
32+
KEYNAME input.y /^ KEYNAME 64$/;" t language:YACC
33+
CfgFile input.y /^CfgFile $/;" l language:YACC typeref:typename:entry
34+
CfgEntryList input.y /^CfgEntryList : CfgEntryList CfgEntry$/;" l language:YACC typeref:typename:entry
35+
CfgEntry input.y /^CfgEntry : EventDef ActionDef$/;" l language:YACC typeref:typename:entry
36+
VarDef input.y /^VarDef : Ident EQUALS NameSpec$/;" l language:YACC typeref:typename:entry
37+
EventDef input.y /^EventDef : EventType OPAREN OptNameSpec CPAREN$/;" l language:YACC typeref:typename:entry
38+
EventType input.y /^EventType : BELL { $$= XkbBellNotify; }$/;" l language:YACC typeref:typename:ival
39+
ActionDef input.y /^ActionDef : ActionType OptString$/;" l language:YACC typeref:typename:act
40+
ActionType input.y /^ActionType : NONE { $$ = NoAction; }$/;" l language:YACC typeref:typename:ival
41+
OptNameSpec input.y /^OptNameSpec : NameSpec { $$= $1; }$/;" l language:YACC typeref:typename:str
42+
NameSpec input.y /^NameSpec : Ident { $$= $1; }$/;" l language:YACC typeref:typename:str
43+
Ident input.y /^Ident : IDENT { $$= scanStr; scanStr= NULL; }$/;" l language:YACC typeref:typename:str
44+
OptString input.y /^OptString : String { $$= $1; }$/;" l language:YACC typeref:typename:str
45+
String input.y /^String : STRING { $$= scanStr; scanStr= NULL; }$/;" l language:YACC typeref:typename:str
1446
YYDEBUG input.y /^#define YYDEBUG /;" d language:C file: extras:fileScope,guest
1547
DEBUG_VAR input.y /^#define DEBUG_VAR /;" d language:C file: extras:fileScope,guest
1648
__anon5f5ae8c8010a input.y /union {$/;" u language:C file: extras:fileScope,guest,anonymous

Units/parser-yacc.r/not-union.d/expected.tags

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
HOSTCOND input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
2+
DCOND input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
3+
SCOND input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
4+
DPORT input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
5+
SPORT input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
6+
LEQ input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
7+
GEQ input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
8+
NEQ input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
9+
AUTOBOUND input.y /^%token HOSTCOND DCOND SCOND DPORT SPORT LEQ GEQ NEQ AUTOBOUND$/;" t language:YACC
110
applet input.y /^applet: null expr$/;" l language:YACC
211
null input.y /^null: \/* NOTHING *\/ { $$ = NULL; }$/;" l language:YACC
312
expr input.y /^expr: DCOND HOSTCOND$/;" l language:YACC

main/parsers_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@
164164
VhdlParser, \
165165
VimParser, \
166166
WindResParser, \
167-
YaccParser, \
167+
YACCParser, \
168168
YumRepoParser, \
169169
ZephirParser
170170

optlib/yacc.c

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
/*
2+
* Generated by ./misc/optlib2c from optlib/yacc.ctags, Don't edit this manually.
3+
*/
4+
#include "general.h"
5+
#include "parse.h"
6+
#include "routines.h"
7+
#include "field.h"
8+
#include "xtag.h"
9+
10+
11+
static void initializeYACCParser (const langType language)
12+
{
13+
addLanguageOptscriptToHook (language, SCRIPT_HOOK_PRELUDE,
14+
"{{ /token-type false def\n"
15+
" /type-dict 57 dict def\n"
16+
"}}");
17+
18+
addLanguageRegexTable (language, "toplevel");
19+
addLanguageRegexTable (language, "comment");
20+
addLanguageRegexTable (language, "cPrologue");
21+
addLanguageRegexTable (language, "grammar");
22+
addLanguageRegexTable (language, "cEpilogue");
23+
addLanguageRegexTable (language, "token");
24+
addLanguageRegexTable (language, "cUnion");
25+
addLanguageRegexTable (language, "cString");
26+
addLanguageRegexTable (language, "iString");
27+
addLanguageRegexTable (language, "rule");
28+
addLanguageRegexTable (language, "cActionCommon");
29+
addLanguageRegexTable (language, "cAction");
30+
addLanguageRegexTable (language, "type");
31+
addLanguageRegexTable (language, "cCharlit");
32+
33+
addLanguageTagMultiTableRegex (language, "toplevel",
34+
"^/\\*",
35+
"", "", "{tenter=comment}", NULL);
36+
addLanguageTagMultiTableRegex (language, "toplevel",
37+
"^%token[ \t\n]+",
38+
"", "", "{tenter=token}"
39+
"{{\n"
40+
" /token-type false def\n"
41+
"}}", NULL);
42+
addLanguageTagMultiTableRegex (language, "toplevel",
43+
"^%(union)[^\\{]*\\{",
44+
"", "", "{tenter=cUnion}{_guest=C,1start,}", NULL);
45+
addLanguageTagMultiTableRegex (language, "toplevel",
46+
"^%(code[^\\{]*)?\\{",
47+
"", "", "{tenter=cPrologue}{_guest=C,0end,}", NULL);
48+
addLanguageTagMultiTableRegex (language, "toplevel",
49+
"^%(type|nterm)[ \n\t]*",
50+
"", "", "{tenter=type}"
51+
"{{\n"
52+
" /token-type false def\n"
53+
"}}", NULL);
54+
addLanguageTagMultiTableRegex (language, "toplevel",
55+
"^%%",
56+
"", "", "{tjump=grammar}", NULL);
57+
addLanguageTagMultiTableRegex (language, "toplevel",
58+
"^[^\n]*\n",
59+
"", "", "", NULL);
60+
addLanguageTagMultiTableRegex (language, "comment",
61+
"^[^*]+",
62+
"", "", "", NULL);
63+
addLanguageTagMultiTableRegex (language, "comment",
64+
"^\\*/",
65+
"", "", "{tleave}", NULL);
66+
addLanguageTagMultiTableRegex (language, "comment",
67+
"^.",
68+
"", "", "", NULL);
69+
addLanguageTagMultiTableRegex (language, "cPrologue",
70+
"^[^%]+",
71+
"", "", "", NULL);
72+
addLanguageTagMultiTableRegex (language, "cPrologue",
73+
"^%\\}",
74+
"", "", "{tleave}{_guest=,,0start}", NULL);
75+
addLanguageTagMultiTableRegex (language, "cPrologue",
76+
"^.",
77+
"", "", "", NULL);
78+
addLanguageTagMultiTableRegex (language, "grammar",
79+
"^%%",
80+
"", "", "{tjump=cEpilogue}{_guest=C,0end,}", NULL);
81+
addLanguageTagMultiTableRegex (language, "grammar",
82+
"^([a-zA-Z_.][-a-zA-Z_.0-9]+)[ \t\n]*:[ \t\n]*",
83+
"\\1", "l", "{tenter=rule}"
84+
"{{\n"
85+
" type-dict \\1 known {\n"
86+
" type-dict \\1 get . exch typeref:\n"
87+
" } if\n"
88+
"}}", NULL);
89+
addLanguageTagMultiTableRegex (language, "grammar",
90+
"^.",
91+
"", "", "", NULL);
92+
addLanguageTagMultiTableRegex (language, "cEpilogue",
93+
"^.+",
94+
"", "", "{_guest=,,0end}", NULL);
95+
addLanguageTagMultiTableRegex (language, "token",
96+
"^N?_[ \t]*\\(",
97+
"", "", "{tenter=iString}", NULL);
98+
addLanguageTagMultiTableRegex (language, "token",
99+
"^([_a-zA-Z][_a-zA-Z0-9]*)[ \t\n]*",
100+
"\\1", "t", ""
101+
"{{\n"
102+
" token-type false ne {\n"
103+
" . token-type typeref:\n"
104+
" } if\n"
105+
"}}", NULL);
106+
addLanguageTagMultiTableRegex (language, "token",
107+
"^<[ \t]*([_a-zA-Z][_a-zA-Z0-9 *]*)[ \t]*>[ \t\n]*",
108+
"", "", ""
109+
"{{\n"
110+
" /token-type \\1 def\n"
111+
"}}", NULL);
112+
addLanguageTagMultiTableRegex (language, "token",
113+
"^\"",
114+
"", "", "{tenter=cString}", NULL);
115+
addLanguageTagMultiTableRegex (language, "token",
116+
"^'",
117+
"", "", "{tenter=cCharlit}", NULL);
118+
addLanguageTagMultiTableRegex (language, "token",
119+
"^-?[ \t\n]*(0x)?[0-9]+[ \t\n]*",
120+
"", "", "", NULL);
121+
addLanguageTagMultiTableRegex (language, "token",
122+
"^%",
123+
"", "", "{tleave}{_advanceTo=0start}"
124+
"{{\n"
125+
" /token-type false def\n"
126+
"}}", NULL);
127+
addLanguageTagMultiTableRegex (language, "token",
128+
"^.|\n",
129+
"", "", "", NULL);
130+
addLanguageTagMultiTableRegex (language, "cUnion",
131+
"^[^\"/\\{\\}]+",
132+
"", "", "", NULL);
133+
addLanguageTagMultiTableRegex (language, "cUnion",
134+
"^\"",
135+
"", "", "{tenter=cString}", NULL);
136+
addLanguageTagMultiTableRegex (language, "cUnion",
137+
"^'",
138+
"", "", "{tenter=cCharlit}", NULL);
139+
addLanguageTagMultiTableRegex (language, "cUnion",
140+
"^/\\*",
141+
"", "", "{tenter=comment}", NULL);
142+
addLanguageTagMultiTableRegex (language, "cUnion",
143+
"^\\{",
144+
"", "", "{tenter=cAction}", NULL);
145+
addLanguageTagMultiTableRegex (language, "cUnion",
146+
"^\\}",
147+
"", "", "{tleave}{_guest=,,0end}{tleave}", NULL);
148+
addLanguageTagMultiTableRegex (language, "cString",
149+
"^[\\\\\"]+",
150+
"", "", "", NULL);
151+
addLanguageTagMultiTableRegex (language, "cString",
152+
"^\\\\.",
153+
"", "", "", NULL);
154+
addLanguageTagMultiTableRegex (language, "cString",
155+
"^\"",
156+
"", "", "{tleave}", NULL);
157+
addLanguageTagMultiTableRegex (language, "iString",
158+
"^\"",
159+
"", "", "{tenter=cString}", NULL);
160+
addLanguageTagMultiTableRegex (language, "iString",
161+
"^\\)",
162+
"", "", "{tleave}", NULL);
163+
addLanguageTagMultiTableRegex (language, "iString",
164+
"^.",
165+
"", "", "", NULL);
166+
addLanguageTagMultiTableRegex (language, "rule",
167+
"^[^\\{;]+",
168+
"", "", "", NULL);
169+
addLanguageTagMultiTableRegex (language, "rule",
170+
"^\\{",
171+
"", "", "{tenter=cAction}", NULL);
172+
addLanguageTagMultiTableRegex (language, "rule",
173+
"^;",
174+
"", "", "{tleave}", NULL);
175+
addLanguageTagMultiTableRegex (language, "rule",
176+
"^.",
177+
"", "", "", NULL);
178+
addLanguageTagMultiTableRegex (language, "cActionCommon",
179+
"^[^\"/\\{\\}]+",
180+
"", "", "", NULL);
181+
addLanguageTagMultiTableRegex (language, "cActionCommon",
182+
"^\"",
183+
"", "", "{tenter=cString}", NULL);
184+
addLanguageTagMultiTableRegex (language, "cActionCommon",
185+
"^'",
186+
"", "", "{tenter=cCharlit}", NULL);
187+
addLanguageTagMultiTableRegex (language, "cActionCommon",
188+
"^/\\*",
189+
"", "", "{tenter=comment}", NULL);
190+
addLanguageTagMultiTableRegex (language, "cActionCommon",
191+
"^\\{",
192+
"", "", "{tenter=cAction}", NULL);
193+
addLanguageTagMultiTableRegex (language, "cAction",
194+
"^[^\"/\\{\\}]+",
195+
"", "", "", NULL);
196+
addLanguageTagMultiTableRegex (language, "cAction",
197+
"^\"",
198+
"", "", "{tenter=cString}", NULL);
199+
addLanguageTagMultiTableRegex (language, "cAction",
200+
"^'",
201+
"", "", "{tenter=cCharlit}", NULL);
202+
addLanguageTagMultiTableRegex (language, "cAction",
203+
"^/\\*",
204+
"", "", "{tenter=comment}", NULL);
205+
addLanguageTagMultiTableRegex (language, "cAction",
206+
"^\\{",
207+
"", "", "{tenter=cAction}", NULL);
208+
addLanguageTagMultiTableRegex (language, "cAction",
209+
"^\\}",
210+
"", "", "{tleave}", NULL);
211+
addLanguageTagMultiTableRegex (language, "type",
212+
"^N?_[ \t]*\\(",
213+
"", "", "{tenter=iString}", NULL);
214+
addLanguageTagMultiTableRegex (language, "type",
215+
"^([_a-zA-Z][_a-zA-Z0-9]*)[ \t\n]*",
216+
"", "", ""
217+
"{{\n"
218+
" token-type false ne {\n"
219+
" type-dict \\1 token-type put\n"
220+
" } if\n"
221+
"}}", NULL);
222+
addLanguageTagMultiTableRegex (language, "type",
223+
"^<[ \t]*([_a-zA-Z][_a-zA-Z0-9 *]*)[ \t]*>[ \t\n]*",
224+
"", "", ""
225+
"{{\n"
226+
" /token-type \\1 def\n"
227+
"}}", NULL);
228+
addLanguageTagMultiTableRegex (language, "type",
229+
"^\"",
230+
"", "", "{tenter=cString}", NULL);
231+
addLanguageTagMultiTableRegex (language, "type",
232+
"^'",
233+
"", "", "{tenter=cCharlit}", NULL);
234+
addLanguageTagMultiTableRegex (language, "type",
235+
"^%",
236+
"", "", "{tleave}{_advanceTo=0start}"
237+
"{{\n"
238+
" /token-type false def\n"
239+
"}}", NULL);
240+
addLanguageTagMultiTableRegex (language, "type",
241+
"^.|\n",
242+
"", "", "", NULL);
243+
addLanguageTagMultiTableRegex (language, "cCharlit",
244+
"^[^\\\\]'",
245+
"", "", "{tleave}", NULL);
246+
addLanguageTagMultiTableRegex (language, "cCharlit",
247+
"^\\\\.'",
248+
"", "", "{tleave}", NULL);
249+
addLanguageTagMultiTableRegex (language, "cCharlit",
250+
"^'",
251+
"", "", "{tleave}", NULL);
252+
addLanguageTagMultiTableRegex (language, "cCharlit",
253+
"^.",
254+
"", "", "", NULL);
255+
}
256+
257+
extern parserDefinition* YACCParser (void)
258+
{
259+
static const char *const extensions [] = {
260+
"y",
261+
NULL
262+
};
263+
264+
static const char *const aliases [] = {
265+
NULL
266+
};
267+
268+
static const char *const patterns [] = {
269+
NULL
270+
};
271+
272+
static kindDefinition YACCKindTable [] = {
273+
{
274+
true, 't', "token", "tokens",
275+
},
276+
{
277+
true, 'l', "label", "labels",
278+
},
279+
};
280+
281+
parserDefinition* const def = parserNew ("YACC");
282+
283+
def->enabled = true;
284+
def->extensions = extensions;
285+
def->patterns = patterns;
286+
def->aliases = aliases;
287+
def->method = METHOD_NOT_CRAFTED|METHOD_REGEX;
288+
def->useCork = CORK_QUEUE;
289+
def->kindTable = YACCKindTable;
290+
def->kindCount = ARRAY_SIZE(YACCKindTable);
291+
def->initialize = initializeYACCParser;
292+
293+
return def;
294+
}

0 commit comments

Comments
 (0)