Every Letlang module (which correspond to a source file with the extension .let) MUST begin with a module_decl_statement rule.

Rule: unit

module_decl_statementstatement

Rule: module_decl_statement

moduleidentifier::;

Rule: statement

import_statementeffect_decl_statementclass_decl_statementfunc_decl_statement

Rule: identifier

[_a-zA-Z][_0-9a-zA-Z]
unit
  = module_decl_statement statement*

module_decl_statement
  = "module" path:(identifier ("::" identifier)*) ";"

statement
  = import_statement
  / effect_decl_statement
  / class_decl_statement
  / func_decl_statement

identifier
  = [_a-zA-Z][_0-9a-zA-Z]*

Examples:

module std::io;
module foo::main;

Every module path MUST be unique.