@@ -33,7 +33,8 @@ enum NodeType {
3333 Addr,
3434 Implement,
3535 Set,
36- TryCatch
36+ TryCatch,
37+ Unsafe
3738}
3839
3940class Node {
@@ -521,6 +522,27 @@ class TryCatchNode : Node {
521522 }
522523}
523524
525+ class UnsafeNode : Node {
526+ string [] paramTypes;
527+ string [] retTypes;
528+ Node[] nodes;
529+
530+ this (ErrorInfo perror) {
531+ type = NodeType.Unsafe;
532+ error = perror;
533+ }
534+
535+ override string toString () {
536+ string ret = format(" unsafe %d -> %d" , paramTypes.length, retTypes.length);
537+
538+ foreach (ref node ; nodes) {
539+ ret ~= node.toString() ~ ' \n ' ;
540+ }
541+
542+ return ret ~ " end" ;
543+ }
544+ }
545+
524546class ParserError : Exception {
525547 this () {
526548 super (" " , " " , 0 );
@@ -1228,6 +1250,47 @@ class Parser {
12281250 return ret;
12291251 }
12301252
1253+ Node ParseUnsafe () {
1254+ auto ret = new UnsafeNode(GetError());
1255+ parsing = NodeType.Unsafe;
1256+
1257+ Next();
1258+
1259+ while (! IsIdentifier(" begin" ) && ! IsIdentifier(" ->" )) {
1260+ Expect(TokenType.Identifier);
1261+ ret.paramTypes ~= tokens[i].contents;
1262+ Next();
1263+ Expect(TokenType.Identifier);
1264+ Next();
1265+ }
1266+
1267+ if (IsIdentifier(" ->" )) {
1268+ Next();
1269+
1270+ while (! IsIdentifier(" begin" )) {
1271+ Expect(TokenType.Identifier);
1272+ ret.retTypes ~= tokens[i].contents; // return type
1273+
1274+ Next();
1275+ Expect(TokenType.Identifier); // return name, ignored
1276+
1277+ if (tokens[i].contents == " begin" ) {
1278+ Error(" Begin in return name" );
1279+ }
1280+ Next();
1281+ }
1282+ }
1283+
1284+ Next();
1285+
1286+ while (! IsIdentifier(" end" )) {
1287+ ret.nodes ~= ParseStatement();
1288+ Next();
1289+ }
1290+
1291+ return ret;
1292+ }
1293+
12311294 Node ParseStatement () {
12321295 switch (tokens[i].type) {
12331296 case TokenType.Integer: {
@@ -1255,6 +1318,7 @@ class Parser {
12551318 case " implement" : return ParseImplement();
12561319 case " try" : return ParseTryCatch();
12571320 case " ->" : return ParseSet();
1321+ case " unsafe" : return ParseUnsafe();
12581322 default : return new WordNode(GetError(), tokens[i].contents);
12591323 }
12601324 }
0 commit comments