Clone wiki

m2c-rework / Home

M2C Modula-2 Compiler & Translator Rework Project

Welcome to the Wiki of the M2C Modula-2 Compiler & Translator Rework Project

Dialects & Language | EBNF Grammar | Supported Platforms & Porting | IDE | WebChat


The objective of this project is to completely rewrite and replace the codebase of the M2C compiler, originally by V.Makarov with a highly portable, reliable, readable and maintainable new M2C compiler.


The purpose of the new M2C compiler is to provide a means:

  • to compile and run program examples from early Modula-2 books (PIM3/PIM4), in particular works by Wirth.
  • to develop, build and bootstrap a compiler for Modula-2 Revision 2010 written in a subset of M2 R10.


The new M2C compiler shall support the classic Modula-2 language described in the third and fourth editions of "Programming in Modula-2" (Wirth, 1983-1985) and selected features of the revised Modula-2 language described in "Modula-2 Revision 2010" (Kowarsch and Sutcliffe, 2010-2015). For details, see section M2C Language Extensions further below. The ISO Modula-2 dialect will not be supported.

Details on M2C dialect options and language extensions are here.


The grammar of the compiler is in the project repository


The new M2C compiler is licensed under the GNU Lesser General Public License (LGPL) both v.2.1 and v.3.


  • Replacement Lexer
  • Replacement Parser
  • Replacement AST (abstract syntax tree)
  • Replacement Semantic Analyser
  • Replacement Code Generator
  • Replacement Driver Program
  • Vim integration: Syntax colouring and compiler invocation

Milestones (completed)

  • Replacement Lexer operational in Nov 2015
  • Replacement Parser operational on Dec 11, 2015
  • Replacement Driver operational with partial functionality
  • AST library and API
  • AST exporter for S-expression and GraphViz DOT output
  • OS specific file system and IO libraries for AmigaOS, POSIX, VMS and Windows.
  • OS specific pathname parsing/splitting libraries for AmigaOS, POSIX, VMS and Windows.
  • Modula-2 to C identifier conversion library (part of code generator)
  • Symbol table library and API

Current Work Items

  • Vim syntax colouring
  • Testing symbol table library
  • Testing AST library and AST exporter
  • Testing OS specific implementations of fileutils
  • Testing OS specific pathname validation, splitting and composition
  • C99 code generator

Upcoming Work Items

  • Dependency graph generator
  • Symbol table to SYM file exporter

Expected Completion

We estimate the full-time effort required to complete all remaining deliverables to be two to three man months. Community end-to-end testing may then add another two calendar months to iron out bugs on all supported platforms.

At the present time we are unable to commit any full-time resources and this makes it very difficult to predict a calendar date for completion. However, we are currently in talks with a potential sponsor about a sponsorship. With a bit of luck, the sponsorship may allow one of us to work full-time on the remaining deliverables until completion. An update will be posted here in due course.


The M2C compiler is written in C and therefore a C compiler is required to build it. There are no dependencies on any libraries other than the C standard library. It has been built and tested with LLVM and GCC with C99/C11 standard settings on various OSes, DEC/HPE C on OpenVMS and MSVC 2015 on Windows.

OS support

At this time, M2C has been build and tested on AmigaOS, FreeBSD, Cygwin, Linux, MacOS X, OpenVMS/Alpha and Microsoft Windows. It should also build and work on other BSD systems and other recent Unix and Unix-like systems such as AIX, HP-UX, QNX and Solaris, further on MS-DOS and OS/2. The compiler is designed to be portable with very little effort.

IDE support

M2C is being integrated into Vim, including GUI versions of Vim for Linux, Mac OS X and Windows. At this time our working copy of Vim (v.7.4) supports syntax colouring with dialect differentiation. Filetype detection scans .def and .mod files to automatically determine the dialect with support for special comments that act as dialect tags. In addition, the Syntax menu provides a choice of PIM, ISO and M2 R10 to set the dialect manually. Outstanding are code folding and invoking the compiler from Vim.


M2C is designed for utmost portability. Operating systems supported thus far are AmigaOS, BSD, Linux, MacOS X, OpenVMS and Windows. The Windows version should also cover MS-DOS and OS/2. Work on Plan9 and RISC OS is about to commence and several other systems are on our to do list.

For more details on porting M2C, supported systems and a full to-do list click here.

How to Build from Source

Step 1: Obtain a copy of the source code

$ hg clone

Step 2: Invoke the make utility within the m2c-rework directory

$ make

This will build both the lexer test program testlex as well as the driver program m2c.

Compiler Options

A list of compiler options can be obtained by invoking the driver program with the help option.

$ ./m2c --help


To run m2c on a Modula-2 source file it is invoked with the name of the source file, with any compiler options following after the filename.

Let's assume we use the following example source taken from Niklaus Wirth's book "Programming in Modula-2", 4th Edition, page 96 ...

DEFINITION MODULE EBNFScanner; (* N.Wirth, PIM4, page 96 *)
 TYPE Symbol = (ident, literal, lpar, lbk, lbr,
        bar, eql, period, rpar, rbk, rbr, other);

 CONST IdLength = 24;
 VAR sym: Symbol; (* next symbol *)
  id: ARRAY [0 .. IdLength] OF CHAR;
  lno: INTEGER;

END EBNFScanner.

As this source file follows PIM syntax the compiler needs to be run in PIM3 or PIM4 mode, using compiler options --pim3 or --pim4

$ ./m2c EBNFScanner.def --pim4

It should print 0 parse errors for this input.

m2c Modula-2 Compiler & Translator, version 1.00
parse error count: 0

Verbose Mode

To get more details on any reported warnings and errors, compiler switch --verbose may be used

$ ./m2c ProcType.def --pim4 --verbose

It should then print the source line for each warning or error and mark the offending lexeme with a caret '^'.

line 9, column 23, error: unexpected reserved word CONST found
  expected ARRAY, VAR or identifier.


Parser Debug Mode

To get feedback on what the parser is doing, compiler option --parser-debug may be used

$ ./m2c EBNFScanner.def --pim4 --parser-debug

It should then print the current syntax rule, line, column and lexeme.

  @ line: 1, column: 1, lookahead: DEFINITION
*** definition ***
  @ line: 3, column: 1, lookahead: TYPE
*** typeDefinition ***
  @ line: 3, column: 6, lookahead: P1


If you would like to contribute to the project, please get in touch via the M2C project's home page at savannah

or via the M2C project's IRC channel #m2c at OFTC

or via email to the developer or the maintainer

trijezdci (gmail) or sinuhe (

Of particular interest at this stage are contributions of OS specific versions of the fileutils and pathnames modules for yet unsupported host platforms. On the wish list are FreeMint, Haiku, NSK, Plan9 and zOS. Furthermore, volunteer testers are needed for host platforms that should be covered by the Windows version, in particular FreeDOS, MS-DOS and OS/2.