Skip to content

Commit 3dde794

Browse files
committed
add restrict keyword
1 parent 432558a commit 3dde794

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

source/parser.d

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ enum NodeType {
2525
String,
2626
Struct,
2727
Const,
28-
Enum
28+
Enum,
29+
Restrict
2930
}
3031

3132
class Node {
@@ -333,6 +334,17 @@ class EnumNode : Node {
333334
}
334335
}
335336

337+
class RestrictNode : Node {
338+
string ver;
339+
340+
this(ErrorInfo perror) {
341+
type = NodeType.Restrict;
342+
error = perror;
343+
}
344+
345+
override string toString() => format("restrict %s", ver);
346+
}
347+
336348
class ParserError : Exception {
337349
this() {
338350
super("", "", 0);
@@ -767,6 +779,17 @@ class Parser {
767779
return ret;
768780
}
769781

782+
Node ParseRestrict() {
783+
auto ret = new RestrictNode(GetError());
784+
parsing = NodeType.Restrict;
785+
786+
Next();
787+
Expect(TokenType.Identifier);
788+
ret.ver = tokens[i].contents;
789+
790+
return ret;
791+
}
792+
770793
Node ParseStatement() {
771794
switch (tokens[i].type) {
772795
case TokenType.Integer: {
@@ -787,6 +810,7 @@ class Parser {
787810
case "version": return ParseVersion();
788811
case "const": return ParseConst();
789812
case "enum": return ParseEnum();
813+
case "restrict": return ParseRestrict();
790814
default: return new WordNode(GetError(), tokens[i].contents);
791815
}
792816
}

source/preprocessor.d

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class Preprocessor {
2020
string[] includeDirs;
2121
string[] included;
2222
string[] versions;
23+
string[] restricted;
2324

2425
final void Error(Char, A...)(ErrorInfo error, in Char[] fmt, A args) {
2526
ErrorBegin(error);
@@ -76,11 +77,30 @@ class Preprocessor {
7677
case NodeType.Enable: {
7778
auto node = cast(EnableNode) inode;
7879

80+
if (restricted.canFind(node.ver)) {
81+
Error(
82+
node.error, "Attempted to enable restricted version '%s'",
83+
node.ver
84+
);
85+
}
86+
7987
if (!versions.canFind(node.ver)) {
8088
versions ~= node.ver;
8189
}
8290
break;
8391
}
92+
case NodeType.Restrict: {
93+
auto node = cast(RestrictNode) inode;
94+
95+
if (versions.canFind(node.ver)) {
96+
Error(
97+
node.error, "Restricted version '%s' is enabled", node.ver
98+
);
99+
}
100+
101+
restricted ~= node.ver;
102+
break;
103+
}
84104
default: {
85105
ret ~= inode;
86106
}

0 commit comments

Comments
 (0)