@@ -205,6 +205,8 @@ StmtList *parse(Parser *parser) {
205205
206206// === Declarations ===
207207
208+ static Stmt * externDecl (Parser * p );
209+
208210static Stmt * declaration (Parser * p ) {
209211 if (match (p , 1 , TOKEN_ASYNC )) {
210212 if (match (p , 1 , TOKEN_FUNC ))
@@ -217,6 +219,8 @@ static Stmt *declaration(Parser *p) {
217219 return funcDecl (p , "function" , false, ACCESS_PUBLIC , false, false);
218220 if (match (p , 1 , TOKEN_CLASS ))
219221 return classDecl (p );
222+ if (match (p , 1 , TOKEN_EXTERN ))
223+ return externDecl (p );
220224 if (match (p , 1 , TOKEN_INTERFACE ))
221225 return interfaceDecl (p );
222226 if (match (p , 1 , TOKEN_USE ))
@@ -398,6 +402,39 @@ static Stmt *useDecl(Parser *p) {
398402 return createUseDeclStmt (modules , previous (p ).line , 0 );
399403}
400404
405+ static Stmt * externDecl (Parser * p ) {
406+ Token libToken = consume (p , TOKEN_STRING , "Expect library path string." );
407+ char * libPath = tokenToString (libToken );
408+
409+ Token symToken = consume (p , TOKEN_STRING , "Expect symbol name string." );
410+ char * symName = tokenToString (symToken );
411+
412+ consume (p , TOKEN_FUNC , "Expect 'func' after extern strings." );
413+ Token nameToken = consume (p , TOKEN_IDENTIFIER , "Expect function name." );
414+ char * name = tokenToString (nameToken );
415+
416+ consume (p , TOKEN_LEFT_PAREN , "Expect '(' after name." );
417+
418+ StringList * params = createStringList ();
419+ if (!check (p , TOKEN_RIGHT_PAREN )) {
420+ do {
421+ Token param = consume (p , TOKEN_IDENTIFIER , "Expect parameter name." );
422+ char * paramName = tokenToString (param );
423+ appendString (params , paramName );
424+ free (paramName );
425+ } while (match (p , 1 , TOKEN_COMMA ));
426+ }
427+
428+ consume (p , TOKEN_RIGHT_PAREN , "Expect ')' after parameters." );
429+ consume (p , TOKEN_SEMICOLON , "Expect ';' after extern declaration." );
430+
431+ Stmt * stmt = createExternDeclStmt (libPath , symName , name , params , libToken .line , 0 );
432+ free (libPath );
433+ free (symName );
434+ free (name );
435+ return stmt ;
436+ }
437+
401438// === Statements ===
402439
403440static Stmt * statement (Parser * p ) {
0 commit comments