GoToSocial/vendor/modernc.org/cc/v3/parser.yy

1030 lines
35 KiB
Plaintext

%{
// Copyright 2019 The CC Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Based on [0], 6.5-6.10.
package cc // import "modernc.org/cc/v3"
%}
%union {
Token Token
node Node
}
%token
/*yy:token "%c" */ IDENTIFIER
/*yy:token "%c_e" */ ENUMCONST
/*yy:token "%c_t" */ TYPEDEFNAME
/*yy:token "%d" */ INTCONST
/*yy:token "'%c'" */ CHARCONST
/*yy:token "1.%d" */ FLOATCONST
/*yy:token "L'%c'" */ LONGCHARCONST
/*yy:token "L\"%c\"" */ LONGSTRINGLITERAL
/*yy:token "\"%c\"" */ STRINGLITERAL
ACCUM "_Accum"
ADDASSIGN "+="
ALIGNAS "_Alignas"
ALIGNOF "_Alignof"
ANDAND "&&"
ANDASSIGN "&="
ARROW "->"
ASM "__asm__"
ATOMIC "_Atomic"
ATTRIBUTE "__attribute__"
AUTO "auto"
BOOL "_Bool"
BREAK "break"
BUILTINCHOOSEXPR "__builtin_choose_expr"
BUILTINTYPESCOMPATIBLE "__builtin_types_compatible_p"
CASE "case"
CHAR "char"
COMPLEX "_Complex"
CONST "const"
CONTINUE "continue"
DDD "..."
DEC "--"
DECIMAL128 "_Decimal128"
DECIMAL32 "_Decimal32"
DECIMAL64 "_Decimal64"
DEFAULT "default"
DIVASSIGN "/="
DO "do"
DOUBLE "double"
ELSE "else"
ENUM "enum"
EQ "=="
EXTERN "extern"
FLOAT "float"
FLOAT128 "_Float128"
FLOAT16 "__fp16"
FLOAT32 "_Float32"
FLOAT32X "_Float32x"
FLOAT64 "_Float64"
FLOAT64x "_Float64x"
FLOAT80 "__float80"
FOR "for"
FRACT "_Fract"
GEQ ">="
GOTO "goto"
IF "if"
IMAG "__imag__"
INC "++"
INLINE "inline"
INT "int"
INT8 "__int8"
INT16 "__int16"
INT32 "__int32"
INT64 "__int64"
INT128 "__int128"
LABEL "__label__"
LEQ "<="
LONG "long"
LSH "<<"
LSHASSIGN "<<="
MODASSIGN "%="
MULASSIGN "*="
NEQ "!="
NORETURN "_Noreturn"
ORASSIGN "|="
OROR "||"
PPNUMBER "preprocessing number"
PPPASTE "##"
PRAGMASTDC "__pragma_stdc"
REAL "__real__"
REGISTER "register"
RESTRICT "restrict"
RETURN "return"
RSH ">>"
RSHASSIGN ">>="
SAT "_Sat"
SHORT "short"
SIGNED "signed"
SIZEOF "sizeof"
STATIC "static"
STRUCT "struct"
SUBASSIGN "-="
SWITCH "switch"
THREADLOCAL "_Thread_local"
TYPEDEF "typedef"
TYPEOF "typeof"
UNION "union"
UNSIGNED "unsigned"
VOID "void"
VOLATILE "volatile"
WHILE "while"
XORASSIGN "^="
%precedence BELOW_ELSE
%precedence ELSE
%precedence BELOW_ATTRIBUTE
%precedence ATTRIBUTE
%start TranslationUnit
%%
/* [0], 6.5.1 Primary expressions */
/*yy:field Operand Operand */
/*yy:field lexicalScope Scope */
/*yy:field resolvedIn Scope */
/*yy:field resolvedTo Node */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Ident */
PrimaryExpression:
IDENTIFIER
/*yy:example int i = 42; */
/*yy:case Int */ | INTCONST
/*yy:example int i = 3.14; */
/*yy:case Float */ | FLOATCONST
/*yy:example enum e {a}; int i = a; */
/*yy:case Enum */ | ENUMCONST
/*yy:example int i = 'x'; */
/*yy:case Char */ | CHARCONST
/*yy:example int i = L'x'; */
/*yy:case LChar */ | LONGCHARCONST
/*yy:example char *c = "x"; */
/*yy:case String */ | STRINGLITERAL
/*yy:example char *c = L"x"; */
/*yy:case LString */ | LONGSTRINGLITERAL
/*yy:example int i = (x+y); */
/*yy:case Expr */ | '(' Expression ')'
/*yy:example int i = ({x();}); */
/*yy:case Stmt */ | '(' CompoundStatement ')'
/* [0], 6.5.2 Postfix operators */
/*yy:field Operand Operand */
/*yy:field Field Field // Case Select, PSelect */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Primary */ PostfixExpression:
PrimaryExpression
/*yy:example int i = x[y]; */
/*yy:case Index */ | PostfixExpression '[' Expression ']'
/*yy:example int i = x(y); */
/*yy:case Call */ | PostfixExpression '(' ArgumentExpressionList ')'
/*yy:example int i = x.y; */
/*yy:case Select */ | PostfixExpression '.' IDENTIFIER
/*yy:example int i = x->y; */
/*yy:case PSelect */ | PostfixExpression "->" IDENTIFIER
/*yy:example int i = x++; */
/*yy:case Inc */ | PostfixExpression "++"
/*yy:example int i = x--; */
/*yy:case Dec */ | PostfixExpression "--"
/*yy:example int i = (int[]){y}; */
/*yy:case Complit */ | '(' TypeName ')' '{' InitializerList ',' '}'
/*yy:example int i = __builtin_types_compatible_p(int, double); */
/*yy:case TypeCmp */ | "__builtin_types_compatible_p" '(' TypeName ',' TypeName ')'
/*yy:example int i = __builtin_choose_expr(1, 2, "foo"); */
/*yy:case ChooseExpr*/ | "__builtin_choose_expr" '(' AssignmentExpression ',' AssignmentExpression ',' AssignmentExpression ')'
/*yy:example int i = f(x); */
ArgumentExpressionList:
AssignmentExpression
/*yy:example int i = f(x, y); */
| ArgumentExpressionList ',' AssignmentExpression
/* [0], 6.5.3 Unary operators */
/*yy:field Operand Operand */
/*yy:field lexicalScope Scope */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Postfix */ UnaryExpression:
PostfixExpression
/*yy:example int i = ++x; */
/*yy:case Inc */ | "++" UnaryExpression
/*yy:example int i = --x; */
/*yy:case Dec */ | "--" UnaryExpression
/*yy:example int *i = &x; */
/*yy:case Addrof */ | '&' CastExpression
/*yy:example int i = *x; */
/*yy:case Deref */ | '*' CastExpression
/*yy:example int i = +x; */
/*yy:case Plus */ | '+' CastExpression
/*yy:example int i = -x; */
/*yy:case Minus */ | '-' CastExpression
/*yy:example int i = ~x; */
/*yy:case Cpl */ | '~' CastExpression
/*yy:example int i = !x; */
/*yy:case Not */ | '!' CastExpression
/*yy:example int i = sizeof x; */
/*yy:case SizeofExpr */ | "sizeof" UnaryExpression
/*yy:example int i = sizeof(int); */
/*yy:case SizeofType */ | "sizeof" '(' TypeName ')'
/*yy:example int f() { L: &&L; }*/
/*yy:case LabelAddr */ | "&&" IDENTIFIER
/*yy:example int i = _Alignof(x); */
/*yy:case AlignofExpr*/ | "_Alignof" UnaryExpression
/*yy:example int i = _Alignof(int); */
/*yy:case AlignofType*/ | "_Alignof" '(' TypeName ')'
/*yy:example double i = __imag__ x; */
/*yy:case Imag */ | "__imag__" UnaryExpression
/*yy:example double i = __real__ x; */
/*yy:case Real */ | "__real__" UnaryExpression
/* [0], 6.5.4 Cast operators */
/*yy:field Operand Operand */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = 42; */
/*yy:case Unary */ CastExpression:
UnaryExpression
/*yy:example int i = (int)3.14; */
/*yy:case Cast */ | '(' TypeName ')' CastExpression
/* [0], 6.5.5 Multiplicative operators */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x;*/
/*yy:case Cast */ MultiplicativeExpression:
CastExpression
/*yy:example int i = x * y;*/
/*yy:case Mul */ | MultiplicativeExpression '*' CastExpression
/*yy:example int i = x / y;*/
/*yy:case Div */ | MultiplicativeExpression '/' CastExpression
/*yy:example int i = x % y;*/
/*yy:case Mod */ | MultiplicativeExpression '%' CastExpression
/* [0], 6.5.6 Additive operators */
/*yy:field lexicalScope Scope */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Mul */ AdditiveExpression:
MultiplicativeExpression
/*yy:example int i = x+y; */
/*yy:case Add */ | AdditiveExpression '+' MultiplicativeExpression
/*yy:example int i = x-y; */
/*yy:case Sub */ | AdditiveExpression '-' MultiplicativeExpression
/* [0], 6.5.7 Bitwise shift operators */
/*yy:field Operand Operand */
/*yy:field promote Type // shift count promoted type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Add */ ShiftExpression:
AdditiveExpression
/*yy:example int i = x << y; */
/*yy:case Lsh */ | ShiftExpression "<<" AdditiveExpression
/*yy:example int i = x >> y; */
/*yy:case Rsh */ | ShiftExpression ">>" AdditiveExpression
/* [0], 6.5.8 Relational operators */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Shift */ RelationalExpression:
ShiftExpression
/*yy:example int i = x < y; */
/*yy:case Lt */ | RelationalExpression '<' ShiftExpression
/*yy:example int i = x > y; */
/*yy:case Gt */ | RelationalExpression '>' ShiftExpression
/*yy:example int i = x <= y; */
/*yy:case Leq */ | RelationalExpression "<=" ShiftExpression
/*yy:example int i = x >= y; */
/*yy:case Geq */ | RelationalExpression ">=" ShiftExpression
/* [0], 6.5.9 Equality operators */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Rel */ EqualityExpression:
RelationalExpression
/*yy:example int i = x == y; */
/*yy:case Eq */ | EqualityExpression "==" RelationalExpression
/*yy:example int i = x != y; */
/*yy:case Neq */ | EqualityExpression "!=" RelationalExpression
/* [0], 6.5.10 Bitwise AND operator */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Eq */ AndExpression:
EqualityExpression
/*yy:example int i = x & y; */
/*yy:case And */ | AndExpression '&' EqualityExpression
/* [0], 6.5.11 Bitwise exclusive OR operator */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case And */ ExclusiveOrExpression:
AndExpression
/*yy:example int i = x^y; */
/*yy:case Xor */ | ExclusiveOrExpression '^' AndExpression
/* [0], 6.5.12 Bitwise inclusive OR operator */
/*yy:field Operand Operand */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case Xor */ InclusiveOrExpression:
ExclusiveOrExpression
/*yy:example int i = x|y; */
/*yy:case Or */ | InclusiveOrExpression '|' ExclusiveOrExpression
/* [0], 6.5.13 Logical AND operator */
/*yy:field Operand Operand */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x;*/
/*yy:case Or */ LogicalAndExpression:
InclusiveOrExpression
/*yy:example int i = x && y;*/
/*yy:case LAnd */ | LogicalAndExpression "&&" InclusiveOrExpression
/* [0], 6.5.14 Logical OR operator */
/*yy:field Operand Operand */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x;*/
/*yy:case LAnd */ LogicalOrExpression:
LogicalAndExpression
/*yy:example int i = x || y;*/
/*yy:case LOr */ | LogicalOrExpression "||" LogicalAndExpression
/* [0], 6.5.15 Conditional operator */
/*yy:field Operand Operand */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; */
/*yy:case LOr */ ConditionalExpression:
LogicalOrExpression
/*yy:example int i = x ? y : z; */
/*yy:case Cond */ | LogicalOrExpression '?' Expression ':' ConditionalExpression
/* [0], 6.5.16 Assignment operators */
/*yy:field Operand Operand */
/*yy:field InitializerOperand Operand // When the expression is used in an initializer */
/*yy:field lexicalScope Scope */
/*yy:field promote Type */
/*yy:field IsSideEffectsFree bool */
/*yy:example int i = x; } */
/*yy:case Cond */ AssignmentExpression:
ConditionalExpression
/*yy:example int f() { x = y; } */
/*yy:case Assign */ | UnaryExpression '=' AssignmentExpression
/*yy:example int f() { x *= y; } */
/*yy:case Mul */ | UnaryExpression "*=" AssignmentExpression
/*yy:example int f() { x /= y; } */
/*yy:case Div */ | UnaryExpression "/=" AssignmentExpression
/*yy:example int f() { x %= y; } */
/*yy:case Mod */ | UnaryExpression "%=" AssignmentExpression
/*yy:example int f() { x += y; } */
/*yy:case Add */ | UnaryExpression "+=" AssignmentExpression
/*yy:example int f() { x -= y; } */
/*yy:case Sub */ | UnaryExpression "-=" AssignmentExpression
/*yy:example int f() { x <<= y; } */
/*yy:case Lsh */ | UnaryExpression "<<=" AssignmentExpression
/*yy:example int f() { x >>= y; } */
/*yy:case Rsh */ | UnaryExpression ">>=" AssignmentExpression
/*yy:example int f() { x &= y; } */
/*yy:case And */ | UnaryExpression "&=" AssignmentExpression
/*yy:example int f() { x ^= y; } */
/*yy:case Xor */ | UnaryExpression "^=" AssignmentExpression
/*yy:example int f() { x |= y; } */
/*yy:case Or */ | UnaryExpression "|=" AssignmentExpression
/* [0], 6.5.17 Comma operator */
/*yy:field Operand Operand */
/*yy:field IsSideEffectsFree bool */
/*yy:example int f() { i = x; }; */
/*yy:case Assign */ Expression:
AssignmentExpression
/*yy:example int f() { x, y; }; */
/*yy:case Comma */ | Expression ',' AssignmentExpression
/* [0], 6.6 Constant expressions */
/*yy:field Operand Operand */
/*yy:example struct { int i:3; }; */
ConstantExpression:
ConditionalExpression
/* [0], 6.7 Declarations */
/*yy:example int i, j; */
Declaration:
DeclarationSpecifiers InitDeclaratorList ';'
/*yy:field class storageClass */
/*yy:example static int i; */
/*yy:case Storage */ DeclarationSpecifiers:
StorageClassSpecifier DeclarationSpecifiers
/*yy:example int i; */
/*yy:case TypeSpec */ | TypeSpecifier DeclarationSpecifiers
/*yy:example volatile int i; */
/*yy:case TypeQual */ | TypeQualifier DeclarationSpecifiers
/*yy:example inline int f() {} */
/*yy:case Func */ | FunctionSpecifier DeclarationSpecifiers
/*yy:example _Alignas(double) int i; */
/*yy:case AlignSpec */ | AlignmentSpecifier DeclarationSpecifiers
/*yy:example int __attribute__((a)) i; */
/*yy:case Attribute */ | AttributeSpecifier DeclarationSpecifiers
/*yy:example int i; */
InitDeclaratorList:
InitDeclarator
/*yy:example int i, j; */
| InitDeclaratorList ',' AttributeSpecifierList InitDeclarator
/*yy:field initializer *InitializerValue */
/*yy:example int i; */
/*yy:case Decl */ InitDeclarator:
Declarator AttributeSpecifierList
/*yy:example int i = x; */
/*yy:case Init */ | Declarator AttributeSpecifierList '=' Initializer
/* [0], 6.7.1 Storage-class specifiers */
/*yy:example typedef int int_t;*/
/*yy:case Typedef */ StorageClassSpecifier:
"typedef"
/*yy:example extern int i;*/
/*yy:case Extern */ | "extern"
/*yy:example static int i;*/
/*yy:case Static */ | "static"
/*yy:example auto int i;*/
/*yy:case Auto */ | "auto"
/*yy:example register int i;*/
/*yy:case Register */ | "register"
/*yy:example _Thread_local int i;*/
/*yy:case ThreadLocal*/ | "_Thread_local"
/* [0], 6.7.2 Type specifiers */
/*yy:field resolvedIn Scope // Case TypedefName */
/*yy:field typ Type */
/*yy:example void i(); */
/*yy:case Void */ TypeSpecifier:
"void"
/*yy:example char i; */
/*yy:case Char */ | "char"
/*yy:example short i; */
/*yy:case Short */ | "short"
/*yy:example int i; */
/*yy:case Int */ | "int"
/*yy:example __int8 i; */
/*yy:case Int8 */ | "__int8"
/*yy:example __int16 i; */
/*yy:case Int16 */ | "__int16"
/*yy:example __int32 i; */
/*yy:case Int32 */ | "__int32"
/*yy:example __int64 i; */
/*yy:case Int64 */ | "__int64"
/*yy:example __int128 i; */
/*yy:case Int128 */ | "__int128"
/*yy:example long i; */
/*yy:case Long */ | "long"
/*yy:example float i; */
/*yy:case Float */ | "float"
/*yy:example __fp16 i; */
/*yy:case Float16 */ | "__fp16"
/*yy:example _Decimal32 i; */
/*yy:case Decimal32 */ | "_Decimal32"
/*yy:example _Decimal64 i; */
/*yy:case Decimal64 */ | "_Decimal64"
/*yy:example _Decimal128 i; */
/*yy:case Decimal128 */ | "_Decimal128"
/*yy:example _Float128 i; */
/*yy:case Float128 */ | "_Float128"
/*yy:example __float80 i; */
/*yy:case Float80 */ | "__float80"
/*yy:example double i; */
/*yy:case Double */ | "double"
/*yy:example signed i; */
/*yy:case Signed */ | "signed"
/*yy:example unsigned i; */
/*yy:case Unsigned */ | "unsigned"
/*yy:example _Bool i; */
/*yy:case Bool */ | "_Bool"
/*yy:example _Complex i; */
/*yy:case Complex */ | "_Complex"
/*yy:example struct s i; */
/*yy:case StructOrUnion */
| StructOrUnionSpecifier
/*yy:example enum e i; */
/*yy:case Enum */ | EnumSpecifier
/*yy:example typedef const T; T i; */
/*yy:case TypedefName*/ | TYPEDEFNAME
/*yy:example typeof(42) i; */
/*yy:case TypeofExpr */ | "typeof" '(' Expression ')'
/*yy:example typedef const T; typeof(T) i; */
/*yy:case TypeofType */ | "typeof" '(' TypeName ')'
/*yy:example _Atomic(int) i; */
/*yy:case Atomic */ | AtomicTypeSpecifier
/*yy:example _Fract i; */
/*yy:case Fract */ | "_Fract"
/*yy:example _Sat i; */
/*yy:case Sat */ | "_Sat"
/*yy:example _Accum i; */
/*yy:case Accum */ | "_Accum"
/*yy:example _Float32 i; */
/*yy:case Float32 */ | "_Float32"
/*yy:example _Float64 i; */
/*yy:case Float64 */ | "_Float64"
/*yy:example _Float32x i; */
/*yy:case Float32x */ | "_Float32x"
/*yy:example _Float64x i; */
/*yy:case Float64x */ | "_Float64x"
/* [0], 6.7.2.1 Structure and union specifiers */
/*yy:field lexicalScope Scope */
/*yy:field maxAlign int */
/*yy:field typ Type */
/*yy:example struct s { int i; }; */
/*yy:case Def */ StructOrUnionSpecifier:
StructOrUnion AttributeSpecifierList IDENTIFIER '{' StructDeclarationList '}'
/*yy:example struct s v; */
/*yy:case Tag */ | StructOrUnion AttributeSpecifierList IDENTIFIER
/*yy:example struct { int i; } s; */
/*yy:case Struct */ StructOrUnion:
"struct"
/*yy:example union { int i; double d; } u; */
/*yy:case Union */ | "union"
/*yy:example struct{ int i; } */
StructDeclarationList:
StructDeclaration
/*yy:example struct{ int i; double d; } */
| StructDeclarationList StructDeclaration
/*yy:example struct{ int i; } */
/*yy:field Empty bool // TCC extension */
StructDeclaration:
SpecifierQualifierList StructDeclaratorList ';'
/*yy:field noStorageClass */
/*yy:example struct {int i;};*/
/*yy:case TypeSpec */ SpecifierQualifierList:
TypeSpecifier SpecifierQualifierList
/*yy:example struct {const int i;};*/
/*yy:case TypeQual */ | TypeQualifier SpecifierQualifierList
/*yy:example struct {_Alignas(double) int i;};*/
/*yy:case AlignSpec */ | AlignmentSpecifier SpecifierQualifierList
/*yy:example struct {__attribute__((a)) int i;};*/
/*yy:case Attribute */ | AttributeSpecifier SpecifierQualifierList
/*yy:example struct{ int i; } */
StructDeclaratorList:
StructDeclarator
/*yy:example struct{ int i, j; } */
| StructDeclaratorList ',' StructDeclarator
/*yy:field decl *StructDeclaration */
/*yy:example struct{ int i; } */
/*yy:case Decl */ StructDeclarator:
Declarator
/*yy:example struct{ int i:3; } */
/*yy:case BitField */ | Declarator ':' ConstantExpression AttributeSpecifierList
/* [0], 6.7.2.2 Enumeration specifiers */
/*yy:field lexicalScope Scope */
/*yy:field typ Type */
/*yy:field min Value */
/*yy:field max Value */
/*yy:example enum e {a}; */
/*yy:case Def */ EnumSpecifier:
"enum" AttributeSpecifierList IDENTIFIER '{' EnumeratorList ',' '}'
/*yy:example enum e i; */
/*yy:case Tag */ | "enum" AttributeSpecifierList IDENTIFIER
/*yy:example enum e {a}; */
EnumeratorList:
Enumerator
/*yy:example enum e {a, b}; */
| EnumeratorList ',' Enumerator
/*yy:field lexicalScope Scope */
/*yy:field Operand Operand */
/*yy:example enum e {a}; */
/*yy:case Ident */ Enumerator:
IDENTIFIER AttributeSpecifierList
/*yy:example enum e {a = 42}; */
/*yy:case Expr */ | IDENTIFIER AttributeSpecifierList '=' ConstantExpression
/* [2], 6.7.2.4 Atomic type specifiers */
/*yy:example _Atomic(int) i; */
AtomicTypeSpecifier:
"_Atomic" '(' TypeName ')'
/* [0], 6.7.3 Type qualifiers */
/*yy:example const int i; */
/*yy:case Const */ TypeQualifier:
"const"
/*yy:example restrict int i; */
/*yy:case Restrict */ | "restrict"
/*yy:example volatile int i; */
/*yy:case Volatile */ | "volatile"
/*yy:example _Atomic int i; */
/*yy:case Atomic */ | "_Atomic"
/* [0], 6.7.4 Function specifiers */
/*yy:example inline int f() {}*/
/*yy:case Inline */ FunctionSpecifier:
"inline"
/*yy:example _Noreturn int f() {}*/
/*yy:case Noreturn */ | "_Noreturn"
/* [0], 6.7.5 Declarators */
/*yy:field Linkage Linkage */
/*yy:field Read int */
/*yy:field StorageClass StorageClass */
/*yy:field Write int */
/*yy:field funcDefinition *FunctionDefinition */
/*yy:field lhs map[*Declarator]struct{} */
/*yy:field td typeDescriptor */
/*yy:field typ Type */
/*yy:field AddressTaken bool */
/*yy:field IsParameter bool */
/*yy:field IsTypedefName bool */
/*yy:field SubjectOfAsgnOp bool */
/*yy:field SubjectOfIncDec bool */
/*yy:field called bool */
/*yy:field fnDef bool */
/*yy:field hasInitializer bool */
/*yy:example int *p __attribute__ ((foo)); */
Declarator:
Pointer DirectDeclarator AttributeSpecifierList %prec BELOW_ATTRIBUTE
/* [2], 6.7.5 Alignment specifier */
/*yy:example _Alignas(double) char c; */
/*yy:case AlignasType*/ AlignmentSpecifier:
"_Alignas" '(' TypeName ')'
/*yy:example _Alignas(0ll) char c; */
/*yy:case AlignasExpr*/ | "_Alignas" '(' ConstantExpression ')'
/*yy:field lexicalScope Scope */
/*yy:field paramScope Scope */
/*yy:field typeQualifiers *typeBase */
/*yy:field idListNoDeclList bool */
/*yy:example int i; */
/*yy:case Ident */ DirectDeclarator:
IDENTIFIER Asm
/*yy:example int (f); */
/*yy:case Decl */ | '(' AttributeSpecifierList Declarator ')'
/*yy:example int i[const 42]; */
/*yy:case Arr */ | DirectDeclarator '[' TypeQualifiers AssignmentExpression ']'
/*yy:example int i[static const 42]; */
/*yy:case StaticArr */ | DirectDeclarator '[' "static" TypeQualifiers AssignmentExpression ']'
/*yy:example int i[const static 42]; */
/*yy:case ArrStatic */ | DirectDeclarator '[' TypeQualifiers "static" AssignmentExpression ']'
/*yy:example int i[const *]; */
/*yy:case Star */ | DirectDeclarator '[' TypeQualifiers '*' ']'
/*yy:example int f(int i); */
/*yy:case FuncParam */ | DirectDeclarator '(' ParameterTypeList ')'
/*yy:example int f(a); */
/*yy:case FuncIdent */ | DirectDeclarator '(' IdentifierList ')'
/*yy:field typeQualifiers *typeBase*/
/*yy:example int *p; */
/*yy:case TypeQual */ Pointer:
'*' TypeQualifiers
/*yy:example int **p; */
/*yy:case Ptr */ | '*' TypeQualifiers Pointer
/*yy:field noStorageClass */
/*yy:example int * const i; */
/*yy:case TypeQual */ TypeQualifiers:
TypeQualifier
/*yy:example int * __attribute__((a)) i; */
/*yy:case Attribute */ | AttributeSpecifier
/*yy:example int * const volatile i; */
| TypeQualifiers TypeQualifier
/*yy:example int * __attribute__((a)) __attribute__((b)) i; */
| TypeQualifiers AttributeSpecifier
/*yy:example int f(int i) {} */
/*yy:case List */ ParameterTypeList:
ParameterList
/*yy:example int f(int i, ...) {} */
/*yy:case Var */ | ParameterList ',' "..."
/*yy:example int f(int i) {} */
ParameterList:
ParameterDeclaration
/*yy:example int f(int i, int j) {} */
| ParameterList ',' ParameterDeclaration
/*yy:field typ Type */
/*yy:example int f(int i) {} */
/*yy:case Decl */ ParameterDeclaration:
DeclarationSpecifiers Declarator AttributeSpecifierList
/*yy:example int f(int*) {} */
/*yy:case Abstract */ | DeclarationSpecifiers AbstractDeclarator
/*yy:field lexicalScope Scope */
/*yy:example int f(i) int i; {}*/
IdentifierList:
IDENTIFIER
/*yy:example int f(i, j) int i, j; {}*/
| IdentifierList ',' IDENTIFIER
/* [0], 6.7.6 Type names */
/*yy:field typ Type */
/*yy:example int i = (int)x; */
TypeName:
SpecifierQualifierList AbstractDeclarator
/*yy:field typ Type */
/*yy:example void f(int*); */
/*yy:case Ptr */ AbstractDeclarator:
Pointer
/*yy:example void f(int()); */
/*yy:case Decl */ | Pointer DirectAbstractDeclarator
/*yy:field paramScope Scope */
/*yy:field typeQualifiers *typeBase */
/*yy:example void f(int()); */
/*yy:case Decl */ DirectAbstractDeclarator:
'(' AbstractDeclarator ')'
/*yy:example void f(int[const 42]); */
/*yy:case Arr */ | DirectAbstractDeclarator '[' TypeQualifiers AssignmentExpression ']'
/*yy:example void f(int[static const 42]); */
/*yy:case StaticArr */ | DirectAbstractDeclarator '[' "static" TypeQualifiers AssignmentExpression ']'
/*yy:example void f(int[const static 42]); */
/*yy:case ArrStatic */ | DirectAbstractDeclarator '[' TypeQualifiers "static" AssignmentExpression ']'
/*yy:example void f(int[*]); */
/*yy:case ArrStar */ | DirectAbstractDeclarator '[' '*' ']'
/*yy:example void f(int(char)); */
/*yy:case Func */ | DirectAbstractDeclarator '(' ParameterTypeList ')'
/* [0], 6.7.8 Initialization */
/*yy:field Field Field // Where aplicable */
/*yy:field Offset uintptr // Case Expr */
/*yy:field field0 Field */
/*yy:field list []*Initializer */
/*yy:field parent *Initializer */
/*yy:field trailingComma *Token */
/*yy:field typ Type */
/*yy:field isConst bool */
/*yy:field isZero bool */
/*yy:example int i = x; */
/*yy:case Expr */ Initializer:
AssignmentExpression
/*yy:example int i[] = { x }; */
/*yy:case InitList */ | '{' InitializerList ',' '}'
/*yy:field list []*Initializer */
/*yy:field isConst bool */
/*yy:field isZero bool */
/*yy:example int i[] = { [10] = x }; */
InitializerList:
Designation Initializer
/*yy:example int i[] = { [10] = x, [20] = y }; */
| InitializerList ',' Designation Initializer
/*yy:example int a[] = { [42] = 314 }; */
Designation:
DesignatorList '='
/*yy:example int a[] = { [42] = 314 }; */
DesignatorList:
Designator
/*yy:example int a[100][] = { [42][12] = 314 }; */
| DesignatorList Designator
/*yy:field lexicalScope Scope */
/*yy:example int a[] = { [42] = 314 }; */
/*yy:case Index */ Designator:
'[' ConstantExpression ']'
/*yy:example struct t s = { .fld = 314 }; */
/*yy:case Field */ | '.' IDENTIFIER
/*yy:example struct t s = { fld: 314 }; */
/*yy:case Field2 */ | IDENTIFIER ':'
/* [0], 6.8 Statements and blocks */
/*yy:field Operand Operand // Case CompoundStatement, ExpressionStatement*/
/*yy:example int f() { L: x(); }*/
/*yy:case Labeled */ Statement:
LabeledStatement
/*yy:example int f() { { y(); } }*/
/*yy:case Compound */ | CompoundStatement
/*yy:example int f() { x(); }*/
/*yy:case Expr */ | ExpressionStatement
/*yy:example int f() { if(x) y(); }*/
/*yy:case Selection */ | SelectionStatement
/*yy:example int f() { for(;;) x(); }*/
/*yy:case Iteration */ | IterationStatement
/*yy:example int f() { return x; }*/
/*yy:case Jump */ | JumpStatement
/*yy:example int f() { __asm__("nop"); }*/
/*yy:case Asm */ | AsmStatement
/* [0], 6.8.1 Labeled statements */
/*yy:field block *CompoundStatement */
/*yy:field lexicalScope Scope */
/*yy:example int f() { L: goto L; } */
/*yy:case Label */ LabeledStatement:
IDENTIFIER ':' AttributeSpecifierList Statement
/*yy:example int f() { switch(i) case 42: x(); } */
/*yy:case CaseLabel */ | "case" ConstantExpression ':' Statement
/*yy:example int f() { switch(i) case 42 ... 56: x(); } */
/*yy:case Range */ | "case" ConstantExpression "..." ConstantExpression ':' Statement
/*yy:example int f() { switch(i) default: x(); } */
/*yy:case Default */ | "default" ':' Statement
/* [0], 6.8.2 Compound statement */
/*yy:field Operand Operand */
/*yy:field children []*CompoundStatement */
/*yy:field declarations []*Declaration */
/*yy:field isJumpTarget bool */
/*yy:field labeledStmts []*LabeledStatement */
/*yy:field parent *CompoundStatement */
/*yy:field scope Scope */
/*yy:example int f() { int i; } */
CompoundStatement:
'{' BlockItemList '}'
/*yy:example int f() { int i; }*/
BlockItemList:
BlockItem
/*yy:example int f() { int i; double j; }*/
| BlockItemList BlockItem
/*yy:field fn *FunctionDefinition // Case FuncDef */
/*yy:field closure map[StringID]struct{} // Case FuncDef */
/*yy:field Last bool */
/*yy:example int f() { int i; }*/
/*yy:case Decl */ BlockItem:
Declaration
/*yy:example int f() { g(); }*/
/*yy:case Stmt */ | Statement
/*yy:example int f() { __label__ L; }*/
/*yy:case Label */ | LabelDeclaration
/*yy:example int f() { int g() {} }*/
/*yy:case FuncDef */ | DeclarationSpecifiers Declarator CompoundStatement
/*yy:example int f() {\n#pragma STDC FENV_ACCESS OFF\n}*/
/*yy:case Pragma */ | PragmaSTDC
/* [0], 6.8.3 Expression and null statements */
/*yy:example int f() { g(); }*/
ExpressionStatement:
Expression AttributeSpecifierList ';'
/* [0], 6.8.4 Selection statements */
/*yy:field promote Type // switch expression promoted type */
/*yy:field cases []*LabeledStatement */
/*yy:example int f() { if(x) y(); } */
/*yy:case If */ SelectionStatement:
"if" '(' Expression ')' Statement %prec BELOW_ELSE
/*yy:example int f() { if(x) y(); else z(); } */
/*yy:case IfElse */ | "if" '(' Expression ')' Statement "else" Statement
/*yy:example int f() { switch(i) case 42: x(); } */
/*yy:case Switch */ | "switch" '(' Expression ')' Statement
/* [0], 6.8.5 Iteration statements */
/*yy:example int f() { while(x) y(); } */
/*yy:case While */ IterationStatement:
"while" '(' Expression ')' Statement
/*yy:example int f() { do x(); while(y); } */
/*yy:case Do */ | "do" Statement "while" '(' Expression ')' ';'
/*yy:example int f() { for( i = 0; i < 10; i++) x(); } */
/*yy:case For */ | "for" '(' Expression ';' Expression ';' Expression ')' Statement
/*yy:example int f() { for( int i = 0; i < 10; i++) x(); } */
/*yy:case ForDecl */ | "for" '(' Declaration Expression ';' Expression ')' Statement
/* [0], 6.8.6 Jump statements */
/*yy:field context Node */
/*yy:field lexicalScope Scope */
/*yy:example int f() { L: goto L; } */
/*yy:case Goto */ JumpStatement:
"goto" IDENTIFIER ';'
/*yy:example int f() { L: x(); void *p = &&L; goto *p; } */
/*yy:case GotoExpr */ | "goto" '*' Expression ';'
/*yy:example int f() { for(;;) if (i) continue; } */
/*yy:case Continue */ | "continue" ';'
/*yy:example int f() { for(;;) if (i) break; } */
/*yy:case Break */ | "break" ';'
/*yy:example int f() { if (i) return x; } */
/*yy:case Return */ | "return" Expression ';'
/* [0], 6.9 External definitions */
/*yy:list*/
/*yy:example int i; */
TranslationUnit:
ExternalDeclaration
/*yy:example int i; int j; */
| TranslationUnit ExternalDeclaration
/*yy:example int f() {} */
/*yy:case FuncDef */ ExternalDeclaration:
FunctionDefinition
/*yy:example int i; */
/*yy:case Decl */ | Declaration
/*yy:example int f() __asm__("nop"); */
/*yy:case Asm */ | AsmFunctionDefinition
/*yy:example __asm__("nop"); */
/*yy:case AsmStmt */ | AsmStatement
/*yy:example ; */
/*yy:case Empty */ | ';'
/*yy:example #pragma STDC CX_LIMITED_RANGE DEFAULT */
/*yy:case Pragma */ | PragmaSTDC
/* [0], 6.9.1 Function definitions */
/*yy:field CallSiteComplexExpr []*AssignmentExpression */
/*yy:field CompositeLiterals []*PostfixExpression */
/*yy:field ComputedGotos map[StringID]*UnaryExpression */
/*yy:field Gotos map[StringID]*JumpStatement */
/*yy:field InitDeclarators []*InitDeclarator */
/*yy:field Labels map[StringID]*LabeledStatement */
/*yy:field ReturnComplexExpr []*Expression */
/*yy:field VLAs []*Declarator */
/*yy:field compoundStatements []*CompoundStatement */
/*yy:field checked bool */
/*yy:example int f() {} */
FunctionDefinition:
DeclarationSpecifiers Declarator DeclarationList CompoundStatement
/*yy:example int f(i) int i; {} */
DeclarationList:
Declaration
/*yy:example int f(i, j) int i; int j; {} */
| DeclarationList Declaration
/* -------------------------------------- Extensions */
/*yy:example __asm__("nop": [a] b); */
AsmIndex:
'[' Expression ']'
/*yy:example __asm__("nop": a); */
AsmExpressionList:
AsmIndex AssignmentExpression
/*yy:example __asm__("nop": a, b); */
| AsmExpressionList ',' AsmIndex AssignmentExpression
/*yy:example __asm__("nop": a); */
AsmArgList:
':' AsmExpressionList
/*yy:example __asm__("nop": a : b); */
| AsmArgList ':' AsmExpressionList
/*yy:example __asm__("nop"); */
Asm:
"__asm__" AsmQualifierList '(' STRINGLITERAL AsmArgList ')'
/*yy:example void f() { __asm__("nop"); } */
AsmStatement:
Asm AttributeSpecifierList ';'
/*yy:example int f() __asm__("nop"); */
AsmFunctionDefinition:
DeclarationSpecifiers Declarator AsmStatement
/*yy:example __asm__ volatile ("nop"); */
/*yy:case Volatile */ AsmQualifier:
"volatile"
/*yy:example __asm__ inline ("nop"); */
/*yy:case Inline */ | "inline"
/*yy:example __asm__ goto ("nop"); */
/*yy:case Goto */ | "goto"
/*yy:example __asm__ inline ("nop"); */
AsmQualifierList:
AsmQualifier
/*yy:example __asm__ inline volatile ("nop"); */
| AsmQualifierList AsmQualifier
/*yy:example int f() { __label__ L; L: x(); } */
LabelDeclaration:
"__label__" IdentifierList ';'
/* [4], 6.37 Attribute Syntax */
/*yy:example int i __attribute__((a(b))); */
ExpressionList:
AssignmentExpression
/*yy:example int i __attribute__((a(b, c))); */
| ExpressionList ',' AssignmentExpression
/*yy:field lexicalScope Scope */
/*yy:example int i __attribute__((a)); */
/*yy:case Ident */ AttributeValue:
IDENTIFIER
/*yy:example int i __attribute__((a(b))); */
/*yy:case Expr */ | IDENTIFIER '(' ExpressionList ')'
/*yy:example int i __attribute__((a)); */
AttributeValueList:
AttributeValue
/*yy:example int i __attribute__((a, b)); */
| AttributeValueList ',' AttributeValue
/*yy:example int i __attribute__((a)); */
AttributeSpecifier:
"__attribute__" '(' '(' AttributeValueList ')' ')'
/*yy:example int i __attribute__((a)); */
AttributeSpecifierList:
AttributeSpecifier %prec BELOW_ATTRIBUTE
/*yy:example int i __attribute__((a)) __attribute((b)); */
| AttributeSpecifierList AttributeSpecifier
/*yy:example _Pragma("STDC FP_CONTRACT ON") */
PragmaSTDC:
"__pragma_stdc" IDENTIFIER IDENTIFIER IDENTIFIER