py/lexer: Provide generic mp_lexer_new_from_file based on mp_reader.

If a port defines MICROPY_READER_POSIX or MICROPY_READER_FATFS then
lexer.c now provides an implementation of mp_lexer_new_from_file using
the mp_reader_new_file function.
diff --git a/py/lexer.c b/py/lexer.c
index f1be778..d3e61b3 100644
--- a/py/lexer.c
+++ b/py/lexer.c
@@ -759,6 +759,19 @@
     return mp_lexer_new(src_name, reader.data, (mp_lexer_stream_next_byte_t)reader.readbyte, (mp_lexer_stream_close_t)reader.close);
 }
 
+#if MICROPY_READER_POSIX || MICROPY_READER_FATFS
+
+mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
+    mp_reader_t reader;
+    int ret = mp_reader_new_file(&reader, filename);
+    if (ret != 0) {
+        return NULL;
+    }
+    return mp_lexer_new(qstr_from_str(filename), reader.data, (mp_lexer_stream_next_byte_t)reader.readbyte, (mp_lexer_stream_close_t)reader.close);
+}
+
+#endif
+
 void mp_lexer_free(mp_lexer_t *lex) {
     if (lex) {
         if (lex->stream_close) {
diff --git a/py/lexerunix.c b/py/lexerunix.c
index e8f8994..9e3755e 100644
--- a/py/lexerunix.c
+++ b/py/lexerunix.c
@@ -85,12 +85,4 @@
     return mp_lexer_new(filename, fb, (mp_lexer_stream_next_byte_t)file_buf_next_byte, (mp_lexer_stream_close_t)file_buf_close);
 }
 
-mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
-    int fd = open(filename, O_RDONLY);
-    if (fd < 0) {
-        return NULL;
-    }
-    return mp_lexer_new_from_fd(qstr_from_str(filename), fd, true);
-}
-
 #endif // MICROPY_HELPER_LEXER_UNIX
diff --git a/py/py.mk b/py/py.mk
index 1557e07..1683b7b 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -229,7 +229,6 @@
 	../extmod/vfs_fat_diskio.o \
 	../extmod/vfs_fat_file.o \
 	../extmod/vfs_fat_reader.o \
-	../extmod/vfs_fat_lexer.o \
 	../extmod/vfs_fat_misc.o \
 	../extmod/utime_mphal.o \
 	../extmod/uos_dupterm.o \