1336 lines
36 KiB
Plaintext
1336 lines
36 KiB
Plaintext
|
================================================================================
|
||
|
Number literals
|
||
|
================================================================================
|
||
|
|
||
|
double a = {
|
||
|
0xAC00,
|
||
|
0.123,
|
||
|
0b1010001,
|
||
|
0xabc00ull,
|
||
|
-0.1f,
|
||
|
1'000'000.000'001,
|
||
|
24e-5,
|
||
|
0.1E,
|
||
|
58.,
|
||
|
4e2,
|
||
|
123.456e-67,
|
||
|
.1E4f,
|
||
|
0x10.1p0,
|
||
|
0X1, 0B1,
|
||
|
2.0dd, 5wb,
|
||
|
};
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(initializer_list
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)))))
|
||
|
|
||
|
================================================================================
|
||
|
Identifiers
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
_abc;
|
||
|
d_EG123;
|
||
|
$f;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
|
||
|
================================================================================
|
||
|
Unicode Identifiers
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
µs;
|
||
|
blah_accenté;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
|
||
|
================================================================================
|
||
|
Common constants
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
true;
|
||
|
false;
|
||
|
NULL;
|
||
|
|
||
|
// regression test - identifiers starting w/ these strings should tokenize correctly.
|
||
|
true_value;
|
||
|
false_value;
|
||
|
NULL_value;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(true))
|
||
|
(expression_statement
|
||
|
(false))
|
||
|
(expression_statement
|
||
|
(null))
|
||
|
(comment)
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
|
||
|
================================================================================
|
||
|
Function calls
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
printf("hi! %d\n", x);
|
||
|
__assert_fail("some_error_message", 115, __extension__ __func__);
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))
|
||
|
(identifier))))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(number_literal)
|
||
|
(identifier)))))))
|
||
|
|
||
|
================================================================================
|
||
|
GNU inline assembly
|
||
|
================================================================================
|
||
|
|
||
|
asm volatile (
|
||
|
"mov r0, %0\n"
|
||
|
"mov r1, %[y]\n"
|
||
|
"add r2, r0, r1\n"
|
||
|
"mov %1, r2\n"
|
||
|
: "r" (z)
|
||
|
: "=r" (x),
|
||
|
[y] "=r" ((uintptr_t) y)
|
||
|
: "r2");
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(expression_statement
|
||
|
(gnu_asm_expression
|
||
|
(gnu_asm_qualifier)
|
||
|
(concatenated_string
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence)))
|
||
|
(gnu_asm_output_operand_list
|
||
|
(gnu_asm_output_operand
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(identifier)))
|
||
|
(gnu_asm_input_operand_list
|
||
|
(gnu_asm_input_operand
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(identifier))
|
||
|
(gnu_asm_input_operand
|
||
|
(identifier)
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(cast_expression
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(identifier))))
|
||
|
(gnu_asm_clobber_list
|
||
|
(string_literal
|
||
|
(string_content))))))
|
||
|
|
||
|
================================================================================
|
||
|
Function call with compound statement
|
||
|
================================================================================
|
||
|
|
||
|
#define TAKES_BLOCK(x, block) for (i = 0; i < x; i++) block
|
||
|
|
||
|
int main(void) {
|
||
|
{
|
||
|
int x = 0;
|
||
|
}
|
||
|
TAKES_BLOCK(10, {
|
||
|
// Doesn't matter what I put in here
|
||
|
});
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(preproc_function_def
|
||
|
(identifier)
|
||
|
(preproc_params
|
||
|
(identifier)
|
||
|
(identifier))
|
||
|
(preproc_arg))
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list
|
||
|
(parameter_declaration
|
||
|
(primitive_type))))
|
||
|
(compound_statement
|
||
|
(compound_statement
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(number_literal))))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(number_literal)
|
||
|
(compound_statement
|
||
|
(comment))))))))
|
||
|
|
||
|
================================================================================
|
||
|
String literals
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
"a";
|
||
|
"b" "c" "d";
|
||
|
e "f" g;
|
||
|
"\"hi\"";
|
||
|
L"bonjour";
|
||
|
u"guten morgen";
|
||
|
U"buenos dias";
|
||
|
u8"buongiorno";
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(string_content)))
|
||
|
(expression_statement
|
||
|
(concatenated_string
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(string_literal
|
||
|
(string_content))))
|
||
|
(expression_statement
|
||
|
(concatenated_string
|
||
|
(identifier)
|
||
|
(string_literal
|
||
|
(string_content))
|
||
|
(identifier)))
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(escape_sequence)
|
||
|
(string_content)
|
||
|
(escape_sequence)))
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(string_content)))
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(string_content)))
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(string_content)))
|
||
|
(expression_statement
|
||
|
(string_literal
|
||
|
(string_content))))))
|
||
|
|
||
|
================================================================================
|
||
|
Character literals
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
'a';
|
||
|
'\0';
|
||
|
'\t';
|
||
|
'\'';
|
||
|
L'b';
|
||
|
u'c';
|
||
|
U'\xa1';
|
||
|
u8'\x1A';
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(character)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(escape_sequence)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(escape_sequence)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(escape_sequence)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(character)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(character)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(escape_sequence)))
|
||
|
(expression_statement
|
||
|
(char_literal
|
||
|
(escape_sequence))))))
|
||
|
|
||
|
================================================================================
|
||
|
Field access
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
s.data1;
|
||
|
p->data2;
|
||
|
q[data3];
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(field_expression
|
||
|
(identifier)
|
||
|
(field_identifier)))
|
||
|
(expression_statement
|
||
|
(field_expression
|
||
|
(identifier)
|
||
|
(field_identifier)))
|
||
|
(expression_statement
|
||
|
(subscript_expression
|
||
|
(identifier)
|
||
|
(identifier))))))
|
||
|
|
||
|
================================================================================
|
||
|
Boolean operators
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
!x || !y && !z;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(unary_expression
|
||
|
(identifier))
|
||
|
(binary_expression
|
||
|
(unary_expression
|
||
|
(identifier))
|
||
|
(unary_expression
|
||
|
(identifier))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Math operators
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
-a / b + c * -d;
|
||
|
a++ - ++b + c-- + --d;
|
||
|
++L;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(binary_expression
|
||
|
(unary_expression
|
||
|
(identifier))
|
||
|
(identifier))
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(unary_expression
|
||
|
(identifier)))))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(binary_expression
|
||
|
(binary_expression
|
||
|
(update_expression
|
||
|
(identifier))
|
||
|
(update_expression
|
||
|
(identifier)))
|
||
|
(update_expression
|
||
|
(identifier)))
|
||
|
(update_expression
|
||
|
(identifier))))
|
||
|
(expression_statement
|
||
|
(update_expression
|
||
|
(identifier))))))
|
||
|
|
||
|
================================================================================
|
||
|
The comma operator
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
i--, j--;
|
||
|
(i--, j--);
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(comma_expression
|
||
|
(update_expression
|
||
|
(identifier))
|
||
|
(update_expression
|
||
|
(identifier))))
|
||
|
(expression_statement
|
||
|
(parenthesized_expression
|
||
|
(comma_expression
|
||
|
(update_expression
|
||
|
(identifier))
|
||
|
(update_expression
|
||
|
(identifier))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Assignments
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
static int a = 1;
|
||
|
b = *c = 2;
|
||
|
d.e = 3;
|
||
|
f->g = 4;
|
||
|
h[i] = j;
|
||
|
k += l;
|
||
|
m -= o;
|
||
|
n *= p;
|
||
|
q /= r;
|
||
|
*s++ = 1;
|
||
|
(*t) = 1;
|
||
|
a *= ((b!=c) ? d : e);
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
type: (primitive_type)
|
||
|
declarator: (function_declarator
|
||
|
declarator: (identifier)
|
||
|
parameters: (parameter_list))
|
||
|
body: (compound_statement
|
||
|
(declaration
|
||
|
(storage_class_specifier)
|
||
|
type: (primitive_type)
|
||
|
declarator: (init_declarator
|
||
|
declarator: (identifier)
|
||
|
value: (number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (assignment_expression
|
||
|
left: (pointer_expression
|
||
|
argument: (identifier))
|
||
|
right: (number_literal))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (field_expression
|
||
|
argument: (identifier)
|
||
|
field: (field_identifier))
|
||
|
right: (number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (field_expression
|
||
|
argument: (identifier)
|
||
|
field: (field_identifier))
|
||
|
right: (number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (subscript_expression
|
||
|
argument: (identifier)
|
||
|
index: (identifier))
|
||
|
right: (identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (pointer_expression
|
||
|
argument: (update_expression
|
||
|
argument: (identifier)))
|
||
|
right: (number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (parenthesized_expression
|
||
|
(pointer_expression
|
||
|
argument: (identifier)))
|
||
|
right: (number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (parenthesized_expression
|
||
|
(conditional_expression
|
||
|
condition: (parenthesized_expression
|
||
|
(binary_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
consequence: (identifier)
|
||
|
alternative: (identifier))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Pointer operations
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
doSomething(&x, *x);
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(pointer_expression
|
||
|
(identifier))
|
||
|
(pointer_expression
|
||
|
(identifier))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Type-casts
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
x = (const SomeType *)thing;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
type: (primitive_type)
|
||
|
declarator: (function_declarator
|
||
|
declarator: (identifier)
|
||
|
parameters: (parameter_list))
|
||
|
body: (compound_statement
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (cast_expression
|
||
|
type: (type_descriptor
|
||
|
(type_qualifier)
|
||
|
type: (type_identifier)
|
||
|
declarator: (abstract_pointer_declarator))
|
||
|
value: (identifier)))))))
|
||
|
|
||
|
================================================================================
|
||
|
Sizeof expressions
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
sizeof x.a;
|
||
|
sizeof(x.a);
|
||
|
sizeof(const char **);
|
||
|
sizeof(char * ());
|
||
|
sizeof(1) + 1;
|
||
|
sizeof((1) + 1);
|
||
|
sizeof(int) + 1;
|
||
|
sizeof(struct foo) + sizeof(struct bar) + 1;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(sizeof_expression
|
||
|
(field_expression
|
||
|
(identifier)
|
||
|
(field_identifier))))
|
||
|
(expression_statement
|
||
|
(sizeof_expression
|
||
|
(parenthesized_expression
|
||
|
(field_expression
|
||
|
(identifier)
|
||
|
(field_identifier)))))
|
||
|
(expression_statement
|
||
|
(sizeof_expression
|
||
|
(type_descriptor
|
||
|
(type_qualifier)
|
||
|
(primitive_type)
|
||
|
(abstract_pointer_declarator
|
||
|
(abstract_pointer_declarator)))))
|
||
|
(expression_statement
|
||
|
(sizeof_expression
|
||
|
(type_descriptor
|
||
|
(primitive_type)
|
||
|
(abstract_pointer_declarator
|
||
|
(abstract_function_declarator
|
||
|
(parameter_list))))))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(sizeof_expression
|
||
|
(parenthesized_expression
|
||
|
(number_literal)))
|
||
|
(number_literal)))
|
||
|
(expression_statement
|
||
|
(sizeof_expression
|
||
|
(parenthesized_expression
|
||
|
(binary_expression
|
||
|
(parenthesized_expression
|
||
|
(number_literal))
|
||
|
(number_literal)))))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(sizeof_expression
|
||
|
(type_descriptor
|
||
|
(primitive_type)))
|
||
|
(number_literal)))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(binary_expression
|
||
|
(sizeof_expression
|
||
|
(type_descriptor
|
||
|
(struct_specifier
|
||
|
(type_identifier))))
|
||
|
(sizeof_expression
|
||
|
(type_descriptor
|
||
|
(struct_specifier
|
||
|
(type_identifier)))))
|
||
|
(number_literal))))))
|
||
|
|
||
|
================================================================================
|
||
|
Alignof expressions
|
||
|
================================================================================
|
||
|
|
||
|
typedef struct {
|
||
|
long long __clang_max_align_nonce1
|
||
|
__attribute__((__aligned__(__alignof__(long long))));
|
||
|
long double __clang_max_align_nonce2
|
||
|
__attribute__((__aligned__(__alignof__(long double))));
|
||
|
} max_align_t;
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(type_definition
|
||
|
(struct_specifier
|
||
|
(field_declaration_list
|
||
|
(field_declaration
|
||
|
(sized_type_specifier)
|
||
|
(field_identifier)
|
||
|
(attribute_specifier
|
||
|
(argument_list
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(alignof_expression
|
||
|
(type_descriptor
|
||
|
(sized_type_specifier))))))))
|
||
|
(field_declaration
|
||
|
(sized_type_specifier
|
||
|
(primitive_type))
|
||
|
(field_identifier)
|
||
|
(attribute_specifier
|
||
|
(argument_list
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(alignof_expression
|
||
|
(type_descriptor
|
||
|
(sized_type_specifier
|
||
|
(primitive_type)))))))))))
|
||
|
(primitive_type)))
|
||
|
|
||
|
================================================================================
|
||
|
Offsetof expressions
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
offsetof( struct x, a );
|
||
|
offsetof( x, a );
|
||
|
offsetof( x, a ) + 1;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(offsetof_expression
|
||
|
(type_descriptor
|
||
|
(struct_specifier
|
||
|
(type_identifier)))
|
||
|
(field_identifier)))
|
||
|
(expression_statement
|
||
|
(offsetof_expression
|
||
|
(type_descriptor
|
||
|
(type_identifier))
|
||
|
(field_identifier)))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(offsetof_expression
|
||
|
(type_descriptor
|
||
|
(type_identifier))
|
||
|
(field_identifier))
|
||
|
(number_literal))))))
|
||
|
|
||
|
================================================================================
|
||
|
Compound literals
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
x = (SomeType) {
|
||
|
.f1.f2[f3] = 5,
|
||
|
.f4 = {}
|
||
|
};
|
||
|
y = (struct SomeStruct) {
|
||
|
7,
|
||
|
8
|
||
|
};
|
||
|
z = (char const []) {'a', 'b'};
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(compound_literal_expression
|
||
|
(type_descriptor
|
||
|
(type_identifier))
|
||
|
(initializer_list
|
||
|
(initializer_pair
|
||
|
(field_designator
|
||
|
(field_identifier))
|
||
|
(field_designator
|
||
|
(field_identifier))
|
||
|
(subscript_designator
|
||
|
(identifier))
|
||
|
(number_literal))
|
||
|
(initializer_pair
|
||
|
(field_designator
|
||
|
(field_identifier))
|
||
|
(initializer_list))))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(compound_literal_expression
|
||
|
(type_descriptor
|
||
|
(struct_specifier
|
||
|
(type_identifier)))
|
||
|
(initializer_list
|
||
|
(number_literal)
|
||
|
(number_literal)))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(compound_literal_expression
|
||
|
(type_descriptor
|
||
|
(primitive_type)
|
||
|
(type_qualifier)
|
||
|
(abstract_array_declarator))
|
||
|
(initializer_list
|
||
|
(char_literal
|
||
|
(character))
|
||
|
(char_literal
|
||
|
(character)))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Compound literals with trailing commas
|
||
|
================================================================================
|
||
|
|
||
|
int main() {
|
||
|
y = (struct SomeStruct) { 7, 8, };
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(compound_literal_expression
|
||
|
(type_descriptor
|
||
|
(struct_specifier
|
||
|
(type_identifier)))
|
||
|
(initializer_list
|
||
|
(number_literal)
|
||
|
(number_literal))))))))
|
||
|
|
||
|
================================================================================
|
||
|
Comments with escaped newlines
|
||
|
================================================================================
|
||
|
|
||
|
// one \
|
||
|
two
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(comment))
|
||
|
|
||
|
================================================================================
|
||
|
Comments with escaped chars and newlines
|
||
|
================================================================================
|
||
|
|
||
|
// one \a \b \
|
||
|
two
|
||
|
// one \c \d
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(comment)
|
||
|
(comment))
|
||
|
|
||
|
================================================================================
|
||
|
Generic Expressions
|
||
|
================================================================================
|
||
|
|
||
|
int main(int argc, char **argv) {
|
||
|
int a = 10;
|
||
|
float b = 3.14;
|
||
|
double c = 2.71828;
|
||
|
char d = 'A';
|
||
|
|
||
|
a = _Generic(d, int: 5, float: 0, char: 100);
|
||
|
b = _Generic(a, void *: 0, int: 4.0, float: 3.14, double: 2.71828, char: 1.0);
|
||
|
c = _Generic(b, void *: 0, int: 4.0, float: 3.14, double: 2.71828, char: 1.0);
|
||
|
d = _Generic(c, void *: '\0', int: '0', float: '3', double: '2', char: '1');
|
||
|
|
||
|
_Generic(a, int: printf("a is an int\n"), float: printf("a is a float\n"), double: printf("a is a double\n"), char: printf("a is a char\n"));
|
||
|
_Generic(b, int: printf("b is an int\n"), float: printf("b is a float\n"), double: printf("b is a double\n"), char: printf("b is a char\n"));
|
||
|
_Generic(c, int: printf("c is an int\n"), float: printf("c is a float\n"), double: printf("c is a double\n"), char: printf("c is a char\n"));
|
||
|
_Generic(d, int: printf("d is an int\n"), float: printf("d is a float\n"), double: printf("d is a double\n"), char: printf("d is a char\n"));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list
|
||
|
(parameter_declaration
|
||
|
(primitive_type)
|
||
|
(identifier))
|
||
|
(parameter_declaration
|
||
|
(primitive_type)
|
||
|
(pointer_declarator
|
||
|
(pointer_declarator
|
||
|
(identifier))))))
|
||
|
(compound_statement
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(number_literal)))
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(number_literal)))
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(number_literal)))
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(identifier)
|
||
|
(char_literal
|
||
|
(character))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type)
|
||
|
(abstract_pointer_declarator))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type)
|
||
|
(abstract_pointer_declarator))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(number_literal))))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type)
|
||
|
(abstract_pointer_declarator))
|
||
|
(char_literal
|
||
|
(escape_sequence))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(char_literal
|
||
|
(character))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(char_literal
|
||
|
(character))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(char_literal
|
||
|
(character))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(char_literal
|
||
|
(character)))))
|
||
|
(expression_statement
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))))
|
||
|
(expression_statement
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))))
|
||
|
(expression_statement
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))))
|
||
|
(expression_statement
|
||
|
(generic_expression
|
||
|
(identifier)
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))
|
||
|
(type_descriptor
|
||
|
(primitive_type))
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence))))))
|
||
|
(return_statement
|
||
|
(number_literal)))))
|
||
|
|
||
|
================================================================================
|
||
|
Noreturn Type Qualifier
|
||
|
================================================================================
|
||
|
|
||
|
_Noreturn void kill(void) {
|
||
|
printf("Killing the program\n");
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(type_qualifier)
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list
|
||
|
(parameter_declaration
|
||
|
(primitive_type))))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(string_literal
|
||
|
(string_content)
|
||
|
(escape_sequence)))))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(argument_list
|
||
|
(number_literal)))))))
|
||
|
|
||
|
================================================================================
|
||
|
Restrict Type Qualifier
|
||
|
================================================================================
|
||
|
|
||
|
void fn (int *__restrict__ rptr) {
|
||
|
int *ptr = rptr;
|
||
|
*ptr = 0;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list
|
||
|
(parameter_declaration
|
||
|
(primitive_type)
|
||
|
(pointer_declarator
|
||
|
(type_qualifier)
|
||
|
(identifier)))))
|
||
|
(compound_statement
|
||
|
(declaration
|
||
|
(primitive_type)
|
||
|
(init_declarator
|
||
|
(pointer_declarator
|
||
|
(identifier))
|
||
|
(identifier)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(pointer_expression
|
||
|
(identifier))
|
||
|
(number_literal))))))
|
||
|
|
||
|
================================================================================
|
||
|
Ternary
|
||
|
================================================================================
|
||
|
|
||
|
void f() {
|
||
|
0 ? 1 : 2;
|
||
|
a = 0 ? 1 : 2;
|
||
|
}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
(translation_unit
|
||
|
(function_definition
|
||
|
(primitive_type)
|
||
|
(function_declarator
|
||
|
(identifier)
|
||
|
(parameter_list))
|
||
|
(compound_statement
|
||
|
(expression_statement
|
||
|
(conditional_expression
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)))
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(conditional_expression
|
||
|
(number_literal)
|
||
|
(number_literal)
|
||
|
(number_literal)))))))
|