https://www.coldfix.eu/2015/05/16/bison-c++11/
https://www.geeksforgeeks.org/flex-fast-lexical-analyzer-generator/
http://anoopsarkar.github.io/compilers-class/yacc-practice.html
vid calculator written with flex/bison
https://nullprogram.com/blog/2019/01/25/
books
courses
Circle-lang. Metaprogram C++ in C++. Now for download.
https://www.reddit.com/r/cpp/comments/bpxwqv/circlelang_metaprogram_c_in_c_now_for_download/
It's designed totally differently from metaclasses. Metaclasses require a very fine-grained object-oriented API which is supposed to model all aspects of the language. You use this API from inside the metaclass to modify the type.
The reflection in Circle has no API at all. You simply do compile-time control flow by putting @meta in front of control flow statements to cause them to go at compile time, and declare your members inside of that. It's all done contextually. If the innermost scope is a namespace, then the real statement inside your meta for will be treated like any other statement inside a namespace scope. If the innermost scope is a class definition, then the real statement will be treated like a member-specifier, and so on.
Circle is very Keep-It-Simple-Stupid. That's really the best principal in software design; I feel C++20 and the future proposals have given up on that.