Se me permite algumas sugestões...
Sei que, como o próprio README já diz, é um projeto feito "com fins educacionais" e não parece ter a intenção de virar algo mais sério (pelo menos é o que parece no momento), mas acho que dá pra fazer alguns comentários.
Para números, vc usou \d, que funciona. Mas em Python, uma regex por padrão está no "modo Unicode", o que quer dizer que muitos atalhos vão além do ASCII. No caso do \d, por exemplo, também vai pegar outros caracteres como o ٤ ("ARABIC-INDIC DIGIT FOUR"), além de muitos outros (veja aqui como a lista é grande).
Ou seja, se for para restringir (e em um compilador/interpretador, entendo que é importante definir bem quais caracteres são permitidos e quais não são), pode trocar para [0-9]+, assim vc garante que pode ter somente dígitos de 0 a 9.
Indo um pouco mais além, daria pra fazer uma expressão mais complexa para permitir números negativos, com casas decimais e notação científica, como -10, .2, -294.3594 e 2.5e12. Além de tratar outros casos: em muitas linguagens, se o primeiro dígito é zero, o restante é tratado como um número na base 8, mas se começa com 0x, o restante é tratado como hexadecimal (e aí teria que permitir também letras de A e F), etc.
Quanto a re.compile(r'[a-zA-Z_]\w*', re.IGNORECASE), algo parecido ocorre com o \w: ele pega qualquer caractere alfanumérico de qualquer alfabeto suportado pelo Unicode. Ou seja, caracteres árabes, japoneses, chineses, coreanos, cirílicos, etc. Se a ideia é permitir tudo isso, ok, mas se a ideia é permitir somente ASCII, teria que mudar para algo como [a-zA-Z_][a-zA-Z_0-9]*. E repare que, como vc já incluiu letras maiúsculas e minúsculas na expressão, não precisa usar a flag re.IGNORECASE (ela é redundante neste caso).
Dito isso, regex não é a melhor opção para parsing
Sei que para casos mais simples é uma opção rápida e "funciona", mas conforme a linguagem vai se tornando mais complexa, regex se torna inviável, ineficiente e de difícil manutenção.
Por exemplo, suas strings atualmente não permitem escapes, como \" para ter aspas dentro do texto. Ou seja, se tiver algo como "blabla \"entre aspas\" blabla", ela vai considerar apenas "blabla \" como sendo uma string. Os formatos numéricos podem ficar extremamente complexos para permitir todas as variações, etc. E alterar as suas regex para tratar esses casos vai ficando cada vez mais complicado, já que as expressões vão ficando cada vez mais difíceis de entender e manter.
Só pra ter uma ideia, no caso de escapes dentro da string, seria algo como re.compile(r'"([^"\\]|\\.)*"'). Para números, algo como re.compile(r'(?:[1-9]\d+|0|0[oO]?[0-7]+|0[xX][0-9a-fA-F]+|0[bB][01]+)[lL]?') e isso é só para inteiros (ainda falta adicionar casas decimais, o que deixaria a regex ainda pior).
Sei que talvez esteja saindo do escopo, mas se quiser evoluir o projeto, sugiro dar uma olhada em ferramentas como o Antlr, que tem suporte para Python.
Eu fiz um post sobre Antlr, mas se for usar, melhor ver a documentação. Além disso, ele já tem várias gramáticas prontas, inclusive para parsing de linguagens, que vc pode usar para se inspirar (melhor que começar do zero).