8. Appendix
8.5. Appendix E: C Grammar in BNF Format
/*
* Lexical Specification -- TOKENS * */ <DEFAULT> MORE : { <PREPROCESSOR_START: "#"> : INSIDE_PREPROCESSOR } <INSIDE_PREPROCESSOR> MORE : { <PREPROCESSOR_DATA: "\\" ("\r" | "\n" | "\r\n") | <ANYCHAR>> } <INSIDE_PREPROCESSOR> SPECIAL : { <PREPROCESSOR_END: "\r" | "\n" | "\r\n"> : DEFAULT } <DEFAULT> MORE : {
<BLOCK_START: <BLOCK_COMMENT_START>> : INSIDE_BLOCK_COMMENT }
<INSIDE_BLOCK_COMMENT> MORE : { <INSIDE_COMMENTS: <ANYCHAR>> }
<INSIDE_BLOCK_COMMENT> SPECIAL : {
<BLOCK_END: <BLOCK_COMMENT_END>> : DEFAULT }
<DEFAULT> SPECIAL : {
<LINE_COMMENT: <DOUBLE_SLASHES> (<ANYCHAR_NOT_EOL>)*> } <DEFAULT> SKIP : { <SPACE: " " | "\t"> | <EOL: "\r" | "\n" | "\r\n"> } <DEFAULT> TOKEN : {
<INTEGER: <OCTAL> (<INTEGER_SUFFIX>)? | <DEC> (<INTEGER_SUFFIX>)? | <HEX> (<INTEGER_SUFFIX>)?>
| <REAL: <WHOLE> <DPOINT> (<FRACTION>)? (<EXPONENT>)? (<REAL_SUFFIX>)? | <DPOINT> <FRACTION> (<EXPONENT>)? (<REAL_SUFFIX>)? | <FRACTION> <EXPONENT> (<REAL_SUFFIX>)? | <WHOLE> (<EXPONENT>)? (<REAL_SUFFIX>)?>
| <CHARACTER: "\'" (<ANYCHAR_NOT_ESCAPE> | <ESCAPE_SEQUENCE>)? "\'">
| <STRING: "\"" (<ANYCHAR_NOT_ESCAPE> | <ESCAPE_SEQUENCE> | "\\" ("\r" | "\n" | "\r\n"))* "\""> | <AUTO: "auto"> | <REGISTER: "register"> | <EXTERN: "extern"> | <STRUCT: "struct"> | <UNION: "union"> | <STATIC: "static"> | <TYPEDEF: "typedef"> | <ENUM: "enum"> | <CONST: "const"> | <VOLATILE: "volatile"> | <VOID: "void"> | <CHAR: "char"> | <SHORT: "short"> | <INT: "int"> | <LONG: "long"> | <FLOAT: "float"> | <DOUBLE: "double"> | <SIGNED: "signed">
| <ELSE: "else"> | <SWITCH: "switch"> | <CASE: "case"> | <FOR: "for"> | <DO: "do"> | <WHILE: "while"> | <BREAK: "break"> | <CONTINUE: "continue"> | <CDEFAULT: "default"> | <GOTO: "goto"> | <SIZEOF: "sizeof"> | <RETURN: "return"> | <PLUS_PLUS: "++"> | <MINUS_MINUS: "--"> | <POINTER_SELECT: "->"> | <DOT: <PERIOD>> | <LEFT_PAREN: "("> | <RIGHT_PAREN: ")"> | <LEFT_BRACKET: "["> | <RIGHT_BRACKET: "]"> | <LEFT_BRACE: "{"> | <RIGHT_BRACE: "}"> | <AMPERSAND: "&"> | <STAR: "*"> | <PLUS: "+"> | <MINUS: "-"> | <BITWISE_NOT: "~"> | <LOGICAL_NOT: "!"> | <SLASH: "/"> | <PERCENT: "%"> | <SHIFT_LEFT: "<<"> | <SHIFT_RIGHT: ">>"> | <LESS_THAN: "<"> | <GREATER_THAN: ">"> | <LESS_EQUALS: "<="> | <GREATER_EQUALS: ">="> | <EQUALS_EQUALS: "=="> | <NOT_EQUALS: "!="> | <BITWISE_XOR: "^"> | <BITWISE_OR: "|"> | <LOGICAL_AND: "&&"> | <LOGICAL_OR: "||"> | <QUESTION_MARK: "?"> | <COLON: ":"> | <EQUALS: "="> | <STAR_EQUALS: "*="> | <SLASH_EQUALS: "/="> | <PERCENT_EQUALS: "%="> | <PLUS_EQUALS: "+="> | <MINUS_EQUALS: "-="> | <LESS_LESS_EQUALS: "<<="> | <GREATER_GREATER_EQUALS: ">>="> | <BITWISE_OR_EQUALS: "|="> | <AMP_EQUALS: "&="> | <BITWISE_XOR_EQUALS: "^="> | <SEMICOLON: ";"> | <COMMA: ","> | <SINGLE_QUOTE: "\'"> | <DOUBLE_QUOTE: "\""> | <AT_SIGN: "@"> | <THREE_DOTS: "..."> | <SLASH_SLASH: <DOUBLE_SLASHES>> | <SLASH_STAR: <BLOCK_COMMENT_START>> | <STAR_SLASH: <BLOCK_COMMENT_END>>
| <IDENTIFIER: ("_" | <LETTER>) ("_" | <LETTER> | <DIGIT>)*> | <#PERIOD: "."> | <#ANYCHAR: ~[]> | <#ANYCHAR_NOT_EOL: ~["\n","\r"]> | <#ANYCHAR_NOT_ESCAPE: ~["\n","\r","\'","\"","\\"]> | <#ESCAPE_SEQUENCE: "\\" (["a","b","f","n","r","t","v","\'","\"","?","\\","0"] | (["0"- "7"]){1,3} | ["x","X"] (["0"-"9","a"-"f","A"-"F"]){1,4})>
| <#LETTER: ["A"-"Z"] | ["a"-"z"]> | <#DIGIT: ["0"-"9"]>
| <#DIGIT_NOT_ZERO: ["1"-"9"]> | <#OCTAL: "0" (["0"-"7"])*>
| <#DEC: <DIGIT_NOT_ZERO> (<DIGIT>)*>
| <#HEX: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+>
| <#INTEGER_SUFFIX: ["L","l"] (["U","u"])? | ["U","u"] (["L","l"])?> | <#REAL_SUFFIX: ["L","l","F","f"]>
| <#WHOLE: (<DIGIT>)+> | <#DPOINT: <PERIOD>> | <#FRACTION: (<DIGIT>)+>
| <#EXPONENT: ["e","E"] (["+","-"])? (<DIGIT>)+> | <#BLOCK_COMMENT_START: "/*">
| <#BLOCK_COMMENT_END: "*/"> | <#DOUBLE_SLASHES: "//"> }
/*
* Syntactic Specification -- NON-TERMINALS *
*/
parse := ( externalDeclaration )+
externalDeclaration := ( functionDefinition | declaration )
functionDefinition := ( declarationSpecifiers )? declarator ( declarationList )? compoundStatement
functionDefinitionLookahead := ( declarationSpecifiers )? declarator ( declarationList )? <LEFT_BRACE>
declarationList := ( declaration )+
declaration := declarationSpecifiers ( initDeclaratorList )? <SEMICOLON>
declarationSpecifiers := ( storageClassSpecifier ( declarationSpecifiers )? | typeSpecifier ( declarationSpecifiers )? | typeQualifier ( declarationSpecifiers )? ) initDeclaratorList := initDeclarator ( <COMMA> initDeclarator )*
initDeclarator := declarator ( <EQUALS> initializer )?
initializer := ( assignmentExpression | <LEFT_BRACE> initializerList ( <COMMA> )? <RIGHT_BRACE> )
initializerList := initializer ( <COMMA> initializer )*
typeName := specifierQualifierList ( abstractDeclarator )?
storageClassSpecifier := ( <AUTO> | <REGISTER> | <STATIC> | <EXTERN> | <TYPEDEF> )
typeSpecifier := ( <VOID> | <CHAR> | <SHORT> | <INT> | <LONG> | <FLOAT> | <DOUBLE> | <SIGNED> | <UNSIGNED> | structOrUnionSpecifier | enumSpecifier | typedefName )
typedefName := identifier
typeQualifier := ( <CONST> | <VOLATILE> )
structOrUnionSpecifier := structOrUnion ( ( identifier )? <LEFT_BRACE> structDeclarationList <RIGHT_BRACE> | identifier )
structOrUnion := ( <STRUCT> | <UNION> ) structDeclarationList := ( structDeclaration )+
structDeclaration := specifierQualifierList structDeclaratorList <SEMICOLON> specifierQualifierList := typeSpecifier ( specifierQualifierList )? |
typeQualifier ( specifierQualifierList )?
structDeclaratorList := structDeclarator ( <COMMA> structDeclarator )* structDeclarator := ( declarator | typeSpecifier ( declarator )? <COLON> constantExpression )
enumSpecifier := <ENUM> ( ( identifier )? <LEFT_BRACE> enumeratorList <RIGHT_BRACE> | identifier )
enumeratorList := enumerator ( <COMMA> enumerator )*
enumerator := identifier ( <EQUALS> constantExpression )? declarator := ( pointer )? directDeclarator
pointer := <STAR> ( typeQualifierList )? ( pointer )? typeQualifierList := ( typeQualifier )+
directDeclarator := ( ( identifier | <LEFT_PAREN> declarator <RIGHT_PAREN> ) ( <LEFT_BRACKET> ( constantExpression )? <RIGHT_BRACKET> | <LEFT_PAREN>
parameterTypeList <RIGHT_PAREN> | <LEFT_PAREN> ( identifierList )? <RIGHT_PAREN> )* ) parameterTypeList := parameterList ( <COMMA> <THREE_DOTS> )?
abstractDeclarator := ( pointer | ( pointer )? directAbstractDeclarator ) directAbstractDeclarator := ( <LEFT_PAREN> abstractDeclarator <RIGHT_PAREN> | <LEFT_BRACKET> ( constantExpression )? <RIGHT_BRACKET> | <LEFT_PAREN> ( parameterTypeList )? <RIGHT_PAREN> ) ( <LEFT_BRACKET> ( constantExpression )? <RIGHT_BRACKET> |
<LEFT_PAREN> ( parameterTypeList )? <RIGHT_PAREN> )*
identifierList := identifier ( <COMMA> identifier )* statementList := ( statement )+
statement := ( compoundStatement | labeledStatement | jumpStatement | expressionStatement | ifStatement | switchStatement | forStatement | whileStatement | doWhileStatement )
compoundStatement := <LEFT_BRACE> ( declarationList )? ( statementList )? <RIGHT_BRACE>
labeledStatement := ( <CASE> constantExpression <COLON> statement | <CDEFAULT> <COLON> statement | identifier <COLON> statement )
jumpStatement := ( <GOTO> identifier <SEMICOLON> | <BREAK> <SEMICOLON> | <CONTINUE> <SEMICOLON> | <RETURN> ( expression )? <SEMICOLON> )
expressionStatement := ( expression )? <SEMICOLON>
ifStatement := <IF> <LEFT_PAREN> expression <RIGHT_PAREN> statement ( <ELSE> statement )?
switchStatement := <SWITCH> <LEFT_PAREN> expression <RIGHT_PAREN> statement
forStatement := ( ( <FOR> ) <LEFT_PAREN> ( ( typeSpecifier )? expression )? <SEMICOLON> ( expression )? <SEMICOLON> ( expression )? <RIGHT_PAREN> statement )
whileStatement := <WHILE> <LEFT_PAREN> expression <RIGHT_PAREN> statement doWhileStatement := <DO> statement <WHILE> <LEFT_PAREN> expression
<RIGHT_PAREN> <SEMICOLON>
expression := ( assignmentExpression ( <COMMA> assignmentExpression )* )
assignmentExpression := ( unaryExpression ( <EQUALS> | <STAR_EQUALS> |
<SLASH_EQUALS> | <PERCENT_EQUALS> | <PLUS_EQUALS> | <MINUS_EQUALS> | <LESS_LESS_EQUALS> | <GREATER_GREATER_EQUALS> | <BITWISE_OR_EQUALS> | <AMP_EQUALS> | <BITWISE_XOR_EQUALS> ) assignmentExpression | conditionalExpression )
constantExpression := conditionalExpression
conditionalExpression := logicalORExpression ( <QUESTION_MARK> expression <COLON> conditionalExpression )?
logicalORExpression := logicalANDExpression ( <LOGICAL_OR> logicalORExpression )?
logicalANDExpression := bitwiseORExpression ( <LOGICAL_AND> logicalANDExpression )?
bitwiseORExpression := bitwiseXORExpression ( <BITWISE_OR> bitwiseORExpression )?
bitwiseXORExpression := bitwiseANDExpression ( <BITWISE_XOR> bitwiseXORExpression )?
bitwiseANDExpression := equalityExpression ( <AMPERSAND> bitwiseANDExpression )?
equalityExpression := relationalExpression ( ( <EQUALS_EQUALS> | <NOT_EQUALS> ) equalityExpression )?
relationalExpression := shiftExpression ( ( <LESS_THAN> | <LESS_EQUALS> | <GREATER_THAN> | <GREATER_EQUALS> ) relationalExpression )?
shiftExpression := additiveExpression ( ( <SHIFT_LEFT> | <SHIFT_RIGHT> ) shiftExpression )?
additiveExpression := multiplicativeExpression ( ( <PLUS> | <MINUS> ) additiveExpression )?
multiplicativeExpression := castExpression ( ( <STAR> | <SLASH> | <PERCENT> ) multiplicativeExpression )?
castExpression := ( <LEFT_PAREN> typeName <RIGHT_PAREN> castExpression | unaryExpression )
unaryExpression := ( ( postfixExpression ) | ( <PLUS_PLUS> | <MINUS_MINUS> ) ( unaryExpression ) | ( <AMPERSAND> | <STAR> | <PLUS> | <MINUS> | <BITWISE_NOT> | <LOGICAL_NOT> ) castExpression | <SIZEOF> ( unaryExpression | <LEFT_PAREN> typeName <RIGHT_PAREN> ) )
postfixExpression := ( ( primaryExpression ) ( ( <LEFT_BRACKET> expression <RIGHT_BRACKET> | <LEFT_PAREN> ( expression )? <RIGHT_PAREN> | <DOT> identifier | <POINTER_SELECT> identifier | <PLUS_PLUS> | <MINUS_MINUS> ) )* )
primaryExpression := ( identifier | constant | <LEFT_PAREN> expression <RIGHT_PAREN> )
identifier := ( <IDENTIFIER> )
constant := ( integer | real | string | character ) integer := ( <INTEGER> )
string := ( <STRING> ) character := ( <CHARACTER> )