
Grammar extracted by Vadim Zaytsev, see the Grammar Zoo entry for details: occam/mu/mitchell/extracted
Source used for this grammar: K. Mitchell, µOCCAM, Chapter 1, The Grammar for µOCCAM, 1995 [µOCCAM Manual]
translation-unit, primary-expression, id-expression, unqualified-id, qualified-id, nested-name-specifier, class-or-namespace-name, postfix-expression, expression-list, pseudo-destructor-name, unary-expression, unary-operator, new-expression, new-placement, new-type-id, new-declarator, direct-new-declarator, new-initializer, delete-expression, cast-expression, pm-expression, multiplicative-expression, additive-expression, shift-expression, relational-expression, equality-expression, and-expression, exclusive-or-expression, inclusive-or-expression, logical-and-expression, logical-or-expression, conditional-expression, assignment-expression, assignment-operator, expression, constant-expression, statement, labeled-statement, expression-statement, compound-statement, statement-seq, selection-statement, condition, iteration-statement, for-init-statement, jump-statement, declaration-statement, declaration-seq, declaration, block-declaration, simple-declaration, decl-specifier, decl-specifier-seq, storage-class-specifier, function-specifier, typedef-name, type-specifier, simple-type-specifier, type-name, elaborated-type-specifier, enum-name, enum-specifier, enumerator-list, enumerator-definition, enumerator, namespace-name, original-namespace-name, namespace-definition, named-namespace-definition, original-namespace-definition, extension-namespace-definition, unnamed-namespace-definition, namespace-body, namespace-alias, namespace-alias-definition, qualified-namespace-specifier, using-declaration, using-directive, asm-definition, linkage-specification, init-declarator-list, init-declarator, declarator, direct-declarator, ptr-operator, cv-qualifier-seq, cv-qualifier, declarator-id, type-id, type-specifier-seq, abstract-declarator, direct-abstract-declarator, parameter-declaration-clause, parameter-declaration-list, parameter-declaration, function-definition, function-body, initializer, initializer-clause, initializer-list, class-name, class-specifier, class-head, class-key, member-specification, member-declaration, member-declarator-list, member-declarator, pure-specifier, constant-initializer, base-clause, base-specifier-list, base-specifier, access-specifier, conversion-function-id, conversion-type-id, conversion-declarator, ctor-initializer, mem-initializer-list, mem-initializer, mem-initializer-id, operator-function-id, operator, template-declaration, template-parameter-list, template-parameter, type-parameter, template-id, template-name, template-argument-list, template-argument, explicit-instantiation, explicit-specialization, try-block, function-try-block, handler-seq, handler, exception-declaration, throw-expression, exception-specification, type-id-list), 0 root (—), 1 top (translation-unit), 3 bottom (string-literal 3, literal, identifier 28).translation-unit ::=
declaration-seqprimary-expression ::= literal "this" "(" expression ")" id-expression
id-expression ::= unqualified-id qualified-id
unqualified-id ::=
identifier operator-function-id conversion-function-id "~" class-name template-idqualified-id ::= "::" nested-name-specifier "template" unqualified-id "::" identifier "::" operator-function-id "::" template-id
nested-name-specifier ::= class-or-namespace-name "::" nested-name-specifier class-or-namespace-name "::" "template" nested-name-specifier
class-or-namespace-name ::= class-name namespace-name
postfix-expression ::= primary-expression postfix-expression "[" expression "]" postfix-expression "(" expression-list ")" simple-type-specifier "(" expression-list ")" "typename" "::" nested-name-specifier identifier "(" expression-list ")" "typename" "::" nested-name-specifier "template" template-id "(" expression-list ")" postfix-expression "." "template" id-expression postfix-expression "->" "template" id-expression postfix-expression "." pseudo-destructor-name postfix-expression "->" pseudo-destructor-name postfix-expression "++" postfix-expression "--" "dynamic_cast" "<" type-id ">" "(" expression ")" "static_cast" "<" type-id ">" "(" expression ")" "reinterpret_cast" "<" type-id ">" "(" expression ")" "const_cast" "<" type-id ">" "(" expression ")" "typeid" "(" expression ")" "typeid" "(" type-id ")"
expression-list ::=
assignment-expression expression-list "," assignment-expressionpseudo-destructor-name ::= "::" nested-name-specifier type-name "::" "~" type-name "::" nested-name-specifier "template" template-id "::" "~" type-name "::" nested-name-specifier "~" type-name
unary-expression ::= postfix-expression "++" cast-expression "--" cast-expression unary-operator cast-expression "sizeof" unary-expression "sizeof" "(" type-id ")" new-expression delete-expression
unary-operator ::= "*" "&" "+" "-" "!" "~"
new-expression ::= "::" "new" new-placement new-type-id new-initializer "::" "new" new-placement "(" type-id ")" new-initializer
new-placement ::= "(" expression-list ")"
new-type-id ::=
type-specifier-seq new-declaratornew-declarator ::=
ptr-operator new-declarator direct-new-declaratordirect-new-declarator ::= "[" expression "]" direct-new-declarator "[" constant-expression "]"
new-initializer ::= "(" expression-list ")"
delete-expression ::= "::" "delete" cast-expression "::" "delete" "[" "]" cast-expression
cast-expression ::= unary-expression "(" type-id ")" cast-expression
pm-expression ::= cast-expression pm-expression ".*" cast-expression pm-expression "->*" cast-expression
multiplicative-expression ::= pm-expression multiplicative-expression "*" pm-expression multiplicative-expression "/" pm-expression multiplicative-expression "%" pm-expression
additive-expression ::= multiplicative-expression additive-expression "+" multiplicative-expression additive-expression "-" multiplicative-expression
shift-expression ::= additive-expression shift-expression "<<" additive-expression shift-expression ">>" additive-expression
relational-expression ::= shift-expression relational-expression "<" shift-expression relational-expression ">" shift-expression relational-expression "<=" shift-expression relational-expression ">=" shift-expression
equality-expression ::= relational-expression equality-expression "==" relational-expression equality-expression "!=" relational-expression
and-expression ::=
equality-expression and-expression "&" equality-expressionexclusive-or-expression ::=
and-expression exclusive-or-expression "^" and-expressioninclusive-or-expression ::=
exclusive-or-expression inclusive-or-expression "|" exclusive-or-expressionlogical-and-expression ::=
inclusive-or-expression logical-and-expression "&&" inclusive-or-expressionlogical-or-expression ::=
logical-and-expression logical-or-expression "||" logical-and-expressionconditional-expression ::= logical-or-expression logical-or-expression "?" expression ":" assignment-expression
assignment-expression ::= conditional-expression logical-or-expression assignment-operator assignment-expression throw-expression
assignment-operator ::= "=" "*=" "/=" "%=" "+=" "-=" ">>=" "<<=" "&=" "^=" "|="
expression ::=
assignment-expression expression "," assignment-expressionconstant-expression ::= conditional-expression
statement ::= labeled-statement expression-statement compound-statement selection-statement iteration-statement jump-statement declaration-statement try-block
labeled-statement ::= identifier ":" statement "case" constant-expression ":" statement "default" ":" statement
expression-statement ::= expression ";"
compound-statement ::= "{" statement-seq "}"
statement-seq ::= statement statement-seq statement
selection-statement ::= "if" "(" condition ")" statement "if" "(" condition ")" statement "else" statement "switch" "(" condition ")" statement
condition ::=
expression type-specifier-seq declarator "=" assignment-expressioniteration-statement ::= "while" "(" condition ")" statement "do" statement "while" "(" expression ")" ";" "for" "(" for-init-statement condition ";" expression ")" statement
for-init-statement ::= expression-statement simple-declaration
jump-statement ::= "break" ";" "continue" ";" "return" expression ";" "goto" identifier ";"
declaration-statement ::= block-declaration
declaration-seq ::= declaration declaration-seq declaration
declaration ::= block-declaration function-definition template-declaration explicit-instantiation explicit-specialization linkage-specification namespace-definition
block-declaration ::= simple-declaration asm-definition namespace-alias-definition using-declaration using-directive
simple-declaration ::= decl-specifier-seq init-declarator-list ";"
decl-specifier ::= storage-class-specifier type-specifier function-specifier "friend" "typedef"
decl-specifier-seq ::=
decl-specifier-seq decl-specifierstorage-class-specifier ::= "auto" "register" "static" "extern" "mutable"
function-specifier ::= "inline" "virtual" "explicit"
typedef-name ::= identifier
type-specifier ::= simple-type-specifier class-specifier enum-specifier elaborated-type-specifier cv-qualifier
simple-type-specifier ::= "::" nested-name-specifier type-name "::" nested-name-specifier "template" template-id "char" "wchar_t" "bool" "short" "int" "long" "signed" "unsigned" "float" "double" "void"
type-name ::= class-name enum-name typedef-name
elaborated-type-specifier ::= class-key "::" nested-name-specifier identifier "enum" "::" nested-name-specifier identifier "typename" "::" nested-name-specifier identifier "typename" "::" nested-name-specifier "template" template-id
enum-name ::= identifier
enum-specifier ::= "enum" identifier "{" enumerator-list "}"
enumerator-list ::=
enumerator-definition enumerator-list "," enumerator-definitionenumerator-definition ::=
enumerator enumerator "=" constant-expressionenumerator ::= identifier
namespace-name ::= original-namespace-name namespace-alias
original-namespace-name ::= identifier
namespace-definition ::= named-namespace-definition unnamed-namespace-definition
named-namespace-definition ::= original-namespace-definition extension-namespace-definition
original-namespace-definition ::= "namespace" identifier "{" namespace-body "}"
extension-namespace-definition ::= "namespace" original-namespace-name "{" namespace-body "}"
unnamed-namespace-definition ::= "namespace" "{" namespace-body "}"
namespace-body ::=
declaration-seqnamespace-alias ::= identifier
namespace-alias-definition ::= "namespace" identifier "=" qualified-namespace-specifier ";"
qualified-namespace-specifier ::= "::" nested-name-specifier namespace-name
using-declaration ::= "using" "typename" "::" nested-name-specifier unqualified-id ";" "using" "::" unqualified-id ";"
using-directive ::= "using" "namespace" "::" nested-name-specifier namespace-name ";"
asm-definition ::= "asm" "(" string-literal ")" ";"
linkage-specification ::= "extern" string-literal "{" declaration-seq "}" "extern" string-literal declaration
init-declarator-list ::=
init-declarator init-declarator-list "," init-declaratorinit-declarator ::=
declarator initializerdeclarator ::= direct-declarator ptr-operator declarator
direct-declarator ::= declarator-id direct-declarator "(" parameter-declaration-clause ")" cv-qualifier-seq exception-specification direct-declarator "[" constant-expression "]" "(" declarator ")"
ptr-operator ::= "*" cv-qualifier-seq "&" "::" nested-name-specifier "*" cv-qualifier-seq
cv-qualifier-seq ::=
cv-qualifier cv-qualifier-seqcv-qualifier ::= "const" "volatile"
declarator-id ::= id-expression "::" nested-name-specifier type-name
type-id ::=
type-specifier-seq abstract-declaratortype-specifier-seq ::=
type-specifier type-specifier-seqabstract-declarator ::=
ptr-operator abstract-declarator direct-abstract-declaratordirect-abstract-declarator ::= direct-abstract-declarator "(" parameter-declaration-clause ")" cv-qualifier-seq exception-specification direct-abstract-declarator "[" constant-expression "]" "(" abstract-declarator ")"
parameter-declaration-clause ::= parameter-declaration-list "..." parameter-declaration-list "," "..."
parameter-declaration-list ::=
parameter-declaration parameter-declaration-list "," parameter-declarationparameter-declaration ::= decl-specifier-seq declarator decl-specifier-seq declarator "=" assignment-expression decl-specifier-seq abstract-declarator decl-specifier-seq abstract-declarator "=" assignment-expression
function-definition ::= decl-specifier-seq declarator ctor-initializer function-body decl-specifier-seq declarator function-try-block
function-body ::= compound-statement
initializer ::= "=" initializer-clause "(" expression-list ")"
initializer-clause ::= assignment-expression "{" initializer-list "," "}" "{" "}"
initializer-list ::=
initializer-clause initializer-list "," initializer-clauseclass-name ::= identifier template-id
class-specifier ::= class-head "{" member-specification "}"
class-head ::= class-key identifier base-clause class-key nested-name-specifier identifier base-clause class-key nested-name-specifier template-id base-clause
class-key ::= "class" "struct" "union"
member-specification ::= member-declaration member-specification access-specifier ":" member-specification
member-declaration ::= decl-specifier-seq member-declarator-list ";" function-definition ";" "::" nested-name-specifier "template" unqualified-id ";" using-declaration template-declaration
member-declarator-list ::=
member-declarator member-declarator-list "," member-declaratormember-declarator ::= declarator pure-specifier declarator constant-initializer identifier ":" constant-expression
pure-specifier ::= "=" "0"
constant-initializer ::=
"=" constant-expressionbase-clause ::=
":" base-specifier-listbase-specifier-list ::=
base-specifier base-specifier-list "," base-specifierbase-specifier ::= "::" nested-name-specifier class-name "virtual" access-specifier "::" nested-name-specifier class-name access-specifier "virtual" "::" nested-name-specifier class-name
access-specifier ::= "private" "protected" "public"
conversion-function-id ::=
"operator" conversion-type-idconversion-type-id ::=
type-specifier-seq conversion-declaratorconversion-declarator ::=
ptr-operator conversion-declaratorctor-initializer ::=
":" mem-initializer-listmem-initializer-list ::=
mem-initializer mem-initializer "," mem-initializer-listmem-initializer ::= mem-initializer-id "(" expression-list ")"
mem-initializer-id ::= "::" nested-name-specifier class-name identifier
operator-function-id ::=
"operator" operatoroperator ::= "new" "delete" "new" "[]" "delete" "[]" "+" "-" "*" "/" "%" "^" "&" "|" "~" "!" "=" "<" ">" "+=" "-=" "*=" "/=" "%=" "^=" "&=" "|=" "<<" ">>" ">>=" "<<=" "==" "!=" "<=" ">=" "&&" "||" "++" "--" "," "->*" "->" "()" "[]"
template-declaration ::= "export" "template" "<" template-parameter-list ">" declaration
template-parameter-list ::=
template-parameter template-parameter-list "," template-parametertemplate-parameter ::= type-parameter parameter-declaration
type-parameter ::= "class" identifier "class" identifier "=" type-id "typename" identifier "typename" identifier "=" type-id "template" "<" template-parameter-list ">" "class" identifier "template" "<" template-parameter-list ">" "class" identifier "=" id-expression
template-id ::= template-name "<" template-argument-list ">"
template-name ::= identifier
template-argument-list ::=
template-argument template-argument-list "," template-argumenttemplate-argument ::= assignment-expression type-id id-expression
explicit-instantiation ::=
"template" declarationexplicit-specialization ::= "template" "<" ">" declaration
try-block ::=
"try" compound-statement handler-seqfunction-try-block ::= "try" ctor-initializer function-body handler-seq
handler-seq ::=
handler handler-seqhandler ::= "catch" "(" exception-declaration ")" compound-statement
exception-declaration ::=
type-specifier-seq declarator type-specifier-seq abstract-declarator type-specifier-seq "..."throw-expression ::= "throw" assignment-expression
exception-specification ::= "throw" "(" type-id-list ")"
type-id-list ::=
type-id type-id-list "," type-id