Почитайте про устройство компиляторов. Возможно как-то можно определить на одном из этапов компиляции. Посмотрите интерпретаторы рукописных языков, может там будет чего.
На вскидку можно так:
1. Проход удаляет комментарии
2. Проход по глобальным переменным (исключая функции)
Тут можно узнать какие-нибудь результаты по записи переменных и прочему.
3. Проход по функциям (исключая глобальные переменные)
Тут уже разбираете тело функции построчно и поблочно (например if, for, while)
В любом случае нужна функция, которая сможет распарсить блок { ... }.
На выходе будет что-то типа списка строк где задетектился тот или иной язык.
Javascript 1,2,3,4,5
php 6,7,8,9
c++ 2,4,5
Вот тут есть пример интерпретатора какого-то
www.williamspublishing.com/Books/5-8459-0786-1.html#ogl
Глава 3
Реализация интерпретатора языка на Java 53