Skip to content

Instantly share code, notes, and snippets.

@aamedina
Created July 18, 2013 00:56
Show Gist options
  • Save aamedina/6025901 to your computer and use it in GitHub Desktop.
Save aamedina/6025901 to your computer and use it in GitHub Desktop.
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