Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

m2lang - The LLVM-based Modula-2 compiler

Build Status Build Status


See this FOSDEM 2019 talk for some details.

Implementation decisions

  • LLVM is only external dependency
  • CMake scripts derived from clang
  • ISO Modula-2 language first
  • Use "declare-before-use" (single-pass) model
  • Goal is target several platforms from the beginning

Current status

  • The lexer is done.
  • The preprocessor (for handling of directives) is is based on the draft technical report "Interfacing Modula-2 to C", Annex B and aims to be compatible to the Macintosh p1 compiler. Parsing of directives is implemented, with mostly no functionality.
  • The parser is based on ISO Modula-2 with generic and OO additions. Some LL(1) conflicts are still left in the grammar, so not every source is parsed correctly.
  • The parser is generated by LLtool. A C++ port of LLtool is now integrated into this project, but not yet enabled.
  • Error recovery in the parser is based on "panic mode", using the follow sets of the current and the active callers.
  • The AST nodes are generated by ASTtool.
  • Error messages are outputted using llvm::SourceMgr for nice presentation.
  • Only a dummy driver exists to see the parser in action.
  • A couple of IR statements is emitted to the console after succesful parsing.