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.

