Created
July 18, 2013 00:56
-
-
Save aamedina/6025901 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
translation-unit: | |
external-declaration+ | |
external-declaration: | |
<ws> function-definition <ws> | | |
<ws> declaration <ws> | |
function-definition: | |
declaration-specifiers <ws> declarator <ws> declaration-list? <ws> compound-statement | |
declaration-list: | |
(<ws> declaration)+ <ws> | |
ws: | |
#'\s*' | |
identifier: | |
<ws> #'[a-zA-Z_][a-zA-Z_0-9]*' <ws> | |
identifier-nondigit: | |
<ws> nondigit <ws> | | |
<ws> universal-character-name <ws> | |
nondigit: | |
#'[A-Za-z_]' | |
digit: | |
#'[\d]' | |
universal-character-name: | |
'\\u' <ws> hex-quad <ws> | | |
'\\U' <ws> hex-quad <ws> <ws> hex-quad <ws> | |
hex-quad: | |
hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit | |
constant: | |
integer-constant | | |
floating-constant | | |
enumeration-constant | | |
character-constant | |
integer-constant: | |
decimal-constant integer-suffix? | | |
octal-constant integer-suffix? | | |
hexadecimal-constant integer-suffix? | |
decimal-constant: | |
nonzero-digit | | |
decimal-constant digit | |
octal-constant: | |
'0' | | |
octal-constant octal-digit | |
hexadecimal-constant: | |
hexadecimal-prefix hexadecimal-digit | | |
hexadecimal-constant hexadecimal-digit | |
hexadecimal-prefix: | |
'0x' | '0X' | |
nonzero-digit: | |
#'[1-9]' | |
octal-digit: | |
#'[0-7]' | |
hexadecimal-digit: | |
#'[0-9a-fA-F]' | |
integer-suffix: | |
unsigned-suffix long-suffix? | | |
unsigned-suffix long-long-suffix | | |
long-suffix unsigned-suffix? | | |
long-long-suffix unsigned-suffix? | |
unsigned-suffix: | |
'u' | 'U' | |
long-suffix: | |
'l' | 'L' | |
long-long-suffix: | |
'll' | 'LL' | |
floating-constant: | |
decimal-floating-constant | | |
hexadecimal-floating-constant | |
decimal-floating-constant: | |
fractional-constant exponent-part? floating-suffix? | | |
digit-sequence exponent-part floating-suffix? | |
hexadecimal-floating-constant: | |
hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part | |
floating-suffix? | | |
hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part | |
floating-suffix? | |
fractional-constant: | |
digit-sequence? '.' digit-sequence | | |
digit-sequence '.' | |
exponent-part: | |
'e' sign? digit-sequence | | |
'E' sign? digit-sequence | |
sign: | |
#'[+-]' | |
digit-sequence: | |
digit | | |
digit-sequence digit | |
hexadecimal-fractional-constant: | |
hexadecimal-digit-sequence? "." hexadecimal-digit-sequence | | |
hexadecimal-digit-sequence "." | |
binary-exponent-part: | |
'p' sign? digit-sequence | | |
'P' sign? digit-sequence | |
hexadecimal-digit-sequence: | |
hexadecimal-digit | | |
hexadecimal-digit-sequence hexadecimal-digit | |
floating-suffix: | |
#'[flFL]' | |
enumeration-constant: | |
<ws> identifier <ws> | |
character-constant: | |
"'" c-char "'" | | |
"L'" c-char "'" | |
c-char-sequence: | |
c-char | | |
c-char-sequence c-char | |
c-char: | |
#'[^\'\n\\]' | | |
escape-sequence | |
escape-sequence: | |
simple-escape-sequence | | |
octal-escape-sequence | | |
hexadecimal-escape-sequence | | |
universal-character-name | |
simple-escape-sequence: | |
#'\\[\'\"?abfnrtv]' | |
octal-escape-sequence: | |
'\\' octal-digit | | |
'\\' octal-digit octal-digit | | |
'\\' octal-digit octal-digit octal-digit | |
hexadecimal-escape-sequence: | |
'\\x' hexadecimal-digit | | |
hexadecimal-escape-sequence hexadecimal-digit | |
string-literal: | |
'\"' s-char-sequence? '\"' | | |
'L\"' s-char-sequence? '\"' | |
s-char-sequence: | |
#'([^\"\n\\]|\\[\'\"?abfnrtv])+' | |
s-char: | |
#'([^\"\n\\]|[\'\"?abfnrtv])*' | | |
escape-sequence | |
header-name: | |
'<' h-char-sequence '>' | | |
'\"' q-char-sequence '\"' | |
h-char-sequence: | |
h-char | | |
h-char-sequence h-char | |
h-char: | |
#'[^\n>]' | |
q-char-sequence: | |
q-char | | |
q-char-sequence q-char | |
q-char: | |
#'[^\n\"]' | |
primary-expression: | |
<ws> identifier <ws> | | |
<ws> constant <ws> | | |
<ws> string-literal <ws> | | |
<ws> "(" <ws> expression <ws> ")" <ws> | |
postfix-expression: | |
<ws> primary-expression <ws> | | |
<ws> postfix-expression <ws> "[" <ws> expression <ws> "]" | | |
<ws> postfix-expression <ws> "(" <ws> argument-expression-list? <ws> ")" | | |
<ws> postfix-expression <ws> "." <ws> identifier <ws> | | |
<ws> postfix-expression <ws> "->" <ws> identifier <ws> | | |
<ws> postfix-expression <ws> "++" | | |
<ws> postfix-expression <ws> "--" | | |
"(" <ws> type-name <ws> ")" "{" <ws> initializer-list <ws> "}" | | |
"(" <ws> type-name <ws> ")" "{" <ws> initializer-list <ws> "," "}" | |
argument-expression-list: | |
<ws> assignment-expression ( <ws> "," <ws> assignment-expression )* <ws> | |
unary-expression: | |
<ws> postfix-expression <ws> | | |
"++" <ws> unary-expression <ws> | | |
"--" <ws> unary-expression <ws> | | |
<ws> unary-operator <ws> <ws> cast-expression <ws> | | |
"sizeof" <ws> unary-expression <ws> | | |
"sizeof" "(" <ws> type-name <ws> ")" | |
unary-operator: | |
<ws> ('&' | '*' | '+' | '-' | '~' | '!') <ws> | |
cast-expression: | |
<ws> unary-expression <ws> | | |
"(" <ws> type-name <ws> ")" <ws> cast-expression <ws> | |
multiplicative-expression: | |
<ws> cast-expression <ws> | | |
<ws> multiplicative-expression <ws> "*" <ws> cast-expression <ws> | | |
<ws> multiplicative-expression <ws> "/" <ws> cast-expression <ws> | | |
<ws> multiplicative-expression <ws> "%" <ws> cast-expression <ws> | |
additive-expression: | |
<ws> multiplicative-expression <ws> | | |
<ws> additive-expression <ws> "+" <ws> multiplicative-expression <ws> | | |
<ws> additive-expression <ws> "-" <ws> multiplicative-expression <ws> | |
shift-expression: | |
<ws> additive-expression <ws> | | |
<ws> shift-expression <ws> "<<" <ws> additive-expression <ws> | | |
<ws> shift-expression <ws> ">>" <ws> additive-expression <ws> | |
relational-expression: | |
<ws> shift-expression <ws> | | |
<ws> relational-expression <ws> "<" <ws> shift-expression <ws> | | |
<ws> relational-expression <ws> ">" <ws> shift-expression <ws> | | |
<ws> relational-expression <ws> "<=" <ws> shift-expression <ws> | | |
<ws> relational-expression <ws> ">=" <ws> shift-expression <ws> | |
equality-expression: | |
<ws> relational-expression <ws> | | |
<ws> equality-expression <ws> "==" <ws> relational-expression <ws> | | |
<ws> equality-expression <ws> "!=" <ws> relational-expression <ws> | |
AND-expression: | |
<ws> equality-expression <ws> | | |
<ws> AND-expression <ws> "&" <ws> equality-expression <ws> | |
exclusive-OR-expression: | |
<ws> AND-expression <ws> | | |
<ws> exclusive-OR-expression <ws> "^" <ws> AND-expression <ws> | |
inclusive-OR-expression: | |
<ws> exclusive-OR-expression <ws> | | |
<ws> inclusive-OR-expression <ws> "|" <ws> exclusive-OR-expression <ws> | |
logical-AND-expression: | |
<ws> inclusive-OR-expression <ws> | | |
<ws> logical-AND-expression <ws> "&&" <ws> inclusive-OR-expression <ws> | |
logical-OR-expression: | |
<ws> logical-AND-expression <ws> | | |
<ws> logical-OR-expression <ws> "||" <ws> logical-AND-expression <ws> | |
conditional-expression: | |
<ws> logical-OR-expression <ws> | | |
<ws> logical-OR-expression <ws> "?" <ws> expression <ws> ":" <ws> conditional-expression <ws> | |
assignment-expression: | |
<ws> conditional-expression <ws> | | |
<ws> unary-expression <ws> assignment-operator <ws> assignment-expression <ws> | |
assignment-operator: | |
<ws> '=' <ws> | | |
<ws> '*=' <ws> | | |
<ws> '/=' <ws> | | |
<ws> '%=' <ws> | | |
<ws> '+=' <ws> | | |
<ws> '-=' <ws> | | |
<ws> '<<=' <ws> | | |
<ws> '>>=' <ws> | | |
<ws> '&=' <ws> | | |
<ws> '^=' <ws> | | |
<ws> '|=' <ws> | |
expression: | |
<ws> assignment-expression ( <ws> ',' <ws> assignment-expression )* <ws> | |
constant-expression: | |
<ws> conditional-expression <ws> | |
declaration: | |
<ws> declaration-specifiers <ws> init-declarator-list? <ws> ';' <ws> | |
declaration-specifiers: | |
(<ws> storage-class-specifier / <ws> type-specifier / <ws> type-qualifier / <ws> function-specifier)+ <ws> | |
init-declarator-list: | |
<ws> init-declarator ( <ws> ',' <ws> init-declarator )* <ws> | |
init-declarator: | |
<ws> declarator <ws> | | |
<ws> declarator <ws> '=' <ws> initializer <ws> | |
storage-class-specifier: | |
'typedef' | 'extern' | 'static' | 'auto' | 'register' | |
type-specifier: | |
( | |
'void' | 'char' | 'uchar' | 'short' | 'ushort' | 'int' | 'int2' | 'int4' | | |
'uint' | 'long' | 'char2' | 'char4' | 'float2' | 'float4' | 'long2' | 'long4' | | |
'ulong'| 'float' | 'double' |'half' | 'signed' | 'unsigned' | '_Bool' | 'bool' | | |
'_Complex' | '_Imaginary' | 'size_t' | 'ptrdiff_t' | 'intptr_t' | 'uintptr_t' | | |
'image2d_t' | 'image3d_t' | 'image2d_array_t' | 'image1d_t' | 'event_t' | | |
'image1d_buffer_t' | 'image1d_array_t' | 'sampler_t' | |
) / | |
(<ws> struct-or-union-specifier <ws> | | |
<ws> enum-specifier <ws> | | |
<ws> typedef-name <ws>) | |
struct-or-union-specifier: | |
<ws> struct-or-union <ws> identifier? <ws> '{' <ws> struct-declaration-list <ws> '}' <ws> | | |
<ws> struct-or-union <ws> identifier <ws> | |
struct-or-union: | |
<ws> (<ws> 'struct' <ws> | <ws> 'union' <ws>) <ws> | |
struct-declaration-list: | |
(<ws> struct-declaration)+ <ws> | |
struct-declaration: | |
<ws> specifier-qualifier-list <ws> struct-declarator-list <ws> ';' <ws> | |
specifier-qualifier-list: | |
<ws> type-specifier <ws> specifier-qualifier-list? <ws> | | |
<ws> type-qualifier <ws> specifier-qualifier-list? <ws> | |
struct-declarator-list: | |
<ws> struct-declarator <ws> | | |
<ws> struct-declarator-list <ws> "," <ws> struct-declarator <ws> | |
struct-declarator: | |
<ws> declarator <ws> | | |
<ws> declarator? <ws> ':' <ws> constant-expression <ws> | |
enum-specifier: | |
<ws> 'enum' <ws> identifier? <ws> '{' <ws> enumerator-list <ws> '}' | | |
<ws> 'enum' <ws> identifier? <ws> '{' <ws> enumerator-list <ws> ',' '}' | | |
<ws> 'enum' <ws> identifier <ws> | |
enumerator-list: | |
<ws> enumerator <ws> | | |
<ws> enumerator-list <ws> ',' <ws> enumerator <ws> | |
enumerator: | |
<ws> enumeration-constant <ws> | | |
<ws> enumeration-constant <ws> '=' <ws> constant-expression <ws> | |
type-qualifier: | |
'const' | 'restrict' | 'volatile' | 'constant' | 'local' | '__global' | | |
'global' | '__local' | 'local' | '__constant' | '__private' | 'private' | | |
'__read_only' | 'read_only' | 'write_only' | '__write_only' | '__read_write' | | |
'read_write' | |
function-specifier: | |
'inline' | '__kernel' | 'kernel' | |
declarator: | |
<ws> pointer? <ws> <direct-declarator> <ws> | |
direct-declarator: | |
<ws> identifier <ws> | | |
"(" <ws> declarator <ws> ")" | | |
<ws> direct-declarator <ws> "[" <ws> type-qualifier-list? <ws> assignment-expression? <ws> "]" | | |
<ws> direct-declarator <ws> "[" "static" <ws> type-qualifier-list? <ws> assignment-expression <ws> "]" <ws> | | |
<ws> direct-declarator <ws> "[" <ws> type-qualifier-list <ws> "static" <ws> assignment-expression <ws> "]" | | |
<ws> direct-declarator <ws> "[" <ws> type-qualifier-list? <ws> "*" "]" | | |
<ws> direct-declarator <ws> "(" <ws> parameter-type-list <ws> ")" | | |
<ws> direct-declarator <ws> "(" <ws> identifier-list? <ws> ")" | |
pointer: | |
'*' <ws> type-qualifier-list? <ws> | | |
'*' <ws> type-qualifier-list? <ws> pointer <ws> | |
type-qualifier-list: | |
<ws> type-qualifier <ws> | | |
<ws> type-qualifier-list <ws> type-qualifier <ws> | |
parameter-type-list: | |
<ws> parameter-list <ws> | | |
<ws> parameter-list <ws> ',' <ws> '...' <ws> | |
parameter-list: | |
<ws> parameter-declaration <ws> | | |
<ws> parameter-list <ws> "," <ws> parameter-declaration <ws> | |
parameter-declaration: | |
<ws> declaration-specifiers <ws> declarator <ws> | | |
<ws> declaration-specifiers <ws> abstract-declarator? <ws> | |
identifier-list: | |
<ws> identifier <ws> | | |
<ws> identifier-list <ws> "," <ws> identifier <ws> | |
type-name: | |
<ws> specifier-qualifier-list <ws> abstract-declarator? <ws> | |
abstract-declarator: | |
<ws> pointer <ws> | | |
<ws> pointer? <ws> direct-abstract-declarator <ws> | |
direct-abstract-declarator: | |
<ws> "(" <ws> abstract-declarator <ws> ")" <ws> | | |
<ws> direct-abstract-declarator? <ws> "[" <ws> assignment-expression? <ws> "]" <ws> | | |
<ws> direct-abstract-declarator? <ws> "[" <ws> "*" <ws> "]" <ws> | | |
<ws> direct-abstract-declarator? <ws> "(" <ws> parameter-type-list? <ws> ")" <ws> | |
typedef-name: | |
<ws> identifier <ws> | |
initializer: | |
<ws> assignment-expression <ws> | | |
"{" <ws> initializer-list <ws> "}" <ws> | | |
"{" <ws> initializer-list <ws> "," <ws> "}" <ws> | |
initializer-list: | |
<ws> designation? <ws> initializer <ws> | | |
<ws> initializer-list <ws> "," <ws> designation? <ws> initializer <ws> | |
designation: | |
<ws> designator-list <ws> "=" <ws> | |
designator-list: | |
<ws> designator <ws> | | |
<ws> designator-list <ws> designator <ws> | |
designator: | |
<ws> "[" <ws> constant-expression <ws> "]" <ws> | | |
<ws> "." <ws> identifier <ws> | |
statement: | |
<ws> labeled-statement <ws> | | |
<ws> compound-statement <ws> | | |
<ws> expression-statement <ws> | | |
<ws> selection-statement <ws> | | |
<ws> iteration-statement <ws> | | |
<ws> jump-statement <ws> | |
labeled-statement: | |
<ws> identifier <ws> ":" <ws> statement <ws> | | |
<ws> "case" <ws> constant-expression <ws> ":" <ws> statement <ws> | | |
<ws> "default" <ws> ":" <ws> statement <ws> | |
compound-statement: | |
<ws> "{" <ws> block-item-list? <ws> "}" <ws> | |
block-item-list: | |
(<ws> block-item)+ <ws> | |
block-item: | |
<ws> declaration <ws> | | |
<ws> statement <ws> | |
expression-statement: | |
<ws> expression? <ws> ";" <ws> | |
selection-statement: | |
"if" "(" <ws> expression <ws> ")" <ws> statement <ws> | | |
"if" "(" <ws> expression <ws> ")" <ws> statement <ws> "else" <ws> statement <ws> | | |
"switch" "(" <ws> expression <ws> ")" <ws> statement <ws> | |
iteration-statement: | |
"while" "(" <ws> expression <ws> ")" <ws> statement <ws> | | |
"do" <ws> statement <ws> "while" "(" <ws> expression <ws> ")" ";" | | |
"for" "(" <ws> expression? <ws> ";" <ws> expression? <ws> ";" <ws> expression? <ws>")" <ws> statement <ws> | | |
"for" "(" <ws> declaration <ws> expression? <ws> ";" <ws> expression? <ws> ")" <ws> statement <ws> | |
jump-statement: | |
"goto" <ws> identifier <ws> ";" | | |
"continue" ";" | | |
"break" ";" | | |
"return" <ws> expression? <ws> ";" <ws> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment