2021-08-29 15:41:41 +01:00
|
|
|
// Code generated by yy. DO NOT EDIT.
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
package cc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"modernc.org/token"
|
|
|
|
)
|
|
|
|
|
|
|
|
// AbstractDeclaratorCase represents case numbers of production AbstractDeclarator
|
|
|
|
type AbstractDeclaratorCase int
|
|
|
|
|
|
|
|
// Values of type AbstractDeclaratorCase
|
|
|
|
const (
|
|
|
|
AbstractDeclaratorPtr AbstractDeclaratorCase = iota
|
|
|
|
AbstractDeclaratorDecl
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AbstractDeclaratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AbstractDeclaratorPtr:
|
|
|
|
return "AbstractDeclaratorPtr"
|
|
|
|
case AbstractDeclaratorDecl:
|
|
|
|
return "AbstractDeclaratorDecl"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AbstractDeclaratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AbstractDeclarator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AbstractDeclarator:
|
|
|
|
// Pointer // Case AbstractDeclaratorPtr
|
|
|
|
// | Pointer DirectAbstractDeclarator // Case AbstractDeclaratorDecl
|
|
|
|
type AbstractDeclarator struct {
|
|
|
|
typ Type
|
|
|
|
Case AbstractDeclaratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
DirectAbstractDeclarator *DirectAbstractDeclarator
|
|
|
|
Pointer *Pointer
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AbstractDeclarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AbstractDeclarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.Pointer.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Pointer.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DirectAbstractDeclarator.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AdditiveExpressionCase represents case numbers of production AdditiveExpression
|
|
|
|
type AdditiveExpressionCase int
|
|
|
|
|
|
|
|
// Values of type AdditiveExpressionCase
|
|
|
|
const (
|
|
|
|
AdditiveExpressionMul AdditiveExpressionCase = iota
|
|
|
|
AdditiveExpressionAdd
|
|
|
|
AdditiveExpressionSub
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AdditiveExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AdditiveExpressionMul:
|
|
|
|
return "AdditiveExpressionMul"
|
|
|
|
case AdditiveExpressionAdd:
|
|
|
|
return "AdditiveExpressionAdd"
|
|
|
|
case AdditiveExpressionSub:
|
|
|
|
return "AdditiveExpressionSub"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AdditiveExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AdditiveExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AdditiveExpression:
|
|
|
|
// MultiplicativeExpression // Case AdditiveExpressionMul
|
|
|
|
// | AdditiveExpression '+' MultiplicativeExpression // Case AdditiveExpressionAdd
|
|
|
|
// | AdditiveExpression '-' MultiplicativeExpression // Case AdditiveExpressionSub
|
|
|
|
type AdditiveExpression struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AdditiveExpression *AdditiveExpression
|
|
|
|
Case AdditiveExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
MultiplicativeExpression *MultiplicativeExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AdditiveExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AdditiveExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1, 2:
|
|
|
|
if p := n.AdditiveExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.MultiplicativeExpression.Position()
|
|
|
|
case 0:
|
|
|
|
return n.MultiplicativeExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AlignmentSpecifierCase represents case numbers of production AlignmentSpecifier
|
|
|
|
type AlignmentSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type AlignmentSpecifierCase
|
|
|
|
const (
|
|
|
|
AlignmentSpecifierAlignasType AlignmentSpecifierCase = iota
|
|
|
|
AlignmentSpecifierAlignasExpr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AlignmentSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AlignmentSpecifierAlignasType:
|
|
|
|
return "AlignmentSpecifierAlignasType"
|
|
|
|
case AlignmentSpecifierAlignasExpr:
|
|
|
|
return "AlignmentSpecifierAlignasExpr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AlignmentSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AlignmentSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AlignmentSpecifier:
|
|
|
|
// "_Alignas" '(' TypeName ')' // Case AlignmentSpecifierAlignasType
|
|
|
|
// | "_Alignas" '(' ConstantExpression ')' // Case AlignmentSpecifierAlignasExpr
|
|
|
|
type AlignmentSpecifier struct {
|
|
|
|
Case AlignmentSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConstantExpression *ConstantExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AlignmentSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AlignmentSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AndExpressionCase represents case numbers of production AndExpression
|
|
|
|
type AndExpressionCase int
|
|
|
|
|
|
|
|
// Values of type AndExpressionCase
|
|
|
|
const (
|
|
|
|
AndExpressionEq AndExpressionCase = iota
|
|
|
|
AndExpressionAnd
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AndExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AndExpressionEq:
|
|
|
|
return "AndExpressionEq"
|
|
|
|
case AndExpressionAnd:
|
|
|
|
return "AndExpressionAnd"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AndExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AndExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AndExpression:
|
|
|
|
// EqualityExpression // Case AndExpressionEq
|
|
|
|
// | AndExpression '&' EqualityExpression // Case AndExpressionAnd
|
|
|
|
type AndExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AndExpression *AndExpression
|
|
|
|
Case AndExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
EqualityExpression *EqualityExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AndExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AndExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.AndExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.EqualityExpression.Position()
|
|
|
|
case 0:
|
|
|
|
return n.EqualityExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ArgumentExpressionList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ArgumentExpressionList:
|
|
|
|
// AssignmentExpression
|
|
|
|
// | ArgumentExpressionList ',' AssignmentExpression
|
|
|
|
type ArgumentExpressionList struct {
|
|
|
|
ArgumentExpressionList *ArgumentExpressionList
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ArgumentExpressionList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ArgumentExpressionList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Asm represents data reduced by production:
|
|
|
|
//
|
|
|
|
// Asm:
|
|
|
|
// "__asm__" AsmQualifierList '(' STRINGLITERAL AsmArgList ')'
|
|
|
|
type Asm struct {
|
|
|
|
AsmArgList *AsmArgList
|
|
|
|
AsmQualifierList *AsmQualifierList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Asm) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Asm) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AsmQualifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AsmArgList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token4.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmArgList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AsmArgList:
|
|
|
|
// ':' AsmExpressionList
|
|
|
|
// | AsmArgList ':' AsmExpressionList
|
|
|
|
type AsmArgList struct {
|
|
|
|
AsmArgList *AsmArgList
|
|
|
|
AsmExpressionList *AsmExpressionList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmArgList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmArgList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AsmExpressionList.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmExpressionList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AsmExpressionList:
|
|
|
|
// AsmIndex AssignmentExpression
|
|
|
|
// | AsmExpressionList ',' AsmIndex AssignmentExpression
|
|
|
|
type AsmExpressionList struct {
|
|
|
|
AsmExpressionList *AsmExpressionList
|
|
|
|
AsmIndex *AsmIndex
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmExpressionList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmExpressionList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AsmIndex.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmFunctionDefinition represents data reduced by production:
|
|
|
|
//
|
|
|
|
// AsmFunctionDefinition:
|
|
|
|
// DeclarationSpecifiers Declarator AsmStatement
|
|
|
|
type AsmFunctionDefinition struct {
|
|
|
|
AsmStatement *AsmStatement
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
Declarator *Declarator
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmFunctionDefinition) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmFunctionDefinition) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AsmStatement.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmIndex represents data reduced by production:
|
|
|
|
//
|
|
|
|
// AsmIndex:
|
|
|
|
// '[' Expression ']'
|
|
|
|
type AsmIndex struct {
|
|
|
|
Expression *Expression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmIndex) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmIndex) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmQualifierCase represents case numbers of production AsmQualifier
|
|
|
|
type AsmQualifierCase int
|
|
|
|
|
|
|
|
// Values of type AsmQualifierCase
|
|
|
|
const (
|
|
|
|
AsmQualifierVolatile AsmQualifierCase = iota
|
|
|
|
AsmQualifierInline
|
|
|
|
AsmQualifierGoto
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AsmQualifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AsmQualifierVolatile:
|
|
|
|
return "AsmQualifierVolatile"
|
|
|
|
case AsmQualifierInline:
|
|
|
|
return "AsmQualifierInline"
|
|
|
|
case AsmQualifierGoto:
|
|
|
|
return "AsmQualifierGoto"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AsmQualifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmQualifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AsmQualifier:
|
|
|
|
// "volatile" // Case AsmQualifierVolatile
|
|
|
|
// | "inline" // Case AsmQualifierInline
|
|
|
|
// | "goto" // Case AsmQualifierGoto
|
|
|
|
type AsmQualifier struct {
|
|
|
|
Case AsmQualifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmQualifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmQualifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmQualifierList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AsmQualifierList:
|
|
|
|
// AsmQualifier
|
|
|
|
// | AsmQualifierList AsmQualifier
|
|
|
|
type AsmQualifierList struct {
|
|
|
|
AsmQualifier *AsmQualifier
|
|
|
|
AsmQualifierList *AsmQualifierList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmQualifierList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmQualifierList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AsmQualifier.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AsmStatement represents data reduced by production:
|
|
|
|
//
|
|
|
|
// AsmStatement:
|
|
|
|
// Asm AttributeSpecifierList ';'
|
|
|
|
type AsmStatement struct {
|
|
|
|
Asm *Asm
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AsmStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AsmStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Asm.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AssignmentExpressionCase represents case numbers of production AssignmentExpression
|
|
|
|
type AssignmentExpressionCase int
|
|
|
|
|
|
|
|
// Values of type AssignmentExpressionCase
|
|
|
|
const (
|
|
|
|
AssignmentExpressionCond AssignmentExpressionCase = iota
|
|
|
|
AssignmentExpressionAssign
|
|
|
|
AssignmentExpressionMul
|
|
|
|
AssignmentExpressionDiv
|
|
|
|
AssignmentExpressionMod
|
|
|
|
AssignmentExpressionAdd
|
|
|
|
AssignmentExpressionSub
|
|
|
|
AssignmentExpressionLsh
|
|
|
|
AssignmentExpressionRsh
|
|
|
|
AssignmentExpressionAnd
|
|
|
|
AssignmentExpressionXor
|
|
|
|
AssignmentExpressionOr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AssignmentExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AssignmentExpressionCond:
|
|
|
|
return "AssignmentExpressionCond"
|
|
|
|
case AssignmentExpressionAssign:
|
|
|
|
return "AssignmentExpressionAssign"
|
|
|
|
case AssignmentExpressionMul:
|
|
|
|
return "AssignmentExpressionMul"
|
|
|
|
case AssignmentExpressionDiv:
|
|
|
|
return "AssignmentExpressionDiv"
|
|
|
|
case AssignmentExpressionMod:
|
|
|
|
return "AssignmentExpressionMod"
|
|
|
|
case AssignmentExpressionAdd:
|
|
|
|
return "AssignmentExpressionAdd"
|
|
|
|
case AssignmentExpressionSub:
|
|
|
|
return "AssignmentExpressionSub"
|
|
|
|
case AssignmentExpressionLsh:
|
|
|
|
return "AssignmentExpressionLsh"
|
|
|
|
case AssignmentExpressionRsh:
|
|
|
|
return "AssignmentExpressionRsh"
|
|
|
|
case AssignmentExpressionAnd:
|
|
|
|
return "AssignmentExpressionAnd"
|
|
|
|
case AssignmentExpressionXor:
|
|
|
|
return "AssignmentExpressionXor"
|
|
|
|
case AssignmentExpressionOr:
|
|
|
|
return "AssignmentExpressionOr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AssignmentExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AssignmentExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AssignmentExpression:
|
|
|
|
// ConditionalExpression // Case AssignmentExpressionCond
|
|
|
|
// | UnaryExpression '=' AssignmentExpression // Case AssignmentExpressionAssign
|
|
|
|
// | UnaryExpression "*=" AssignmentExpression // Case AssignmentExpressionMul
|
|
|
|
// | UnaryExpression "/=" AssignmentExpression // Case AssignmentExpressionDiv
|
|
|
|
// | UnaryExpression "%=" AssignmentExpression // Case AssignmentExpressionMod
|
|
|
|
// | UnaryExpression "+=" AssignmentExpression // Case AssignmentExpressionAdd
|
|
|
|
// | UnaryExpression "-=" AssignmentExpression // Case AssignmentExpressionSub
|
|
|
|
// | UnaryExpression "<<=" AssignmentExpression // Case AssignmentExpressionLsh
|
|
|
|
// | UnaryExpression ">>=" AssignmentExpression // Case AssignmentExpressionRsh
|
|
|
|
// | UnaryExpression "&=" AssignmentExpression // Case AssignmentExpressionAnd
|
|
|
|
// | UnaryExpression "^=" AssignmentExpression // Case AssignmentExpressionXor
|
|
|
|
// | UnaryExpression "|=" AssignmentExpression // Case AssignmentExpressionOr
|
|
|
|
type AssignmentExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
InitializerOperand Operand // When the expression is used in an initializer
|
|
|
|
lexicalScope Scope
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Case AssignmentExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConditionalExpression *ConditionalExpression
|
|
|
|
Token Token
|
|
|
|
UnaryExpression *UnaryExpression
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AssignmentExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AssignmentExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.ConditionalExpression.Position()
|
|
|
|
case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11:
|
|
|
|
if p := n.UnaryExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AtomicTypeSpecifier represents data reduced by production:
|
|
|
|
//
|
|
|
|
// AtomicTypeSpecifier:
|
|
|
|
// "_Atomic" '(' TypeName ')'
|
|
|
|
type AtomicTypeSpecifier struct {
|
2021-11-27 14:26:58 +00:00
|
|
|
list []*TypeSpecifier
|
2021-08-29 15:41:41 +01:00
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AtomicTypeSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AtomicTypeSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AttributeSpecifier represents data reduced by production:
|
|
|
|
//
|
|
|
|
// AttributeSpecifier:
|
|
|
|
// "__attribute__" '(' '(' AttributeValueList ')' ')'
|
|
|
|
type AttributeSpecifier struct {
|
|
|
|
AttributeValueList *AttributeValueList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
Token5 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AttributeSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AttributeSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeValueList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token5.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AttributeSpecifierList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AttributeSpecifierList:
|
|
|
|
// AttributeSpecifier
|
|
|
|
// | AttributeSpecifierList AttributeSpecifier
|
|
|
|
type AttributeSpecifierList struct {
|
|
|
|
AttributeSpecifier *AttributeSpecifier
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AttributeSpecifierList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AttributeSpecifierList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifier.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// AttributeValueCase represents case numbers of production AttributeValue
|
|
|
|
type AttributeValueCase int
|
|
|
|
|
|
|
|
// Values of type AttributeValueCase
|
|
|
|
const (
|
|
|
|
AttributeValueIdent AttributeValueCase = iota
|
|
|
|
AttributeValueExpr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n AttributeValueCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case AttributeValueIdent:
|
|
|
|
return "AttributeValueIdent"
|
|
|
|
case AttributeValueExpr:
|
|
|
|
return "AttributeValueExpr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("AttributeValueCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AttributeValue represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AttributeValue:
|
|
|
|
// IDENTIFIER // Case AttributeValueIdent
|
|
|
|
// | IDENTIFIER '(' ExpressionList ')' // Case AttributeValueExpr
|
|
|
|
type AttributeValue struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
Case AttributeValueCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ExpressionList *ExpressionList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AttributeValue) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AttributeValue) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.Token.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ExpressionList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AttributeValueList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// AttributeValueList:
|
|
|
|
// AttributeValue
|
|
|
|
// | AttributeValueList ',' AttributeValue
|
|
|
|
type AttributeValueList struct {
|
|
|
|
AttributeValue *AttributeValue
|
|
|
|
AttributeValueList *AttributeValueList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *AttributeValueList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *AttributeValueList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeValue.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// BlockItemCase represents case numbers of production BlockItem
|
|
|
|
type BlockItemCase int
|
|
|
|
|
|
|
|
// Values of type BlockItemCase
|
|
|
|
const (
|
|
|
|
BlockItemDecl BlockItemCase = iota
|
|
|
|
BlockItemStmt
|
|
|
|
BlockItemLabel
|
|
|
|
BlockItemFuncDef
|
|
|
|
BlockItemPragma
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n BlockItemCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case BlockItemDecl:
|
|
|
|
return "BlockItemDecl"
|
|
|
|
case BlockItemStmt:
|
|
|
|
return "BlockItemStmt"
|
|
|
|
case BlockItemLabel:
|
|
|
|
return "BlockItemLabel"
|
|
|
|
case BlockItemFuncDef:
|
|
|
|
return "BlockItemFuncDef"
|
|
|
|
case BlockItemPragma:
|
|
|
|
return "BlockItemPragma"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("BlockItemCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// BlockItem represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// BlockItem:
|
|
|
|
// Declaration // Case BlockItemDecl
|
|
|
|
// | Statement // Case BlockItemStmt
|
|
|
|
// | LabelDeclaration // Case BlockItemLabel
|
|
|
|
// | DeclarationSpecifiers Declarator CompoundStatement // Case BlockItemFuncDef
|
|
|
|
// | PragmaSTDC // Case BlockItemPragma
|
|
|
|
type BlockItem struct {
|
|
|
|
fn *FunctionDefinition // Case FuncDef
|
|
|
|
closure map[StringID]struct{} // Case FuncDef
|
|
|
|
Last bool
|
|
|
|
Case BlockItemCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CompoundStatement *CompoundStatement
|
|
|
|
Declaration *Declaration
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
Declarator *Declarator
|
|
|
|
LabelDeclaration *LabelDeclaration
|
|
|
|
PragmaSTDC *PragmaSTDC
|
|
|
|
Statement *Statement
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *BlockItem) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *BlockItem) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.Declaration.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.CompoundStatement.Position()
|
|
|
|
case 2:
|
|
|
|
return n.LabelDeclaration.Position()
|
|
|
|
case 4:
|
|
|
|
return n.PragmaSTDC.Position()
|
|
|
|
case 1:
|
|
|
|
return n.Statement.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// BlockItemList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// BlockItemList:
|
|
|
|
// BlockItem
|
|
|
|
// | BlockItemList BlockItem
|
|
|
|
type BlockItemList struct {
|
|
|
|
BlockItem *BlockItem
|
|
|
|
BlockItemList *BlockItemList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *BlockItemList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *BlockItemList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.BlockItem.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// CastExpressionCase represents case numbers of production CastExpression
|
|
|
|
type CastExpressionCase int
|
|
|
|
|
|
|
|
// Values of type CastExpressionCase
|
|
|
|
const (
|
|
|
|
CastExpressionUnary CastExpressionCase = iota
|
|
|
|
CastExpressionCast
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n CastExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case CastExpressionUnary:
|
|
|
|
return "CastExpressionUnary"
|
|
|
|
case CastExpressionCast:
|
|
|
|
return "CastExpressionCast"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("CastExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CastExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// CastExpression:
|
|
|
|
// UnaryExpression // Case CastExpressionUnary
|
|
|
|
// | '(' TypeName ')' CastExpression // Case CastExpressionCast
|
|
|
|
type CastExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case CastExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CastExpression *CastExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
UnaryExpression *UnaryExpression
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *CastExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *CastExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.CastExpression.Position()
|
|
|
|
case 0:
|
|
|
|
return n.UnaryExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CompoundStatement represents data reduced by production:
|
|
|
|
//
|
|
|
|
// CompoundStatement:
|
|
|
|
// '{' BlockItemList '}'
|
|
|
|
type CompoundStatement struct {
|
|
|
|
Operand Operand
|
|
|
|
children []*CompoundStatement
|
|
|
|
declarations []*Declaration
|
|
|
|
isJumpTarget bool
|
|
|
|
labeledStmts []*LabeledStatement
|
|
|
|
parent *CompoundStatement
|
|
|
|
scope Scope
|
|
|
|
BlockItemList *BlockItemList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *CompoundStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *CompoundStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.BlockItemList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ConditionalExpressionCase represents case numbers of production ConditionalExpression
|
|
|
|
type ConditionalExpressionCase int
|
|
|
|
|
|
|
|
// Values of type ConditionalExpressionCase
|
|
|
|
const (
|
|
|
|
ConditionalExpressionLOr ConditionalExpressionCase = iota
|
|
|
|
ConditionalExpressionCond
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ConditionalExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ConditionalExpressionLOr:
|
|
|
|
return "ConditionalExpressionLOr"
|
|
|
|
case ConditionalExpressionCond:
|
|
|
|
return "ConditionalExpressionCond"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ConditionalExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ConditionalExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ConditionalExpression:
|
|
|
|
// LogicalOrExpression // Case ConditionalExpressionLOr
|
|
|
|
// | LogicalOrExpression '?' Expression ':' ConditionalExpression // Case ConditionalExpressionCond
|
|
|
|
type ConditionalExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case ConditionalExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConditionalExpression *ConditionalExpression
|
|
|
|
Expression *Expression
|
|
|
|
LogicalOrExpression *LogicalOrExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ConditionalExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ConditionalExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.LogicalOrExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.LogicalOrExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ConditionalExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ConstantExpression represents data reduced by production:
|
|
|
|
//
|
|
|
|
// ConstantExpression:
|
|
|
|
// ConditionalExpression
|
|
|
|
type ConstantExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
ConditionalExpression *ConditionalExpression
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ConstantExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ConstantExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ConditionalExpression.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Declaration represents data reduced by production:
|
|
|
|
//
|
|
|
|
// Declaration:
|
|
|
|
// DeclarationSpecifiers InitDeclaratorList ';'
|
|
|
|
type Declaration struct {
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
InitDeclaratorList *InitDeclaratorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Declaration) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Declaration) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.InitDeclaratorList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeclarationList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// DeclarationList:
|
|
|
|
// Declaration
|
|
|
|
// | DeclarationList Declaration
|
|
|
|
type DeclarationList struct {
|
|
|
|
Declaration *Declaration
|
|
|
|
DeclarationList *DeclarationList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *DeclarationList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *DeclarationList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Declaration.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeclarationSpecifiersCase represents case numbers of production DeclarationSpecifiers
|
|
|
|
type DeclarationSpecifiersCase int
|
|
|
|
|
|
|
|
// Values of type DeclarationSpecifiersCase
|
|
|
|
const (
|
|
|
|
DeclarationSpecifiersStorage DeclarationSpecifiersCase = iota
|
|
|
|
DeclarationSpecifiersTypeSpec
|
|
|
|
DeclarationSpecifiersTypeQual
|
|
|
|
DeclarationSpecifiersFunc
|
|
|
|
DeclarationSpecifiersAlignSpec
|
|
|
|
DeclarationSpecifiersAttribute
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n DeclarationSpecifiersCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case DeclarationSpecifiersStorage:
|
|
|
|
return "DeclarationSpecifiersStorage"
|
|
|
|
case DeclarationSpecifiersTypeSpec:
|
|
|
|
return "DeclarationSpecifiersTypeSpec"
|
|
|
|
case DeclarationSpecifiersTypeQual:
|
|
|
|
return "DeclarationSpecifiersTypeQual"
|
|
|
|
case DeclarationSpecifiersFunc:
|
|
|
|
return "DeclarationSpecifiersFunc"
|
|
|
|
case DeclarationSpecifiersAlignSpec:
|
|
|
|
return "DeclarationSpecifiersAlignSpec"
|
|
|
|
case DeclarationSpecifiersAttribute:
|
|
|
|
return "DeclarationSpecifiersAttribute"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("DeclarationSpecifiersCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeclarationSpecifiers represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// DeclarationSpecifiers:
|
|
|
|
// StorageClassSpecifier DeclarationSpecifiers // Case DeclarationSpecifiersStorage
|
|
|
|
// | TypeSpecifier DeclarationSpecifiers // Case DeclarationSpecifiersTypeSpec
|
|
|
|
// | TypeQualifier DeclarationSpecifiers // Case DeclarationSpecifiersTypeQual
|
|
|
|
// | FunctionSpecifier DeclarationSpecifiers // Case DeclarationSpecifiersFunc
|
|
|
|
// | AlignmentSpecifier DeclarationSpecifiers // Case DeclarationSpecifiersAlignSpec
|
|
|
|
// | AttributeSpecifier DeclarationSpecifiers // Case DeclarationSpecifiersAttribute
|
|
|
|
type DeclarationSpecifiers struct {
|
|
|
|
class storageClass
|
|
|
|
AlignmentSpecifier *AlignmentSpecifier
|
|
|
|
AttributeSpecifier *AttributeSpecifier
|
|
|
|
Case DeclarationSpecifiersCase `PrettyPrint:"stringer,zero"`
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
FunctionSpecifier *FunctionSpecifier
|
|
|
|
StorageClassSpecifier *StorageClassSpecifier
|
|
|
|
TypeQualifier *TypeQualifier
|
|
|
|
TypeSpecifier *TypeSpecifier
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *DeclarationSpecifiers) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *DeclarationSpecifiers) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 4:
|
|
|
|
if p := n.AlignmentSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
case 5:
|
|
|
|
if p := n.AttributeSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.FunctionSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.StorageClassSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.TypeQualifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.TypeSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.DeclarationSpecifiers.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Declarator represents data reduced by production:
|
|
|
|
//
|
|
|
|
// Declarator:
|
|
|
|
// Pointer DirectDeclarator AttributeSpecifierList
|
|
|
|
type Declarator struct {
|
|
|
|
Linkage Linkage
|
|
|
|
Read int
|
|
|
|
StorageClass StorageClass
|
|
|
|
Write int
|
|
|
|
funcDefinition *FunctionDefinition
|
|
|
|
lhs map[*Declarator]struct{}
|
|
|
|
td typeDescriptor
|
|
|
|
typ Type
|
|
|
|
AddressTaken bool
|
|
|
|
IsParameter bool
|
|
|
|
IsTypedefName bool
|
|
|
|
SubjectOfAsgnOp bool
|
|
|
|
SubjectOfIncDec bool
|
|
|
|
called bool
|
|
|
|
fnDef bool
|
|
|
|
hasInitializer bool
|
2021-11-27 14:26:58 +00:00
|
|
|
implicit bool
|
2021-08-29 15:41:41 +01:00
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
DirectDeclarator *DirectDeclarator
|
|
|
|
Pointer *Pointer
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Declarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Declarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Pointer.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifierList.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Designation represents data reduced by production:
|
|
|
|
//
|
|
|
|
// Designation:
|
|
|
|
// DesignatorList '='
|
|
|
|
type Designation struct {
|
|
|
|
DesignatorList *DesignatorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Designation) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Designation) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DesignatorList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// DesignatorCase represents case numbers of production Designator
|
|
|
|
type DesignatorCase int
|
|
|
|
|
|
|
|
// Values of type DesignatorCase
|
|
|
|
const (
|
|
|
|
DesignatorIndex DesignatorCase = iota
|
|
|
|
DesignatorField
|
|
|
|
DesignatorField2
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n DesignatorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case DesignatorIndex:
|
|
|
|
return "DesignatorIndex"
|
|
|
|
case DesignatorField:
|
|
|
|
return "DesignatorField"
|
|
|
|
case DesignatorField2:
|
|
|
|
return "DesignatorField2"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("DesignatorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Designator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Designator:
|
|
|
|
// '[' ConstantExpression ']' // Case DesignatorIndex
|
|
|
|
// | '.' IDENTIFIER // Case DesignatorField
|
|
|
|
// | IDENTIFIER ':' // Case DesignatorField2
|
|
|
|
type Designator struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
Case DesignatorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConstantExpression *ConstantExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Designator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Designator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 1, 2:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DesignatorList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// DesignatorList:
|
|
|
|
// Designator
|
|
|
|
// | DesignatorList Designator
|
|
|
|
type DesignatorList struct {
|
|
|
|
Designator *Designator
|
|
|
|
DesignatorList *DesignatorList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *DesignatorList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *DesignatorList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Designator.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// DirectAbstractDeclaratorCase represents case numbers of production DirectAbstractDeclarator
|
|
|
|
type DirectAbstractDeclaratorCase int
|
|
|
|
|
|
|
|
// Values of type DirectAbstractDeclaratorCase
|
|
|
|
const (
|
|
|
|
DirectAbstractDeclaratorDecl DirectAbstractDeclaratorCase = iota
|
|
|
|
DirectAbstractDeclaratorArr
|
|
|
|
DirectAbstractDeclaratorStaticArr
|
|
|
|
DirectAbstractDeclaratorArrStatic
|
|
|
|
DirectAbstractDeclaratorArrStar
|
|
|
|
DirectAbstractDeclaratorFunc
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n DirectAbstractDeclaratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case DirectAbstractDeclaratorDecl:
|
|
|
|
return "DirectAbstractDeclaratorDecl"
|
|
|
|
case DirectAbstractDeclaratorArr:
|
|
|
|
return "DirectAbstractDeclaratorArr"
|
|
|
|
case DirectAbstractDeclaratorStaticArr:
|
|
|
|
return "DirectAbstractDeclaratorStaticArr"
|
|
|
|
case DirectAbstractDeclaratorArrStatic:
|
|
|
|
return "DirectAbstractDeclaratorArrStatic"
|
|
|
|
case DirectAbstractDeclaratorArrStar:
|
|
|
|
return "DirectAbstractDeclaratorArrStar"
|
|
|
|
case DirectAbstractDeclaratorFunc:
|
|
|
|
return "DirectAbstractDeclaratorFunc"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("DirectAbstractDeclaratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DirectAbstractDeclarator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// DirectAbstractDeclarator:
|
|
|
|
// '(' AbstractDeclarator ')' // Case DirectAbstractDeclaratorDecl
|
|
|
|
// | DirectAbstractDeclarator '[' TypeQualifiers AssignmentExpression ']' // Case DirectAbstractDeclaratorArr
|
|
|
|
// | DirectAbstractDeclarator '[' "static" TypeQualifiers AssignmentExpression ']' // Case DirectAbstractDeclaratorStaticArr
|
|
|
|
// | DirectAbstractDeclarator '[' TypeQualifiers "static" AssignmentExpression ']' // Case DirectAbstractDeclaratorArrStatic
|
|
|
|
// | DirectAbstractDeclarator '[' '*' ']' // Case DirectAbstractDeclaratorArrStar
|
|
|
|
// | DirectAbstractDeclarator '(' ParameterTypeList ')' // Case DirectAbstractDeclaratorFunc
|
|
|
|
type DirectAbstractDeclarator struct {
|
|
|
|
paramScope Scope
|
|
|
|
typeQualifiers *typeBase
|
|
|
|
AbstractDeclarator *AbstractDeclarator
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Case DirectAbstractDeclaratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
DirectAbstractDeclarator *DirectAbstractDeclarator
|
|
|
|
ParameterTypeList *ParameterTypeList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeQualifiers *TypeQualifiers
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *DirectAbstractDeclarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *DirectAbstractDeclarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 5:
|
|
|
|
if p := n.DirectAbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ParameterTypeList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 4:
|
|
|
|
if p := n.DirectAbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.DirectAbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.DirectAbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.DirectAbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AbstractDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DirectDeclaratorCase represents case numbers of production DirectDeclarator
|
|
|
|
type DirectDeclaratorCase int
|
|
|
|
|
|
|
|
// Values of type DirectDeclaratorCase
|
|
|
|
const (
|
|
|
|
DirectDeclaratorIdent DirectDeclaratorCase = iota
|
|
|
|
DirectDeclaratorDecl
|
|
|
|
DirectDeclaratorArr
|
|
|
|
DirectDeclaratorStaticArr
|
|
|
|
DirectDeclaratorArrStatic
|
|
|
|
DirectDeclaratorStar
|
|
|
|
DirectDeclaratorFuncParam
|
|
|
|
DirectDeclaratorFuncIdent
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n DirectDeclaratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case DirectDeclaratorIdent:
|
|
|
|
return "DirectDeclaratorIdent"
|
|
|
|
case DirectDeclaratorDecl:
|
|
|
|
return "DirectDeclaratorDecl"
|
|
|
|
case DirectDeclaratorArr:
|
|
|
|
return "DirectDeclaratorArr"
|
|
|
|
case DirectDeclaratorStaticArr:
|
|
|
|
return "DirectDeclaratorStaticArr"
|
|
|
|
case DirectDeclaratorArrStatic:
|
|
|
|
return "DirectDeclaratorArrStatic"
|
|
|
|
case DirectDeclaratorStar:
|
|
|
|
return "DirectDeclaratorStar"
|
|
|
|
case DirectDeclaratorFuncParam:
|
|
|
|
return "DirectDeclaratorFuncParam"
|
|
|
|
case DirectDeclaratorFuncIdent:
|
|
|
|
return "DirectDeclaratorFuncIdent"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("DirectDeclaratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DirectDeclarator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// DirectDeclarator:
|
|
|
|
// IDENTIFIER Asm // Case DirectDeclaratorIdent
|
|
|
|
// | '(' AttributeSpecifierList Declarator ')' // Case DirectDeclaratorDecl
|
|
|
|
// | DirectDeclarator '[' TypeQualifiers AssignmentExpression ']' // Case DirectDeclaratorArr
|
|
|
|
// | DirectDeclarator '[' "static" TypeQualifiers AssignmentExpression ']' // Case DirectDeclaratorStaticArr
|
|
|
|
// | DirectDeclarator '[' TypeQualifiers "static" AssignmentExpression ']' // Case DirectDeclaratorArrStatic
|
|
|
|
// | DirectDeclarator '[' TypeQualifiers '*' ']' // Case DirectDeclaratorStar
|
|
|
|
// | DirectDeclarator '(' ParameterTypeList ')' // Case DirectDeclaratorFuncParam
|
|
|
|
// | DirectDeclarator '(' IdentifierList ')' // Case DirectDeclaratorFuncIdent
|
|
|
|
type DirectDeclarator struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
paramScope Scope
|
|
|
|
typeQualifiers *typeBase
|
|
|
|
idListNoDeclList bool
|
|
|
|
Asm *Asm
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case DirectDeclaratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Declarator *Declarator
|
|
|
|
DirectDeclarator *DirectDeclarator
|
|
|
|
IdentifierList *IdentifierList
|
|
|
|
ParameterTypeList *ParameterTypeList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeQualifiers *TypeQualifiers
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *DirectDeclarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *DirectDeclarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 7:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.IdentifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 6:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ParameterTypeList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 4:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 5:
|
|
|
|
if p := n.DirectDeclarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Asm.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EnumSpecifierCase represents case numbers of production EnumSpecifier
|
|
|
|
type EnumSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type EnumSpecifierCase
|
|
|
|
const (
|
|
|
|
EnumSpecifierDef EnumSpecifierCase = iota
|
|
|
|
EnumSpecifierTag
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n EnumSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case EnumSpecifierDef:
|
|
|
|
return "EnumSpecifierDef"
|
|
|
|
case EnumSpecifierTag:
|
|
|
|
return "EnumSpecifierTag"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("EnumSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EnumSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// EnumSpecifier:
|
|
|
|
// "enum" AttributeSpecifierList IDENTIFIER '{' EnumeratorList ',' '}' // Case EnumSpecifierDef
|
|
|
|
// | "enum" AttributeSpecifierList IDENTIFIER // Case EnumSpecifierTag
|
|
|
|
type EnumSpecifier struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
typ Type
|
|
|
|
min Value
|
|
|
|
max Value
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case EnumSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
EnumeratorList *EnumeratorList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
Token5 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *EnumSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *EnumSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.EnumeratorList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token5.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EnumeratorCase represents case numbers of production Enumerator
|
|
|
|
type EnumeratorCase int
|
|
|
|
|
|
|
|
// Values of type EnumeratorCase
|
|
|
|
const (
|
|
|
|
EnumeratorIdent EnumeratorCase = iota
|
|
|
|
EnumeratorExpr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n EnumeratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case EnumeratorIdent:
|
|
|
|
return "EnumeratorIdent"
|
|
|
|
case EnumeratorExpr:
|
|
|
|
return "EnumeratorExpr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("EnumeratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enumerator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Enumerator:
|
|
|
|
// IDENTIFIER AttributeSpecifierList // Case EnumeratorIdent
|
|
|
|
// | IDENTIFIER AttributeSpecifierList '=' ConstantExpression // Case EnumeratorExpr
|
|
|
|
type Enumerator struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
Operand Operand
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case EnumeratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConstantExpression *ConstantExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Enumerator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Enumerator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifierList.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ConstantExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EnumeratorList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// EnumeratorList:
|
|
|
|
// Enumerator
|
|
|
|
// | EnumeratorList ',' Enumerator
|
|
|
|
type EnumeratorList struct {
|
|
|
|
Enumerator *Enumerator
|
|
|
|
EnumeratorList *EnumeratorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *EnumeratorList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *EnumeratorList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Enumerator.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// EqualityExpressionCase represents case numbers of production EqualityExpression
|
|
|
|
type EqualityExpressionCase int
|
|
|
|
|
|
|
|
// Values of type EqualityExpressionCase
|
|
|
|
const (
|
|
|
|
EqualityExpressionRel EqualityExpressionCase = iota
|
|
|
|
EqualityExpressionEq
|
|
|
|
EqualityExpressionNeq
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n EqualityExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case EqualityExpressionRel:
|
|
|
|
return "EqualityExpressionRel"
|
|
|
|
case EqualityExpressionEq:
|
|
|
|
return "EqualityExpressionEq"
|
|
|
|
case EqualityExpressionNeq:
|
|
|
|
return "EqualityExpressionNeq"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("EqualityExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EqualityExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// EqualityExpression:
|
|
|
|
// RelationalExpression // Case EqualityExpressionRel
|
|
|
|
// | EqualityExpression "==" RelationalExpression // Case EqualityExpressionEq
|
|
|
|
// | EqualityExpression "!=" RelationalExpression // Case EqualityExpressionNeq
|
|
|
|
type EqualityExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case EqualityExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
EqualityExpression *EqualityExpression
|
|
|
|
RelationalExpression *RelationalExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *EqualityExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *EqualityExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1, 2:
|
|
|
|
if p := n.EqualityExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.RelationalExpression.Position()
|
|
|
|
case 0:
|
|
|
|
return n.RelationalExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExclusiveOrExpressionCase represents case numbers of production ExclusiveOrExpression
|
|
|
|
type ExclusiveOrExpressionCase int
|
|
|
|
|
|
|
|
// Values of type ExclusiveOrExpressionCase
|
|
|
|
const (
|
|
|
|
ExclusiveOrExpressionAnd ExclusiveOrExpressionCase = iota
|
|
|
|
ExclusiveOrExpressionXor
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ExclusiveOrExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ExclusiveOrExpressionAnd:
|
|
|
|
return "ExclusiveOrExpressionAnd"
|
|
|
|
case ExclusiveOrExpressionXor:
|
|
|
|
return "ExclusiveOrExpressionXor"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ExclusiveOrExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExclusiveOrExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ExclusiveOrExpression:
|
|
|
|
// AndExpression // Case ExclusiveOrExpressionAnd
|
|
|
|
// | ExclusiveOrExpression '^' AndExpression // Case ExclusiveOrExpressionXor
|
|
|
|
type ExclusiveOrExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AndExpression *AndExpression
|
|
|
|
Case ExclusiveOrExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ExclusiveOrExpression *ExclusiveOrExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ExclusiveOrExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ExclusiveOrExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.AndExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.ExclusiveOrExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AndExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExpressionCase represents case numbers of production Expression
|
|
|
|
type ExpressionCase int
|
|
|
|
|
|
|
|
// Values of type ExpressionCase
|
|
|
|
const (
|
|
|
|
ExpressionAssign ExpressionCase = iota
|
|
|
|
ExpressionComma
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ExpressionAssign:
|
|
|
|
return "ExpressionAssign"
|
|
|
|
case ExpressionComma:
|
|
|
|
return "ExpressionComma"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Expression:
|
|
|
|
// AssignmentExpression // Case ExpressionAssign
|
|
|
|
// | Expression ',' AssignmentExpression // Case ExpressionComma
|
|
|
|
type Expression struct {
|
|
|
|
Operand Operand
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Case ExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Expression *Expression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Expression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Expression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExpressionList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ExpressionList:
|
|
|
|
// AssignmentExpression
|
|
|
|
// | ExpressionList ',' AssignmentExpression
|
|
|
|
type ExpressionList struct {
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
ExpressionList *ExpressionList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ExpressionList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ExpressionList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExpressionStatement represents data reduced by production:
|
|
|
|
//
|
|
|
|
// ExpressionStatement:
|
|
|
|
// Expression AttributeSpecifierList ';'
|
|
|
|
type ExpressionStatement struct {
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Expression *Expression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ExpressionStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ExpressionStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExternalDeclarationCase represents case numbers of production ExternalDeclaration
|
|
|
|
type ExternalDeclarationCase int
|
|
|
|
|
|
|
|
// Values of type ExternalDeclarationCase
|
|
|
|
const (
|
|
|
|
ExternalDeclarationFuncDef ExternalDeclarationCase = iota
|
|
|
|
ExternalDeclarationDecl
|
|
|
|
ExternalDeclarationAsm
|
|
|
|
ExternalDeclarationAsmStmt
|
|
|
|
ExternalDeclarationEmpty
|
|
|
|
ExternalDeclarationPragma
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ExternalDeclarationCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ExternalDeclarationFuncDef:
|
|
|
|
return "ExternalDeclarationFuncDef"
|
|
|
|
case ExternalDeclarationDecl:
|
|
|
|
return "ExternalDeclarationDecl"
|
|
|
|
case ExternalDeclarationAsm:
|
|
|
|
return "ExternalDeclarationAsm"
|
|
|
|
case ExternalDeclarationAsmStmt:
|
|
|
|
return "ExternalDeclarationAsmStmt"
|
|
|
|
case ExternalDeclarationEmpty:
|
|
|
|
return "ExternalDeclarationEmpty"
|
|
|
|
case ExternalDeclarationPragma:
|
|
|
|
return "ExternalDeclarationPragma"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ExternalDeclarationCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExternalDeclaration represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ExternalDeclaration:
|
|
|
|
// FunctionDefinition // Case ExternalDeclarationFuncDef
|
|
|
|
// | Declaration // Case ExternalDeclarationDecl
|
|
|
|
// | AsmFunctionDefinition // Case ExternalDeclarationAsm
|
|
|
|
// | AsmStatement // Case ExternalDeclarationAsmStmt
|
|
|
|
// | ';' // Case ExternalDeclarationEmpty
|
|
|
|
// | PragmaSTDC // Case ExternalDeclarationPragma
|
|
|
|
type ExternalDeclaration struct {
|
|
|
|
AsmFunctionDefinition *AsmFunctionDefinition
|
|
|
|
AsmStatement *AsmStatement
|
|
|
|
Case ExternalDeclarationCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Declaration *Declaration
|
|
|
|
FunctionDefinition *FunctionDefinition
|
|
|
|
PragmaSTDC *PragmaSTDC
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ExternalDeclaration) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ExternalDeclaration) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 2:
|
|
|
|
return n.AsmFunctionDefinition.Position()
|
|
|
|
case 3:
|
|
|
|
return n.AsmStatement.Position()
|
|
|
|
case 1:
|
|
|
|
return n.Declaration.Position()
|
|
|
|
case 0:
|
|
|
|
return n.FunctionDefinition.Position()
|
|
|
|
case 5:
|
|
|
|
return n.PragmaSTDC.Position()
|
|
|
|
case 4:
|
|
|
|
return n.Token.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// FunctionDefinition represents data reduced by production:
|
|
|
|
//
|
|
|
|
// FunctionDefinition:
|
|
|
|
// DeclarationSpecifiers Declarator DeclarationList CompoundStatement
|
|
|
|
type FunctionDefinition struct {
|
|
|
|
CallSiteComplexExpr []*AssignmentExpression
|
|
|
|
CompositeLiterals []*PostfixExpression
|
|
|
|
ComputedGotos map[StringID]*UnaryExpression
|
|
|
|
Gotos map[StringID]*JumpStatement
|
|
|
|
InitDeclarators []*InitDeclarator
|
|
|
|
Labels map[StringID]*LabeledStatement
|
|
|
|
ReturnComplexExpr []*Expression
|
|
|
|
VLAs []*Declarator
|
|
|
|
compoundStatements []*CompoundStatement
|
|
|
|
checked bool
|
|
|
|
CompoundStatement *CompoundStatement
|
|
|
|
DeclarationList *DeclarationList
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
Declarator *Declarator
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *FunctionDefinition) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *FunctionDefinition) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.DeclarationList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.CompoundStatement.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// FunctionSpecifierCase represents case numbers of production FunctionSpecifier
|
|
|
|
type FunctionSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type FunctionSpecifierCase
|
|
|
|
const (
|
|
|
|
FunctionSpecifierInline FunctionSpecifierCase = iota
|
|
|
|
FunctionSpecifierNoreturn
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n FunctionSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case FunctionSpecifierInline:
|
|
|
|
return "FunctionSpecifierInline"
|
|
|
|
case FunctionSpecifierNoreturn:
|
|
|
|
return "FunctionSpecifierNoreturn"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("FunctionSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// FunctionSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// FunctionSpecifier:
|
|
|
|
// "inline" // Case FunctionSpecifierInline
|
|
|
|
// | "_Noreturn" // Case FunctionSpecifierNoreturn
|
|
|
|
type FunctionSpecifier struct {
|
|
|
|
Case FunctionSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *FunctionSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *FunctionSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// IdentifierList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// IdentifierList:
|
|
|
|
// IDENTIFIER
|
|
|
|
// | IdentifierList ',' IDENTIFIER
|
|
|
|
type IdentifierList struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
IdentifierList *IdentifierList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *IdentifierList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *IdentifierList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// InclusiveOrExpressionCase represents case numbers of production InclusiveOrExpression
|
|
|
|
type InclusiveOrExpressionCase int
|
|
|
|
|
|
|
|
// Values of type InclusiveOrExpressionCase
|
|
|
|
const (
|
|
|
|
InclusiveOrExpressionXor InclusiveOrExpressionCase = iota
|
|
|
|
InclusiveOrExpressionOr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n InclusiveOrExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case InclusiveOrExpressionXor:
|
|
|
|
return "InclusiveOrExpressionXor"
|
|
|
|
case InclusiveOrExpressionOr:
|
|
|
|
return "InclusiveOrExpressionOr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("InclusiveOrExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InclusiveOrExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// InclusiveOrExpression:
|
|
|
|
// ExclusiveOrExpression // Case InclusiveOrExpressionXor
|
|
|
|
// | InclusiveOrExpression '|' ExclusiveOrExpression // Case InclusiveOrExpressionOr
|
|
|
|
type InclusiveOrExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case InclusiveOrExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ExclusiveOrExpression *ExclusiveOrExpression
|
|
|
|
InclusiveOrExpression *InclusiveOrExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *InclusiveOrExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *InclusiveOrExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.ExclusiveOrExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.InclusiveOrExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ExclusiveOrExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitDeclaratorCase represents case numbers of production InitDeclarator
|
|
|
|
type InitDeclaratorCase int
|
|
|
|
|
|
|
|
// Values of type InitDeclaratorCase
|
|
|
|
const (
|
|
|
|
InitDeclaratorDecl InitDeclaratorCase = iota
|
|
|
|
InitDeclaratorInit
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n InitDeclaratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case InitDeclaratorDecl:
|
|
|
|
return "InitDeclaratorDecl"
|
|
|
|
case InitDeclaratorInit:
|
|
|
|
return "InitDeclaratorInit"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("InitDeclaratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitDeclarator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// InitDeclarator:
|
|
|
|
// Declarator AttributeSpecifierList // Case InitDeclaratorDecl
|
|
|
|
// | Declarator AttributeSpecifierList '=' Initializer // Case InitDeclaratorInit
|
|
|
|
type InitDeclarator struct {
|
|
|
|
initializer *InitializerValue
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case InitDeclaratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Declarator *Declarator
|
|
|
|
Initializer *Initializer
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *InitDeclarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *InitDeclarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifierList.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Initializer.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitDeclaratorList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// InitDeclaratorList:
|
|
|
|
// InitDeclarator
|
|
|
|
// | InitDeclaratorList ',' AttributeSpecifierList InitDeclarator
|
|
|
|
type InitDeclaratorList struct {
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
InitDeclarator *InitDeclarator
|
|
|
|
InitDeclaratorList *InitDeclaratorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *InitDeclaratorList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *InitDeclaratorList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.InitDeclarator.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitializerCase represents case numbers of production Initializer
|
|
|
|
type InitializerCase int
|
|
|
|
|
|
|
|
// Values of type InitializerCase
|
|
|
|
const (
|
|
|
|
InitializerExpr InitializerCase = iota
|
|
|
|
InitializerInitList
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n InitializerCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case InitializerExpr:
|
|
|
|
return "InitializerExpr"
|
|
|
|
case InitializerInitList:
|
|
|
|
return "InitializerInitList"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("InitializerCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Initializer represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Initializer:
|
|
|
|
// AssignmentExpression // Case InitializerExpr
|
|
|
|
// | '{' InitializerList ',' '}' // Case InitializerInitList
|
|
|
|
type Initializer struct {
|
|
|
|
Field Field // Where aplicable
|
|
|
|
Offset uintptr // Case Expr
|
|
|
|
field0 Field
|
|
|
|
list []*Initializer
|
|
|
|
parent *Initializer
|
|
|
|
trailingComma *Token
|
|
|
|
typ Type
|
|
|
|
isConst bool
|
|
|
|
isZero bool
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
Case InitializerCase `PrettyPrint:"stringer,zero"`
|
|
|
|
InitializerList *InitializerList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Initializer) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Initializer) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.AssignmentExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.InitializerList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitializerList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// InitializerList:
|
|
|
|
// Designation Initializer
|
|
|
|
// | InitializerList ',' Designation Initializer
|
|
|
|
type InitializerList struct {
|
|
|
|
list []*Initializer
|
|
|
|
isConst bool
|
|
|
|
isZero bool
|
|
|
|
Designation *Designation
|
|
|
|
Initializer *Initializer
|
|
|
|
InitializerList *InitializerList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *InitializerList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *InitializerList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Designation.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Initializer.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// IterationStatementCase represents case numbers of production IterationStatement
|
|
|
|
type IterationStatementCase int
|
|
|
|
|
|
|
|
// Values of type IterationStatementCase
|
|
|
|
const (
|
|
|
|
IterationStatementWhile IterationStatementCase = iota
|
|
|
|
IterationStatementDo
|
|
|
|
IterationStatementFor
|
|
|
|
IterationStatementForDecl
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n IterationStatementCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case IterationStatementWhile:
|
|
|
|
return "IterationStatementWhile"
|
|
|
|
case IterationStatementDo:
|
|
|
|
return "IterationStatementDo"
|
|
|
|
case IterationStatementFor:
|
|
|
|
return "IterationStatementFor"
|
|
|
|
case IterationStatementForDecl:
|
|
|
|
return "IterationStatementForDecl"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("IterationStatementCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// IterationStatement represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// IterationStatement:
|
|
|
|
// "while" '(' Expression ')' Statement // Case IterationStatementWhile
|
|
|
|
// | "do" Statement "while" '(' Expression ')' ';' // Case IterationStatementDo
|
|
|
|
// | "for" '(' Expression ';' Expression ';' Expression ')' Statement // Case IterationStatementFor
|
|
|
|
// | "for" '(' Declaration Expression ';' Expression ')' Statement // Case IterationStatementForDecl
|
|
|
|
type IterationStatement struct {
|
|
|
|
Case IterationStatementCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Declaration *Declaration
|
|
|
|
Expression *Expression
|
|
|
|
Expression2 *Expression
|
|
|
|
Expression3 *Expression
|
|
|
|
Statement *Statement
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
Token5 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *IterationStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *IterationStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Statement.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token5.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declaration.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token5.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// JumpStatementCase represents case numbers of production JumpStatement
|
|
|
|
type JumpStatementCase int
|
|
|
|
|
|
|
|
// Values of type JumpStatementCase
|
|
|
|
const (
|
|
|
|
JumpStatementGoto JumpStatementCase = iota
|
|
|
|
JumpStatementGotoExpr
|
|
|
|
JumpStatementContinue
|
|
|
|
JumpStatementBreak
|
|
|
|
JumpStatementReturn
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n JumpStatementCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case JumpStatementGoto:
|
|
|
|
return "JumpStatementGoto"
|
|
|
|
case JumpStatementGotoExpr:
|
|
|
|
return "JumpStatementGotoExpr"
|
|
|
|
case JumpStatementContinue:
|
|
|
|
return "JumpStatementContinue"
|
|
|
|
case JumpStatementBreak:
|
|
|
|
return "JumpStatementBreak"
|
|
|
|
case JumpStatementReturn:
|
|
|
|
return "JumpStatementReturn"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("JumpStatementCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// JumpStatement represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// JumpStatement:
|
|
|
|
// "goto" IDENTIFIER ';' // Case JumpStatementGoto
|
|
|
|
// | "goto" '*' Expression ';' // Case JumpStatementGotoExpr
|
|
|
|
// | "continue" ';' // Case JumpStatementContinue
|
|
|
|
// | "break" ';' // Case JumpStatementBreak
|
|
|
|
// | "return" Expression ';' // Case JumpStatementReturn
|
|
|
|
type JumpStatement struct {
|
|
|
|
context Node
|
|
|
|
lexicalScope Scope
|
|
|
|
Case JumpStatementCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Expression *Expression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *JumpStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *JumpStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 4:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 2, 3:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LabelDeclaration represents data reduced by production:
|
|
|
|
//
|
|
|
|
// LabelDeclaration:
|
|
|
|
// "__label__" IdentifierList ';'
|
|
|
|
type LabelDeclaration struct {
|
|
|
|
IdentifierList *IdentifierList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *LabelDeclaration) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *LabelDeclaration) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.IdentifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// LabeledStatementCase represents case numbers of production LabeledStatement
|
|
|
|
type LabeledStatementCase int
|
|
|
|
|
|
|
|
// Values of type LabeledStatementCase
|
|
|
|
const (
|
|
|
|
LabeledStatementLabel LabeledStatementCase = iota
|
|
|
|
LabeledStatementCaseLabel
|
|
|
|
LabeledStatementRange
|
|
|
|
LabeledStatementDefault
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n LabeledStatementCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case LabeledStatementLabel:
|
|
|
|
return "LabeledStatementLabel"
|
|
|
|
case LabeledStatementCaseLabel:
|
|
|
|
return "LabeledStatementCaseLabel"
|
|
|
|
case LabeledStatementRange:
|
|
|
|
return "LabeledStatementRange"
|
|
|
|
case LabeledStatementDefault:
|
|
|
|
return "LabeledStatementDefault"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("LabeledStatementCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LabeledStatement represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// LabeledStatement:
|
|
|
|
// IDENTIFIER ':' AttributeSpecifierList Statement // Case LabeledStatementLabel
|
|
|
|
// | "case" ConstantExpression ':' Statement // Case LabeledStatementCaseLabel
|
|
|
|
// | "case" ConstantExpression "..." ConstantExpression ':' Statement // Case LabeledStatementRange
|
|
|
|
// | "default" ':' Statement // Case LabeledStatementDefault
|
|
|
|
type LabeledStatement struct {
|
|
|
|
block *CompoundStatement
|
|
|
|
lexicalScope Scope
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case LabeledStatementCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConstantExpression *ConstantExpression
|
|
|
|
ConstantExpression2 *ConstantExpression
|
|
|
|
Statement *Statement
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *LabeledStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *LabeledStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 2:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LogicalAndExpressionCase represents case numbers of production LogicalAndExpression
|
|
|
|
type LogicalAndExpressionCase int
|
|
|
|
|
|
|
|
// Values of type LogicalAndExpressionCase
|
|
|
|
const (
|
|
|
|
LogicalAndExpressionOr LogicalAndExpressionCase = iota
|
|
|
|
LogicalAndExpressionLAnd
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n LogicalAndExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case LogicalAndExpressionOr:
|
|
|
|
return "LogicalAndExpressionOr"
|
|
|
|
case LogicalAndExpressionLAnd:
|
|
|
|
return "LogicalAndExpressionLAnd"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("LogicalAndExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LogicalAndExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// LogicalAndExpression:
|
|
|
|
// InclusiveOrExpression // Case LogicalAndExpressionOr
|
|
|
|
// | LogicalAndExpression "&&" InclusiveOrExpression // Case LogicalAndExpressionLAnd
|
|
|
|
type LogicalAndExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case LogicalAndExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
InclusiveOrExpression *InclusiveOrExpression
|
|
|
|
LogicalAndExpression *LogicalAndExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *LogicalAndExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *LogicalAndExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.InclusiveOrExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.LogicalAndExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.InclusiveOrExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LogicalOrExpressionCase represents case numbers of production LogicalOrExpression
|
|
|
|
type LogicalOrExpressionCase int
|
|
|
|
|
|
|
|
// Values of type LogicalOrExpressionCase
|
|
|
|
const (
|
|
|
|
LogicalOrExpressionLAnd LogicalOrExpressionCase = iota
|
|
|
|
LogicalOrExpressionLOr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n LogicalOrExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case LogicalOrExpressionLAnd:
|
|
|
|
return "LogicalOrExpressionLAnd"
|
|
|
|
case LogicalOrExpressionLOr:
|
|
|
|
return "LogicalOrExpressionLOr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("LogicalOrExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LogicalOrExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// LogicalOrExpression:
|
|
|
|
// LogicalAndExpression // Case LogicalOrExpressionLAnd
|
|
|
|
// | LogicalOrExpression "||" LogicalAndExpression // Case LogicalOrExpressionLOr
|
|
|
|
type LogicalOrExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case LogicalOrExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
LogicalAndExpression *LogicalAndExpression
|
|
|
|
LogicalOrExpression *LogicalOrExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *LogicalOrExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *LogicalOrExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.LogicalAndExpression.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.LogicalOrExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.LogicalAndExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MultiplicativeExpressionCase represents case numbers of production MultiplicativeExpression
|
|
|
|
type MultiplicativeExpressionCase int
|
|
|
|
|
|
|
|
// Values of type MultiplicativeExpressionCase
|
|
|
|
const (
|
|
|
|
MultiplicativeExpressionCast MultiplicativeExpressionCase = iota
|
|
|
|
MultiplicativeExpressionMul
|
|
|
|
MultiplicativeExpressionDiv
|
|
|
|
MultiplicativeExpressionMod
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n MultiplicativeExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case MultiplicativeExpressionCast:
|
|
|
|
return "MultiplicativeExpressionCast"
|
|
|
|
case MultiplicativeExpressionMul:
|
|
|
|
return "MultiplicativeExpressionMul"
|
|
|
|
case MultiplicativeExpressionDiv:
|
|
|
|
return "MultiplicativeExpressionDiv"
|
|
|
|
case MultiplicativeExpressionMod:
|
|
|
|
return "MultiplicativeExpressionMod"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("MultiplicativeExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MultiplicativeExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// MultiplicativeExpression:
|
|
|
|
// CastExpression // Case MultiplicativeExpressionCast
|
|
|
|
// | MultiplicativeExpression '*' CastExpression // Case MultiplicativeExpressionMul
|
|
|
|
// | MultiplicativeExpression '/' CastExpression // Case MultiplicativeExpressionDiv
|
|
|
|
// | MultiplicativeExpression '%' CastExpression // Case MultiplicativeExpressionMod
|
|
|
|
type MultiplicativeExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case MultiplicativeExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CastExpression *CastExpression
|
|
|
|
MultiplicativeExpression *MultiplicativeExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *MultiplicativeExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *MultiplicativeExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.CastExpression.Position()
|
|
|
|
case 1, 2, 3:
|
|
|
|
if p := n.MultiplicativeExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.CastExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParameterDeclarationCase represents case numbers of production ParameterDeclaration
|
|
|
|
type ParameterDeclarationCase int
|
|
|
|
|
|
|
|
// Values of type ParameterDeclarationCase
|
|
|
|
const (
|
|
|
|
ParameterDeclarationDecl ParameterDeclarationCase = iota
|
|
|
|
ParameterDeclarationAbstract
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ParameterDeclarationCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ParameterDeclarationDecl:
|
|
|
|
return "ParameterDeclarationDecl"
|
|
|
|
case ParameterDeclarationAbstract:
|
|
|
|
return "ParameterDeclarationAbstract"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ParameterDeclarationCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParameterDeclaration represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ParameterDeclaration:
|
|
|
|
// DeclarationSpecifiers Declarator AttributeSpecifierList // Case ParameterDeclarationDecl
|
|
|
|
// | DeclarationSpecifiers AbstractDeclarator // Case ParameterDeclarationAbstract
|
|
|
|
type ParameterDeclaration struct {
|
|
|
|
typ Type
|
|
|
|
AbstractDeclarator *AbstractDeclarator
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case ParameterDeclarationCase `PrettyPrint:"stringer,zero"`
|
|
|
|
DeclarationSpecifiers *DeclarationSpecifiers
|
|
|
|
Declarator *Declarator
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ParameterDeclaration) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ParameterDeclaration) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AbstractDeclarator.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.DeclarationSpecifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifierList.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParameterList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ParameterList:
|
|
|
|
// ParameterDeclaration
|
|
|
|
// | ParameterList ',' ParameterDeclaration
|
|
|
|
type ParameterList struct {
|
|
|
|
ParameterDeclaration *ParameterDeclaration
|
|
|
|
ParameterList *ParameterList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ParameterList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ParameterList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ParameterDeclaration.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParameterTypeListCase represents case numbers of production ParameterTypeList
|
|
|
|
type ParameterTypeListCase int
|
|
|
|
|
|
|
|
// Values of type ParameterTypeListCase
|
|
|
|
const (
|
|
|
|
ParameterTypeListList ParameterTypeListCase = iota
|
|
|
|
ParameterTypeListVar
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ParameterTypeListCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ParameterTypeListList:
|
|
|
|
return "ParameterTypeListList"
|
|
|
|
case ParameterTypeListVar:
|
|
|
|
return "ParameterTypeListVar"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ParameterTypeListCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParameterTypeList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ParameterTypeList:
|
|
|
|
// ParameterList // Case ParameterTypeListList
|
|
|
|
// | ParameterList ',' "..." // Case ParameterTypeListVar
|
|
|
|
type ParameterTypeList struct {
|
|
|
|
Case ParameterTypeListCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ParameterList *ParameterList
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ParameterTypeList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ParameterTypeList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.ParameterList.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.ParameterList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PointerCase represents case numbers of production Pointer
|
|
|
|
type PointerCase int
|
|
|
|
|
|
|
|
// Values of type PointerCase
|
|
|
|
const (
|
|
|
|
PointerTypeQual PointerCase = iota
|
|
|
|
PointerPtr
|
2022-03-07 10:08:26 +00:00
|
|
|
PointerBlock
|
2021-08-29 15:41:41 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n PointerCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case PointerTypeQual:
|
|
|
|
return "PointerTypeQual"
|
|
|
|
case PointerPtr:
|
|
|
|
return "PointerPtr"
|
2022-03-07 10:08:26 +00:00
|
|
|
case PointerBlock:
|
|
|
|
return "PointerBlock"
|
2021-08-29 15:41:41 +01:00
|
|
|
default:
|
|
|
|
return fmt.Sprintf("PointerCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pointer represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Pointer:
|
|
|
|
// '*' TypeQualifiers // Case PointerTypeQual
|
|
|
|
// | '*' TypeQualifiers Pointer // Case PointerPtr
|
2022-03-07 10:08:26 +00:00
|
|
|
// | '^' TypeQualifiers // Case PointerBlock
|
2021-08-29 15:41:41 +01:00
|
|
|
type Pointer struct {
|
|
|
|
typeQualifiers *typeBase
|
|
|
|
Case PointerCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Pointer *Pointer
|
|
|
|
Token Token
|
|
|
|
TypeQualifiers *TypeQualifiers
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Pointer) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Pointer) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
2022-03-07 10:08:26 +00:00
|
|
|
case 0, 2:
|
2021-08-29 15:41:41 +01:00
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.TypeQualifiers.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Pointer.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PostfixExpressionCase represents case numbers of production PostfixExpression
|
|
|
|
type PostfixExpressionCase int
|
|
|
|
|
|
|
|
// Values of type PostfixExpressionCase
|
|
|
|
const (
|
|
|
|
PostfixExpressionPrimary PostfixExpressionCase = iota
|
|
|
|
PostfixExpressionIndex
|
|
|
|
PostfixExpressionCall
|
|
|
|
PostfixExpressionSelect
|
|
|
|
PostfixExpressionPSelect
|
|
|
|
PostfixExpressionInc
|
|
|
|
PostfixExpressionDec
|
|
|
|
PostfixExpressionComplit
|
|
|
|
PostfixExpressionTypeCmp
|
|
|
|
PostfixExpressionChooseExpr
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n PostfixExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case PostfixExpressionPrimary:
|
|
|
|
return "PostfixExpressionPrimary"
|
|
|
|
case PostfixExpressionIndex:
|
|
|
|
return "PostfixExpressionIndex"
|
|
|
|
case PostfixExpressionCall:
|
|
|
|
return "PostfixExpressionCall"
|
|
|
|
case PostfixExpressionSelect:
|
|
|
|
return "PostfixExpressionSelect"
|
|
|
|
case PostfixExpressionPSelect:
|
|
|
|
return "PostfixExpressionPSelect"
|
|
|
|
case PostfixExpressionInc:
|
|
|
|
return "PostfixExpressionInc"
|
|
|
|
case PostfixExpressionDec:
|
|
|
|
return "PostfixExpressionDec"
|
|
|
|
case PostfixExpressionComplit:
|
|
|
|
return "PostfixExpressionComplit"
|
|
|
|
case PostfixExpressionTypeCmp:
|
|
|
|
return "PostfixExpressionTypeCmp"
|
|
|
|
case PostfixExpressionChooseExpr:
|
|
|
|
return "PostfixExpressionChooseExpr"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("PostfixExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PostfixExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// PostfixExpression:
|
|
|
|
// PrimaryExpression // Case PostfixExpressionPrimary
|
|
|
|
// | PostfixExpression '[' Expression ']' // Case PostfixExpressionIndex
|
|
|
|
// | PostfixExpression '(' ArgumentExpressionList ')' // Case PostfixExpressionCall
|
|
|
|
// | PostfixExpression '.' IDENTIFIER // Case PostfixExpressionSelect
|
|
|
|
// | PostfixExpression "->" IDENTIFIER // Case PostfixExpressionPSelect
|
|
|
|
// | PostfixExpression "++" // Case PostfixExpressionInc
|
|
|
|
// | PostfixExpression "--" // Case PostfixExpressionDec
|
|
|
|
// | '(' TypeName ')' '{' InitializerList ',' '}' // Case PostfixExpressionComplit
|
|
|
|
// | "__builtin_types_compatible_p" '(' TypeName ',' TypeName ')' // Case PostfixExpressionTypeCmp
|
|
|
|
// | "__builtin_choose_expr" '(' AssignmentExpression ',' AssignmentExpression ',' AssignmentExpression ')' // Case PostfixExpressionChooseExpr
|
|
|
|
type PostfixExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
Field Field // Case Select, PSelect
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
ArgumentExpressionList *ArgumentExpressionList
|
|
|
|
AssignmentExpression *AssignmentExpression
|
|
|
|
AssignmentExpression2 *AssignmentExpression
|
|
|
|
AssignmentExpression3 *AssignmentExpression
|
|
|
|
Case PostfixExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Expression *Expression
|
|
|
|
InitializerList *InitializerList
|
|
|
|
PostfixExpression *PostfixExpression
|
|
|
|
PrimaryExpression *PrimaryExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
Token5 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
TypeName2 *TypeName
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *PostfixExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *PostfixExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 5, 6:
|
|
|
|
if p := n.PostfixExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.PostfixExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ArgumentExpressionList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.PostfixExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 3, 4:
|
|
|
|
if p := n.PostfixExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 0:
|
|
|
|
return n.PrimaryExpression.Position()
|
|
|
|
case 9:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AssignmentExpression3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token5.Position()
|
|
|
|
case 8:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token4.Position()
|
|
|
|
case 7:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.InitializerList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token5.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PragmaSTDC represents data reduced by production:
|
|
|
|
//
|
|
|
|
// PragmaSTDC:
|
|
|
|
// "__pragma_stdc" IDENTIFIER IDENTIFIER IDENTIFIER
|
|
|
|
type PragmaSTDC struct {
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *PragmaSTDC) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *PragmaSTDC) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token4.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// PrimaryExpressionCase represents case numbers of production PrimaryExpression
|
|
|
|
type PrimaryExpressionCase int
|
|
|
|
|
|
|
|
// Values of type PrimaryExpressionCase
|
|
|
|
const (
|
|
|
|
PrimaryExpressionIdent PrimaryExpressionCase = iota
|
|
|
|
PrimaryExpressionInt
|
|
|
|
PrimaryExpressionFloat
|
|
|
|
PrimaryExpressionEnum
|
|
|
|
PrimaryExpressionChar
|
|
|
|
PrimaryExpressionLChar
|
|
|
|
PrimaryExpressionString
|
|
|
|
PrimaryExpressionLString
|
|
|
|
PrimaryExpressionExpr
|
|
|
|
PrimaryExpressionStmt
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n PrimaryExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case PrimaryExpressionIdent:
|
|
|
|
return "PrimaryExpressionIdent"
|
|
|
|
case PrimaryExpressionInt:
|
|
|
|
return "PrimaryExpressionInt"
|
|
|
|
case PrimaryExpressionFloat:
|
|
|
|
return "PrimaryExpressionFloat"
|
|
|
|
case PrimaryExpressionEnum:
|
|
|
|
return "PrimaryExpressionEnum"
|
|
|
|
case PrimaryExpressionChar:
|
|
|
|
return "PrimaryExpressionChar"
|
|
|
|
case PrimaryExpressionLChar:
|
|
|
|
return "PrimaryExpressionLChar"
|
|
|
|
case PrimaryExpressionString:
|
|
|
|
return "PrimaryExpressionString"
|
|
|
|
case PrimaryExpressionLString:
|
|
|
|
return "PrimaryExpressionLString"
|
|
|
|
case PrimaryExpressionExpr:
|
|
|
|
return "PrimaryExpressionExpr"
|
|
|
|
case PrimaryExpressionStmt:
|
|
|
|
return "PrimaryExpressionStmt"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("PrimaryExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PrimaryExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// PrimaryExpression:
|
|
|
|
// IDENTIFIER // Case PrimaryExpressionIdent
|
|
|
|
// | INTCONST // Case PrimaryExpressionInt
|
|
|
|
// | FLOATCONST // Case PrimaryExpressionFloat
|
|
|
|
// | ENUMCONST // Case PrimaryExpressionEnum
|
|
|
|
// | CHARCONST // Case PrimaryExpressionChar
|
|
|
|
// | LONGCHARCONST // Case PrimaryExpressionLChar
|
|
|
|
// | STRINGLITERAL // Case PrimaryExpressionString
|
|
|
|
// | LONGSTRINGLITERAL // Case PrimaryExpressionLString
|
|
|
|
// | '(' Expression ')' // Case PrimaryExpressionExpr
|
|
|
|
// | '(' CompoundStatement ')' // Case PrimaryExpressionStmt
|
|
|
|
type PrimaryExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
lexicalScope Scope
|
|
|
|
resolvedIn Scope
|
|
|
|
resolvedTo Node
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case PrimaryExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CompoundStatement *CompoundStatement
|
|
|
|
Expression *Expression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *PrimaryExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *PrimaryExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0, 1, 2, 3, 4, 5, 6, 7:
|
|
|
|
return n.Token.Position()
|
|
|
|
case 9:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.CompoundStatement.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 8:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// RelationalExpressionCase represents case numbers of production RelationalExpression
|
|
|
|
type RelationalExpressionCase int
|
|
|
|
|
|
|
|
// Values of type RelationalExpressionCase
|
|
|
|
const (
|
|
|
|
RelationalExpressionShift RelationalExpressionCase = iota
|
|
|
|
RelationalExpressionLt
|
|
|
|
RelationalExpressionGt
|
|
|
|
RelationalExpressionLeq
|
|
|
|
RelationalExpressionGeq
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n RelationalExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case RelationalExpressionShift:
|
|
|
|
return "RelationalExpressionShift"
|
|
|
|
case RelationalExpressionLt:
|
|
|
|
return "RelationalExpressionLt"
|
|
|
|
case RelationalExpressionGt:
|
|
|
|
return "RelationalExpressionGt"
|
|
|
|
case RelationalExpressionLeq:
|
|
|
|
return "RelationalExpressionLeq"
|
|
|
|
case RelationalExpressionGeq:
|
|
|
|
return "RelationalExpressionGeq"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("RelationalExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// RelationalExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// RelationalExpression:
|
|
|
|
// ShiftExpression // Case RelationalExpressionShift
|
|
|
|
// | RelationalExpression '<' ShiftExpression // Case RelationalExpressionLt
|
|
|
|
// | RelationalExpression '>' ShiftExpression // Case RelationalExpressionGt
|
|
|
|
// | RelationalExpression "<=" ShiftExpression // Case RelationalExpressionLeq
|
|
|
|
// | RelationalExpression ">=" ShiftExpression // Case RelationalExpressionGeq
|
|
|
|
type RelationalExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case RelationalExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
RelationalExpression *RelationalExpression
|
|
|
|
ShiftExpression *ShiftExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *RelationalExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *RelationalExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1, 2, 3, 4:
|
|
|
|
if p := n.RelationalExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ShiftExpression.Position()
|
|
|
|
case 0:
|
|
|
|
return n.ShiftExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SelectionStatementCase represents case numbers of production SelectionStatement
|
|
|
|
type SelectionStatementCase int
|
|
|
|
|
|
|
|
// Values of type SelectionStatementCase
|
|
|
|
const (
|
|
|
|
SelectionStatementIf SelectionStatementCase = iota
|
|
|
|
SelectionStatementIfElse
|
|
|
|
SelectionStatementSwitch
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n SelectionStatementCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case SelectionStatementIf:
|
|
|
|
return "SelectionStatementIf"
|
|
|
|
case SelectionStatementIfElse:
|
|
|
|
return "SelectionStatementIfElse"
|
|
|
|
case SelectionStatementSwitch:
|
|
|
|
return "SelectionStatementSwitch"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("SelectionStatementCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SelectionStatement represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// SelectionStatement:
|
|
|
|
// "if" '(' Expression ')' Statement // Case SelectionStatementIf
|
|
|
|
// | "if" '(' Expression ')' Statement "else" Statement // Case SelectionStatementIfElse
|
|
|
|
// | "switch" '(' Expression ')' Statement // Case SelectionStatementSwitch
|
|
|
|
type SelectionStatement struct {
|
|
|
|
promote Type // switch expression promoted type
|
|
|
|
cases []*LabeledStatement
|
|
|
|
Case SelectionStatementCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Expression *Expression
|
|
|
|
Statement *Statement
|
|
|
|
Statement2 *Statement
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
Token4 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *SelectionStatement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *SelectionStatement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0, 2:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token3.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Statement.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token4.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Statement2.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ShiftExpressionCase represents case numbers of production ShiftExpression
|
|
|
|
type ShiftExpressionCase int
|
|
|
|
|
|
|
|
// Values of type ShiftExpressionCase
|
|
|
|
const (
|
|
|
|
ShiftExpressionAdd ShiftExpressionCase = iota
|
|
|
|
ShiftExpressionLsh
|
|
|
|
ShiftExpressionRsh
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n ShiftExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case ShiftExpressionAdd:
|
|
|
|
return "ShiftExpressionAdd"
|
|
|
|
case ShiftExpressionLsh:
|
|
|
|
return "ShiftExpressionLsh"
|
|
|
|
case ShiftExpressionRsh:
|
|
|
|
return "ShiftExpressionRsh"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("ShiftExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ShiftExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// ShiftExpression:
|
|
|
|
// AdditiveExpression // Case ShiftExpressionAdd
|
|
|
|
// | ShiftExpression "<<" AdditiveExpression // Case ShiftExpressionLsh
|
|
|
|
// | ShiftExpression ">>" AdditiveExpression // Case ShiftExpressionRsh
|
|
|
|
type ShiftExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
promote Type // shift count promoted type
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
AdditiveExpression *AdditiveExpression
|
|
|
|
Case ShiftExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ShiftExpression *ShiftExpression
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *ShiftExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *ShiftExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.AdditiveExpression.Position()
|
|
|
|
case 1, 2:
|
|
|
|
if p := n.ShiftExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AdditiveExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SpecifierQualifierListCase represents case numbers of production SpecifierQualifierList
|
|
|
|
type SpecifierQualifierListCase int
|
|
|
|
|
|
|
|
// Values of type SpecifierQualifierListCase
|
|
|
|
const (
|
|
|
|
SpecifierQualifierListTypeSpec SpecifierQualifierListCase = iota
|
|
|
|
SpecifierQualifierListTypeQual
|
|
|
|
SpecifierQualifierListAlignSpec
|
|
|
|
SpecifierQualifierListAttribute
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n SpecifierQualifierListCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case SpecifierQualifierListTypeSpec:
|
|
|
|
return "SpecifierQualifierListTypeSpec"
|
|
|
|
case SpecifierQualifierListTypeQual:
|
|
|
|
return "SpecifierQualifierListTypeQual"
|
|
|
|
case SpecifierQualifierListAlignSpec:
|
|
|
|
return "SpecifierQualifierListAlignSpec"
|
|
|
|
case SpecifierQualifierListAttribute:
|
|
|
|
return "SpecifierQualifierListAttribute"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("SpecifierQualifierListCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SpecifierQualifierList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// SpecifierQualifierList:
|
|
|
|
// TypeSpecifier SpecifierQualifierList // Case SpecifierQualifierListTypeSpec
|
|
|
|
// | TypeQualifier SpecifierQualifierList // Case SpecifierQualifierListTypeQual
|
|
|
|
// | AlignmentSpecifier SpecifierQualifierList // Case SpecifierQualifierListAlignSpec
|
|
|
|
// | AttributeSpecifier SpecifierQualifierList // Case SpecifierQualifierListAttribute
|
|
|
|
type SpecifierQualifierList struct {
|
|
|
|
noStorageClass
|
|
|
|
AlignmentSpecifier *AlignmentSpecifier
|
|
|
|
AttributeSpecifier *AttributeSpecifier
|
|
|
|
Case SpecifierQualifierListCase `PrettyPrint:"stringer,zero"`
|
|
|
|
SpecifierQualifierList *SpecifierQualifierList
|
|
|
|
TypeQualifier *TypeQualifier
|
|
|
|
TypeSpecifier *TypeSpecifier
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *SpecifierQualifierList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *SpecifierQualifierList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 2:
|
|
|
|
if p := n.AlignmentSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.SpecifierQualifierList.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.AttributeSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.SpecifierQualifierList.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.TypeQualifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.SpecifierQualifierList.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.TypeSpecifier.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.SpecifierQualifierList.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StatementCase represents case numbers of production Statement
|
|
|
|
type StatementCase int
|
|
|
|
|
|
|
|
// Values of type StatementCase
|
|
|
|
const (
|
|
|
|
StatementLabeled StatementCase = iota
|
|
|
|
StatementCompound
|
|
|
|
StatementExpr
|
|
|
|
StatementSelection
|
|
|
|
StatementIteration
|
|
|
|
StatementJump
|
|
|
|
StatementAsm
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n StatementCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case StatementLabeled:
|
|
|
|
return "StatementLabeled"
|
|
|
|
case StatementCompound:
|
|
|
|
return "StatementCompound"
|
|
|
|
case StatementExpr:
|
|
|
|
return "StatementExpr"
|
|
|
|
case StatementSelection:
|
|
|
|
return "StatementSelection"
|
|
|
|
case StatementIteration:
|
|
|
|
return "StatementIteration"
|
|
|
|
case StatementJump:
|
|
|
|
return "StatementJump"
|
|
|
|
case StatementAsm:
|
|
|
|
return "StatementAsm"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("StatementCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Statement represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// Statement:
|
|
|
|
// LabeledStatement // Case StatementLabeled
|
|
|
|
// | CompoundStatement // Case StatementCompound
|
|
|
|
// | ExpressionStatement // Case StatementExpr
|
|
|
|
// | SelectionStatement // Case StatementSelection
|
|
|
|
// | IterationStatement // Case StatementIteration
|
|
|
|
// | JumpStatement // Case StatementJump
|
|
|
|
// | AsmStatement // Case StatementAsm
|
|
|
|
type Statement struct {
|
|
|
|
Operand Operand // Case CompoundStatement, ExpressionStatement
|
|
|
|
AsmStatement *AsmStatement
|
|
|
|
Case StatementCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CompoundStatement *CompoundStatement
|
|
|
|
ExpressionStatement *ExpressionStatement
|
|
|
|
IterationStatement *IterationStatement
|
|
|
|
JumpStatement *JumpStatement
|
|
|
|
LabeledStatement *LabeledStatement
|
|
|
|
SelectionStatement *SelectionStatement
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *Statement) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *Statement) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 6:
|
|
|
|
return n.AsmStatement.Position()
|
|
|
|
case 1:
|
|
|
|
return n.CompoundStatement.Position()
|
|
|
|
case 2:
|
|
|
|
return n.ExpressionStatement.Position()
|
|
|
|
case 4:
|
|
|
|
return n.IterationStatement.Position()
|
|
|
|
case 5:
|
|
|
|
return n.JumpStatement.Position()
|
|
|
|
case 0:
|
|
|
|
return n.LabeledStatement.Position()
|
|
|
|
case 3:
|
|
|
|
return n.SelectionStatement.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StorageClassSpecifierCase represents case numbers of production StorageClassSpecifier
|
|
|
|
type StorageClassSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type StorageClassSpecifierCase
|
|
|
|
const (
|
|
|
|
StorageClassSpecifierTypedef StorageClassSpecifierCase = iota
|
|
|
|
StorageClassSpecifierExtern
|
|
|
|
StorageClassSpecifierStatic
|
|
|
|
StorageClassSpecifierAuto
|
|
|
|
StorageClassSpecifierRegister
|
|
|
|
StorageClassSpecifierThreadLocal
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n StorageClassSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case StorageClassSpecifierTypedef:
|
|
|
|
return "StorageClassSpecifierTypedef"
|
|
|
|
case StorageClassSpecifierExtern:
|
|
|
|
return "StorageClassSpecifierExtern"
|
|
|
|
case StorageClassSpecifierStatic:
|
|
|
|
return "StorageClassSpecifierStatic"
|
|
|
|
case StorageClassSpecifierAuto:
|
|
|
|
return "StorageClassSpecifierAuto"
|
|
|
|
case StorageClassSpecifierRegister:
|
|
|
|
return "StorageClassSpecifierRegister"
|
|
|
|
case StorageClassSpecifierThreadLocal:
|
|
|
|
return "StorageClassSpecifierThreadLocal"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("StorageClassSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StorageClassSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StorageClassSpecifier:
|
|
|
|
// "typedef" // Case StorageClassSpecifierTypedef
|
|
|
|
// | "extern" // Case StorageClassSpecifierExtern
|
|
|
|
// | "static" // Case StorageClassSpecifierStatic
|
|
|
|
// | "auto" // Case StorageClassSpecifierAuto
|
|
|
|
// | "register" // Case StorageClassSpecifierRegister
|
|
|
|
// | "_Thread_local" // Case StorageClassSpecifierThreadLocal
|
|
|
|
type StorageClassSpecifier struct {
|
|
|
|
Case StorageClassSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StorageClassSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StorageClassSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructDeclaration represents data reduced by production:
|
|
|
|
//
|
|
|
|
// StructDeclaration:
|
|
|
|
// SpecifierQualifierList StructDeclaratorList ';'
|
|
|
|
type StructDeclaration struct {
|
|
|
|
Empty bool // TCC extension
|
|
|
|
SpecifierQualifierList *SpecifierQualifierList
|
|
|
|
StructDeclaratorList *StructDeclaratorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructDeclaration) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructDeclaration) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.SpecifierQualifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.StructDeclaratorList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructDeclarationList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StructDeclarationList:
|
|
|
|
// StructDeclaration
|
|
|
|
// | StructDeclarationList StructDeclaration
|
|
|
|
type StructDeclarationList struct {
|
|
|
|
StructDeclaration *StructDeclaration
|
|
|
|
StructDeclarationList *StructDeclarationList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructDeclarationList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructDeclarationList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.StructDeclaration.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructDeclaratorCase represents case numbers of production StructDeclarator
|
|
|
|
type StructDeclaratorCase int
|
|
|
|
|
|
|
|
// Values of type StructDeclaratorCase
|
|
|
|
const (
|
|
|
|
StructDeclaratorDecl StructDeclaratorCase = iota
|
|
|
|
StructDeclaratorBitField
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n StructDeclaratorCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case StructDeclaratorDecl:
|
|
|
|
return "StructDeclaratorDecl"
|
|
|
|
case StructDeclaratorBitField:
|
|
|
|
return "StructDeclaratorBitField"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("StructDeclaratorCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructDeclarator represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StructDeclarator:
|
|
|
|
// Declarator // Case StructDeclaratorDecl
|
|
|
|
// | Declarator ':' ConstantExpression AttributeSpecifierList // Case StructDeclaratorBitField
|
|
|
|
type StructDeclarator struct {
|
|
|
|
decl *StructDeclaration
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case StructDeclaratorCase `PrettyPrint:"stringer,zero"`
|
|
|
|
ConstantExpression *ConstantExpression
|
|
|
|
Declarator *Declarator
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructDeclarator) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructDeclarator) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.Declarator.Position()
|
|
|
|
case 1:
|
|
|
|
if p := n.Declarator.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.ConstantExpression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifierList.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructDeclaratorList represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StructDeclaratorList:
|
|
|
|
// StructDeclarator
|
|
|
|
// | StructDeclaratorList ',' StructDeclarator
|
|
|
|
type StructDeclaratorList struct {
|
|
|
|
StructDeclarator *StructDeclarator
|
|
|
|
StructDeclaratorList *StructDeclaratorList
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructDeclaratorList) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructDeclaratorList) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.StructDeclarator.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructOrUnionCase represents case numbers of production StructOrUnion
|
|
|
|
type StructOrUnionCase int
|
|
|
|
|
|
|
|
// Values of type StructOrUnionCase
|
|
|
|
const (
|
|
|
|
StructOrUnionStruct StructOrUnionCase = iota
|
|
|
|
StructOrUnionUnion
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n StructOrUnionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case StructOrUnionStruct:
|
|
|
|
return "StructOrUnionStruct"
|
|
|
|
case StructOrUnionUnion:
|
|
|
|
return "StructOrUnionUnion"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("StructOrUnionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructOrUnion represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StructOrUnion:
|
|
|
|
// "struct" // Case StructOrUnionStruct
|
|
|
|
// | "union" // Case StructOrUnionUnion
|
|
|
|
type StructOrUnion struct {
|
|
|
|
Case StructOrUnionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructOrUnion) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructOrUnion) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructOrUnionSpecifierCase represents case numbers of production StructOrUnionSpecifier
|
|
|
|
type StructOrUnionSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type StructOrUnionSpecifierCase
|
|
|
|
const (
|
|
|
|
StructOrUnionSpecifierDef StructOrUnionSpecifierCase = iota
|
|
|
|
StructOrUnionSpecifierTag
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n StructOrUnionSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case StructOrUnionSpecifierDef:
|
|
|
|
return "StructOrUnionSpecifierDef"
|
|
|
|
case StructOrUnionSpecifierTag:
|
|
|
|
return "StructOrUnionSpecifierTag"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("StructOrUnionSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// StructOrUnionSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// StructOrUnionSpecifier:
|
|
|
|
// StructOrUnion AttributeSpecifierList IDENTIFIER '{' StructDeclarationList '}' // Case StructOrUnionSpecifierDef
|
|
|
|
// | StructOrUnion AttributeSpecifierList IDENTIFIER // Case StructOrUnionSpecifierTag
|
|
|
|
type StructOrUnionSpecifier struct {
|
|
|
|
lexicalScope Scope
|
|
|
|
maxAlign int
|
|
|
|
typ Type
|
|
|
|
AttributeSpecifierList *AttributeSpecifierList
|
|
|
|
Case StructOrUnionSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
StructDeclarationList *StructDeclarationList
|
|
|
|
StructOrUnion *StructOrUnion
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *StructOrUnionSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *StructOrUnionSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
if p := n.StructOrUnion.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
case 0:
|
|
|
|
if p := n.StructOrUnion.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.AttributeSpecifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.StructDeclarationList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TranslationUnit represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// TranslationUnit:
|
|
|
|
// ExternalDeclaration
|
|
|
|
// | TranslationUnit ExternalDeclaration
|
|
|
|
type TranslationUnit struct {
|
|
|
|
ExternalDeclaration *ExternalDeclaration
|
|
|
|
TranslationUnit *TranslationUnit
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *TranslationUnit) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *TranslationUnit) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.ExternalDeclaration.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeName represents data reduced by production:
|
|
|
|
//
|
|
|
|
// TypeName:
|
|
|
|
// SpecifierQualifierList AbstractDeclarator
|
|
|
|
type TypeName struct {
|
|
|
|
typ Type
|
|
|
|
AbstractDeclarator *AbstractDeclarator
|
|
|
|
SpecifierQualifierList *SpecifierQualifierList
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *TypeName) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *TypeName) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.SpecifierQualifierList.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AbstractDeclarator.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeQualifierCase represents case numbers of production TypeQualifier
|
|
|
|
type TypeQualifierCase int
|
|
|
|
|
|
|
|
// Values of type TypeQualifierCase
|
|
|
|
const (
|
|
|
|
TypeQualifierConst TypeQualifierCase = iota
|
|
|
|
TypeQualifierRestrict
|
|
|
|
TypeQualifierVolatile
|
|
|
|
TypeQualifierAtomic
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n TypeQualifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case TypeQualifierConst:
|
|
|
|
return "TypeQualifierConst"
|
|
|
|
case TypeQualifierRestrict:
|
|
|
|
return "TypeQualifierRestrict"
|
|
|
|
case TypeQualifierVolatile:
|
|
|
|
return "TypeQualifierVolatile"
|
|
|
|
case TypeQualifierAtomic:
|
|
|
|
return "TypeQualifierAtomic"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("TypeQualifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeQualifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// TypeQualifier:
|
|
|
|
// "const" // Case TypeQualifierConst
|
|
|
|
// | "restrict" // Case TypeQualifierRestrict
|
|
|
|
// | "volatile" // Case TypeQualifierVolatile
|
|
|
|
// | "_Atomic" // Case TypeQualifierAtomic
|
|
|
|
type TypeQualifier struct {
|
|
|
|
Case TypeQualifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
Token Token
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *TypeQualifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *TypeQualifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token.Position()
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeQualifiersCase represents case numbers of production TypeQualifiers
|
|
|
|
type TypeQualifiersCase int
|
|
|
|
|
|
|
|
// Values of type TypeQualifiersCase
|
|
|
|
const (
|
|
|
|
TypeQualifiersTypeQual TypeQualifiersCase = iota
|
|
|
|
TypeQualifiersAttribute
|
|
|
|
_
|
|
|
|
_
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n TypeQualifiersCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case TypeQualifiersTypeQual:
|
|
|
|
return "TypeQualifiersTypeQual"
|
|
|
|
case TypeQualifiersAttribute:
|
|
|
|
return "TypeQualifiersAttribute"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("TypeQualifiersCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeQualifiers represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// TypeQualifiers:
|
|
|
|
// TypeQualifier // Case TypeQualifiersTypeQual
|
|
|
|
// | AttributeSpecifier // Case TypeQualifiersAttribute
|
|
|
|
// | TypeQualifiers TypeQualifier // Case 2
|
|
|
|
// | TypeQualifiers AttributeSpecifier // Case 3
|
|
|
|
type TypeQualifiers struct {
|
|
|
|
noStorageClass
|
|
|
|
AttributeSpecifier *AttributeSpecifier
|
|
|
|
Case TypeQualifiersCase `PrettyPrint:"stringer,zero"`
|
|
|
|
TypeQualifier *TypeQualifier
|
|
|
|
TypeQualifiers *TypeQualifiers
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *TypeQualifiers) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *TypeQualifiers) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 1:
|
|
|
|
return n.AttributeSpecifier.Position()
|
|
|
|
case 0:
|
|
|
|
return n.TypeQualifier.Position()
|
|
|
|
case 3:
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.AttributeSpecifier.Position()
|
|
|
|
case 2:
|
|
|
|
if p := n.TypeQualifiers.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.TypeQualifier.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeSpecifierCase represents case numbers of production TypeSpecifier
|
|
|
|
type TypeSpecifierCase int
|
|
|
|
|
|
|
|
// Values of type TypeSpecifierCase
|
|
|
|
const (
|
|
|
|
TypeSpecifierVoid TypeSpecifierCase = iota
|
|
|
|
TypeSpecifierChar
|
|
|
|
TypeSpecifierShort
|
|
|
|
TypeSpecifierInt
|
|
|
|
TypeSpecifierInt8
|
|
|
|
TypeSpecifierInt16
|
|
|
|
TypeSpecifierInt32
|
|
|
|
TypeSpecifierInt64
|
|
|
|
TypeSpecifierInt128
|
|
|
|
TypeSpecifierLong
|
|
|
|
TypeSpecifierFloat
|
|
|
|
TypeSpecifierFloat16
|
|
|
|
TypeSpecifierDecimal32
|
|
|
|
TypeSpecifierDecimal64
|
|
|
|
TypeSpecifierDecimal128
|
|
|
|
TypeSpecifierFloat128
|
|
|
|
TypeSpecifierFloat80
|
|
|
|
TypeSpecifierDouble
|
|
|
|
TypeSpecifierSigned
|
|
|
|
TypeSpecifierUnsigned
|
|
|
|
TypeSpecifierBool
|
|
|
|
TypeSpecifierComplex
|
|
|
|
TypeSpecifierStructOrUnion
|
|
|
|
TypeSpecifierEnum
|
|
|
|
TypeSpecifierTypedefName
|
|
|
|
TypeSpecifierTypeofExpr
|
|
|
|
TypeSpecifierTypeofType
|
|
|
|
TypeSpecifierAtomic
|
|
|
|
TypeSpecifierFract
|
|
|
|
TypeSpecifierSat
|
|
|
|
TypeSpecifierAccum
|
|
|
|
TypeSpecifierFloat32
|
|
|
|
TypeSpecifierFloat64
|
|
|
|
TypeSpecifierFloat32x
|
|
|
|
TypeSpecifierFloat64x
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n TypeSpecifierCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case TypeSpecifierVoid:
|
|
|
|
return "TypeSpecifierVoid"
|
|
|
|
case TypeSpecifierChar:
|
|
|
|
return "TypeSpecifierChar"
|
|
|
|
case TypeSpecifierShort:
|
|
|
|
return "TypeSpecifierShort"
|
|
|
|
case TypeSpecifierInt:
|
|
|
|
return "TypeSpecifierInt"
|
|
|
|
case TypeSpecifierInt8:
|
|
|
|
return "TypeSpecifierInt8"
|
|
|
|
case TypeSpecifierInt16:
|
|
|
|
return "TypeSpecifierInt16"
|
|
|
|
case TypeSpecifierInt32:
|
|
|
|
return "TypeSpecifierInt32"
|
|
|
|
case TypeSpecifierInt64:
|
|
|
|
return "TypeSpecifierInt64"
|
|
|
|
case TypeSpecifierInt128:
|
|
|
|
return "TypeSpecifierInt128"
|
|
|
|
case TypeSpecifierLong:
|
|
|
|
return "TypeSpecifierLong"
|
|
|
|
case TypeSpecifierFloat:
|
|
|
|
return "TypeSpecifierFloat"
|
|
|
|
case TypeSpecifierFloat16:
|
|
|
|
return "TypeSpecifierFloat16"
|
|
|
|
case TypeSpecifierDecimal32:
|
|
|
|
return "TypeSpecifierDecimal32"
|
|
|
|
case TypeSpecifierDecimal64:
|
|
|
|
return "TypeSpecifierDecimal64"
|
|
|
|
case TypeSpecifierDecimal128:
|
|
|
|
return "TypeSpecifierDecimal128"
|
|
|
|
case TypeSpecifierFloat128:
|
|
|
|
return "TypeSpecifierFloat128"
|
|
|
|
case TypeSpecifierFloat80:
|
|
|
|
return "TypeSpecifierFloat80"
|
|
|
|
case TypeSpecifierDouble:
|
|
|
|
return "TypeSpecifierDouble"
|
|
|
|
case TypeSpecifierSigned:
|
|
|
|
return "TypeSpecifierSigned"
|
|
|
|
case TypeSpecifierUnsigned:
|
|
|
|
return "TypeSpecifierUnsigned"
|
|
|
|
case TypeSpecifierBool:
|
|
|
|
return "TypeSpecifierBool"
|
|
|
|
case TypeSpecifierComplex:
|
|
|
|
return "TypeSpecifierComplex"
|
|
|
|
case TypeSpecifierStructOrUnion:
|
|
|
|
return "TypeSpecifierStructOrUnion"
|
|
|
|
case TypeSpecifierEnum:
|
|
|
|
return "TypeSpecifierEnum"
|
|
|
|
case TypeSpecifierTypedefName:
|
|
|
|
return "TypeSpecifierTypedefName"
|
|
|
|
case TypeSpecifierTypeofExpr:
|
|
|
|
return "TypeSpecifierTypeofExpr"
|
|
|
|
case TypeSpecifierTypeofType:
|
|
|
|
return "TypeSpecifierTypeofType"
|
|
|
|
case TypeSpecifierAtomic:
|
|
|
|
return "TypeSpecifierAtomic"
|
|
|
|
case TypeSpecifierFract:
|
|
|
|
return "TypeSpecifierFract"
|
|
|
|
case TypeSpecifierSat:
|
|
|
|
return "TypeSpecifierSat"
|
|
|
|
case TypeSpecifierAccum:
|
|
|
|
return "TypeSpecifierAccum"
|
|
|
|
case TypeSpecifierFloat32:
|
|
|
|
return "TypeSpecifierFloat32"
|
|
|
|
case TypeSpecifierFloat64:
|
|
|
|
return "TypeSpecifierFloat64"
|
|
|
|
case TypeSpecifierFloat32x:
|
|
|
|
return "TypeSpecifierFloat32x"
|
|
|
|
case TypeSpecifierFloat64x:
|
|
|
|
return "TypeSpecifierFloat64x"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("TypeSpecifierCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TypeSpecifier represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// TypeSpecifier:
|
|
|
|
// "void" // Case TypeSpecifierVoid
|
|
|
|
// | "char" // Case TypeSpecifierChar
|
|
|
|
// | "short" // Case TypeSpecifierShort
|
|
|
|
// | "int" // Case TypeSpecifierInt
|
|
|
|
// | "__int8" // Case TypeSpecifierInt8
|
|
|
|
// | "__int16" // Case TypeSpecifierInt16
|
|
|
|
// | "__int32" // Case TypeSpecifierInt32
|
|
|
|
// | "__int64" // Case TypeSpecifierInt64
|
|
|
|
// | "__int128" // Case TypeSpecifierInt128
|
|
|
|
// | "long" // Case TypeSpecifierLong
|
|
|
|
// | "float" // Case TypeSpecifierFloat
|
|
|
|
// | "__fp16" // Case TypeSpecifierFloat16
|
|
|
|
// | "_Decimal32" // Case TypeSpecifierDecimal32
|
|
|
|
// | "_Decimal64" // Case TypeSpecifierDecimal64
|
|
|
|
// | "_Decimal128" // Case TypeSpecifierDecimal128
|
|
|
|
// | "_Float128" // Case TypeSpecifierFloat128
|
|
|
|
// | "__float80" // Case TypeSpecifierFloat80
|
|
|
|
// | "double" // Case TypeSpecifierDouble
|
|
|
|
// | "signed" // Case TypeSpecifierSigned
|
|
|
|
// | "unsigned" // Case TypeSpecifierUnsigned
|
|
|
|
// | "_Bool" // Case TypeSpecifierBool
|
|
|
|
// | "_Complex" // Case TypeSpecifierComplex
|
|
|
|
// | StructOrUnionSpecifier // Case TypeSpecifierStructOrUnion
|
|
|
|
// | EnumSpecifier // Case TypeSpecifierEnum
|
|
|
|
// | TYPEDEFNAME // Case TypeSpecifierTypedefName
|
|
|
|
// | "typeof" '(' Expression ')' // Case TypeSpecifierTypeofExpr
|
|
|
|
// | "typeof" '(' TypeName ')' // Case TypeSpecifierTypeofType
|
|
|
|
// | AtomicTypeSpecifier // Case TypeSpecifierAtomic
|
|
|
|
// | "_Fract" // Case TypeSpecifierFract
|
|
|
|
// | "_Sat" // Case TypeSpecifierSat
|
|
|
|
// | "_Accum" // Case TypeSpecifierAccum
|
|
|
|
// | "_Float32" // Case TypeSpecifierFloat32
|
|
|
|
// | "_Float64" // Case TypeSpecifierFloat64
|
|
|
|
// | "_Float32x" // Case TypeSpecifierFloat32x
|
|
|
|
// | "_Float64x" // Case TypeSpecifierFloat64x
|
|
|
|
type TypeSpecifier struct {
|
|
|
|
resolvedIn Scope // Case TypedefName
|
|
|
|
typ Type
|
|
|
|
AtomicTypeSpecifier *AtomicTypeSpecifier
|
|
|
|
Case TypeSpecifierCase `PrettyPrint:"stringer,zero"`
|
|
|
|
EnumSpecifier *EnumSpecifier
|
|
|
|
Expression *Expression
|
|
|
|
StructOrUnionSpecifier *StructOrUnionSpecifier
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *TypeSpecifier) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *TypeSpecifier) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 27:
|
|
|
|
return n.AtomicTypeSpecifier.Position()
|
|
|
|
case 23:
|
|
|
|
return n.EnumSpecifier.Position()
|
|
|
|
case 22:
|
|
|
|
return n.StructOrUnionSpecifier.Position()
|
|
|
|
case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 28, 29, 30, 31, 32, 33, 34:
|
|
|
|
return n.Token.Position()
|
|
|
|
case 25:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Expression.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 26:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnaryExpressionCase represents case numbers of production UnaryExpression
|
|
|
|
type UnaryExpressionCase int
|
|
|
|
|
|
|
|
// Values of type UnaryExpressionCase
|
|
|
|
const (
|
|
|
|
UnaryExpressionPostfix UnaryExpressionCase = iota
|
|
|
|
UnaryExpressionInc
|
|
|
|
UnaryExpressionDec
|
|
|
|
UnaryExpressionAddrof
|
|
|
|
UnaryExpressionDeref
|
|
|
|
UnaryExpressionPlus
|
|
|
|
UnaryExpressionMinus
|
|
|
|
UnaryExpressionCpl
|
|
|
|
UnaryExpressionNot
|
|
|
|
UnaryExpressionSizeofExpr
|
|
|
|
UnaryExpressionSizeofType
|
|
|
|
UnaryExpressionLabelAddr
|
|
|
|
UnaryExpressionAlignofExpr
|
|
|
|
UnaryExpressionAlignofType
|
|
|
|
UnaryExpressionImag
|
|
|
|
UnaryExpressionReal
|
|
|
|
)
|
|
|
|
|
|
|
|
// String implements fmt.Stringer
|
|
|
|
func (n UnaryExpressionCase) String() string {
|
|
|
|
switch n {
|
|
|
|
case UnaryExpressionPostfix:
|
|
|
|
return "UnaryExpressionPostfix"
|
|
|
|
case UnaryExpressionInc:
|
|
|
|
return "UnaryExpressionInc"
|
|
|
|
case UnaryExpressionDec:
|
|
|
|
return "UnaryExpressionDec"
|
|
|
|
case UnaryExpressionAddrof:
|
|
|
|
return "UnaryExpressionAddrof"
|
|
|
|
case UnaryExpressionDeref:
|
|
|
|
return "UnaryExpressionDeref"
|
|
|
|
case UnaryExpressionPlus:
|
|
|
|
return "UnaryExpressionPlus"
|
|
|
|
case UnaryExpressionMinus:
|
|
|
|
return "UnaryExpressionMinus"
|
|
|
|
case UnaryExpressionCpl:
|
|
|
|
return "UnaryExpressionCpl"
|
|
|
|
case UnaryExpressionNot:
|
|
|
|
return "UnaryExpressionNot"
|
|
|
|
case UnaryExpressionSizeofExpr:
|
|
|
|
return "UnaryExpressionSizeofExpr"
|
|
|
|
case UnaryExpressionSizeofType:
|
|
|
|
return "UnaryExpressionSizeofType"
|
|
|
|
case UnaryExpressionLabelAddr:
|
|
|
|
return "UnaryExpressionLabelAddr"
|
|
|
|
case UnaryExpressionAlignofExpr:
|
|
|
|
return "UnaryExpressionAlignofExpr"
|
|
|
|
case UnaryExpressionAlignofType:
|
|
|
|
return "UnaryExpressionAlignofType"
|
|
|
|
case UnaryExpressionImag:
|
|
|
|
return "UnaryExpressionImag"
|
|
|
|
case UnaryExpressionReal:
|
|
|
|
return "UnaryExpressionReal"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("UnaryExpressionCase(%v)", int(n))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnaryExpression represents data reduced by productions:
|
|
|
|
//
|
|
|
|
// UnaryExpression:
|
|
|
|
// PostfixExpression // Case UnaryExpressionPostfix
|
|
|
|
// | "++" UnaryExpression // Case UnaryExpressionInc
|
|
|
|
// | "--" UnaryExpression // Case UnaryExpressionDec
|
|
|
|
// | '&' CastExpression // Case UnaryExpressionAddrof
|
|
|
|
// | '*' CastExpression // Case UnaryExpressionDeref
|
|
|
|
// | '+' CastExpression // Case UnaryExpressionPlus
|
|
|
|
// | '-' CastExpression // Case UnaryExpressionMinus
|
|
|
|
// | '~' CastExpression // Case UnaryExpressionCpl
|
|
|
|
// | '!' CastExpression // Case UnaryExpressionNot
|
|
|
|
// | "sizeof" UnaryExpression // Case UnaryExpressionSizeofExpr
|
|
|
|
// | "sizeof" '(' TypeName ')' // Case UnaryExpressionSizeofType
|
|
|
|
// | "&&" IDENTIFIER // Case UnaryExpressionLabelAddr
|
|
|
|
// | "_Alignof" UnaryExpression // Case UnaryExpressionAlignofExpr
|
|
|
|
// | "_Alignof" '(' TypeName ')' // Case UnaryExpressionAlignofType
|
|
|
|
// | "__imag__" UnaryExpression // Case UnaryExpressionImag
|
|
|
|
// | "__real__" UnaryExpression // Case UnaryExpressionReal
|
|
|
|
type UnaryExpression struct {
|
|
|
|
Operand Operand
|
|
|
|
lexicalScope Scope
|
|
|
|
IsSideEffectsFree bool
|
|
|
|
Case UnaryExpressionCase `PrettyPrint:"stringer,zero"`
|
|
|
|
CastExpression *CastExpression
|
|
|
|
PostfixExpression *PostfixExpression
|
|
|
|
Token Token
|
|
|
|
Token2 Token
|
|
|
|
Token3 Token
|
|
|
|
TypeName *TypeName
|
|
|
|
UnaryExpression *UnaryExpression
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements fmt.Stringer.
|
|
|
|
func (n *UnaryExpression) String() string { return PrettyString(n) }
|
|
|
|
|
|
|
|
// Position reports the position of the first component of n, if available.
|
|
|
|
func (n *UnaryExpression) Position() (r token.Position) {
|
|
|
|
if n == nil {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Case {
|
|
|
|
case 0:
|
|
|
|
return n.PostfixExpression.Position()
|
|
|
|
case 3, 4, 5, 6, 7, 8:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.CastExpression.Position()
|
|
|
|
case 11:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token2.Position()
|
|
|
|
case 10, 13:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.Token2.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
if p := n.TypeName.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.Token3.Position()
|
|
|
|
case 1, 2, 9, 12, 14, 15:
|
|
|
|
if p := n.Token.Position(); p.IsValid() {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
|
|
|
return n.UnaryExpression.Position()
|
|
|
|
default:
|
|
|
|
panic("internal error")
|
|
|
|
}
|
|
|
|
}
|