The railroad diagrams on the other pages, as EBNF. { x } is zero or more, [ x ] optional, | a choice; keywords are case-insensitive; blanks (space, tab, CR) may separate any two tokens on a line.

message_file       = { empty_line | directive | message } ;
empty_line         = [ comment ] end_of_line ;
comment            = "#" { any character but newline } ;
end_of_line        = [ comment ] ( newline | end of file ) ;

directive          = "$" ( module_directive | namespace_directive
                         | include_directive | import_directive
                         | using_directive | export_directive
                         | language_directive | artefact_directive ) end_of_line ;
module_directive   = "MODULE" module_name { "HEADER" extension | "NOHEADER"
                         | "SOURCE" extension | "INLINE" | "NOSOURCE" } ;
namespace_directive= "NAMESPACE" [ qualified_name ] ;
include_directive  = "INCLUDE" ( '"' file '"' | "<" file ">" | name ) ;
import_directive   = "IMPORT" ( '"' file '"' | rest_of_line ) ;
using_directive    = "USING" rest_of_line ;
export_directive   = "EXPORT" [ name ] ;
language_directive = "LANGUAGE" language_name | "CHARSET" charset_name ;

artefact_directive = ( "STRING" | "THROW" ) { common_option | function_option }-
                   | "ERROR"  { common_option | function_option | exit_option }-
                   | "SYSLOG" { common_option | function_option | syslog_option }-
                   | "STREAMABLE" { common_option | class_option }-
                   | "EXCEPTION"  { common_option | class_option | override_option }- ;
common_option      = "ENABLE" | "DISABLE" | ( "PREFIX" | "POSTFIX" ) name
                   | "NOPREFIX" | "NOPOSTFIX"
                   | "LOCALE" "EXTRA" ( "ENABLE" | "DISABLE" ) ;
class_option       = ( "INHERITED" | "PARENT" )
                     [ "PUBLIC" | "PROTECTED" | "PRIVATE" ] qualified_name ;
override_option    = "OVERRIDE" ( name | "NONE" ) ;
function_option    = "NONMEMBER"
                   | [ "CONST" | "NONCONST" ] "MEMBER"
                     ( "OF" qualified_name | "AS" name ) ;
exit_option        = "EXIT" rest_of_line ;
syslog_option      = "FACILITY" facility | "LEVEL" level ;

message            = "$" "MESSAGE" name [ ":" artefact_name { artefact_name } ] end_of_line
                     { parameter | empty_line }
                     { text_line | language_header | empty_line } ;
artefact_name      = "STRING" | "STREAMABLE" | "ERROR" | "EXCEPTION" | "THROW" | "SYSLOG" ;
parameter          = "@" name cpp_type end_of_line ;
language_header    = "[" language_name [ charset_name ] "]" end_of_line ;
text_line          = single_quoted | double_quoted | bar_text ;
single_quoted      = "'" { character | escape } "'" end_of_line ;
double_quoted      = '"' { character | escape | macro } '"' end_of_line ;
bar_text           = "|" { character | escape | macro } ( newline | "\" newline ) ;
macro              = "{$" expression { ";" format } "}" ;
escape             = "\" ( "n" | "t" | "r" | "a" | "b" | "f" | "v"
                         | "\" | "'" | '"' | "{"
                         | octal [ octal [ octal ] ] | "x" hex [ hex ] ) ;

name               = ( letter | "_" ) { letter | digit | "_" } ;
qualified_name     = name { "::" name } ;
language_name      = { letter | digit | "_" | "." | "-" | "@" }- ;
module_name        = { letter | digit | "_" | "-" }- ;
extension          = { letter | digit | "_" | "+" }- ;

{ x }- means one or more. rest_of_line runs to a # or the end of the line and is trimmed; cpp_type, expression, format and file are taken as text and copied into the generated C++.

The diagrams are drawn from the docs/grammar/*.rrd sources in the mstring repository.