PostgreSQL 源码解读(175)- 查询#93(语法分析:gram.y)#2

本文详细解读了PostgreSQL源码中 gram.y 文件的Definitions部分,介绍了Bison输入文件的组成,包括%purge-parser、%expect、%name-prefix等选项的作用,并解释了%union如何定义标识符的类型,以及%type、%nonassoc、%left和%right在语法分析中的用途。此外,还提及了gram.y定义部分的部分源码内容。
摘要由CSDN通过智能技术生成

本节继续介绍PostgreSQL的语法分析定义文件gram.y的第二部分Definitions.
Bison输入文件的组成:


%{
Declarations
%}
Definitions
%%
Productions
%%
User subroutines

一、Definitions

Definitions在Bison的作用与Flex中的功能也差不多,在这个段定义一些Bison专有变量或相关选项.
%purge-parser
指示Bison创建一个可重入的解析器.与普通的解析器一个很大的不同的,yylval的类型是union指针而不是union.

%expect
%expect N告诉Bison,解析器应该有N个shift/reduce冲突,如果不匹配,Bison将报告编译时错误。

%name-prefix
命名函数名称,默认为yy
%name-prefix “base_yy”意味着默认的yyxx()会变成base_yyxx().比如yyparse(),yylex(),yyerror(),yylval,yychar和
yydebug.

%locations
位置

%parse-param
%parse-param声明的内容位于yyparse()的括号之间,可以声明任意多的参数.
比如%parse-param {core_yyscan_t yyscanner},参数为core_yyscan_t yyscanner.

%lex-param
%lex-param声明的内容位于yylex()的括号之间,可以声明任意多的参数.
比如%lex-param {core_yyscan_t yyscanner},参数为core_yyscan_t yyscanner.

%union
%union声明了在解析器中标识符所使用的类型.
Bison解析器,每一个标识符,包括tokens和非终结符,都有值与之关联,默认的,值的类型都是整型,但在实际应用中远远不够.
%union可以为标识符值创建C语言union声明.


%union
{
    core_YYSTYPE        core_yystype;
    /* these fields must match core_YYSTYPE: */
    int                    ival;
    char                *str;
    const char            *keyword;
    ...
}

其中core_yystype的类型为core_YYSTYPE联合体.


/*
 * The scanner returns extra data about scanned tokens in this union type.
 * Note that this is a subset of the fields used in YYSTYPE of the bison
 * parsers built atop the scanner.
 */
typedef union core_YYSTYPE
{
    int            ival;            /* for integer literals */
    char       *str;            /* for identifiers and non-integer literals */
    const char *keyword;        /* canonical spelling of keywords */
} core_YYSTYPE;

一旦定义了union,那需要通过将union中合适的名称放在尖括号(<>)中,用以告诉Bison哪些符号具有哪些类型的值.

%type
类型定义,如:


%type <node>    stmt schema_stmt
        AlterEventTrigStmt AlterCollationStmt
        ...

表示标识符/非终结符 的类型可以是stmt/schema_stmt/AlterEventTrigStmt/…

%nonassoc
使用%nonassoc声明非关联操作符。

%left
左关联操作符

%right
右关联操作符

二、gram.y定义部分源码


%pure-parser
%expect 0
%name-prefix="base_yy"
%locations
%parse-param {core_yyscan_t yyscanner}
%lex-param   {core_yyscan_t yyscanner}
%union
{
    core_YYSTYPE        core_yystype;
    /* these fields must match core_YYSTYPE: */
    int                    ival;
    char                *str;
    const char            *keyword;
    char                chr;
    bool                boolean;
    JoinType            jtype;
    DropBehavior        dbehavior;
    OnCommitAction        oncommit;
    List                *list;
    Node                *node;
    Value                *value;
    ObjectType            objtype;
    TypeName            *typnam;
    FunctionParameter   *fun_param;
    FunctionParameterMode fun_param_mode;
    ObjectWithArgs        *objwithargs;
    DefElem                *defelt;
    SortBy                *sortby;
    WindowDef            *windef;
    JoinExpr            *jexpr;
    IndexElem            *ielem;
    Alias                *alias;
    RangeVar            *range;
    IntoClause            *into;
    WithClause            *with;
    InferClause            *infer;
    OnConflictClause    *onconflict;
    A_Indices            *aind;
    ResTarget            *target;
    struct PrivTarget    *privtarget;
    AccessPriv            *accesspriv;
    struct ImportQual    *importqual;
    InsertStmt            *istmt;
    VariableSetStmt        *vsetstmt;
    PartitionElem        *partelem;
    PartitionSpec        *partspec;
    PartitionBoundSpec    *partboundspec;
    RoleSpec            *rolespec;
}
%type <node>    stmt schema_stmt
        AlterEventTrigStmt AlterCollationStmt
        AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
        AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
        AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
        AlterOperatorStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
        AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
        AlterCompositeTypeStmt AlterUserMappingStmt
        AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt
        AlterDefaultPrivilegesStmt DefACLAction
        AnalyzeStmt CallStmt ClosePortalStmt ClusterStmt CommentStmt
        ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
        CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
        CreateOpFamiXXXtmt AlterOpFamiXXXtmt CreatePLangStmt
        CreateSchemaStmt CreateSeqStmt CreateStmt CreateStatsStmt CreateTableSpaceStmt
        CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
        CreateAssertStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
        CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
        CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
        DropOpClassStmt DropOpFamiXXXtmt DropPLangStmt DropStmt
        DropAssertStmt DropCastStmt DropRoleStmt
        DropdbStmt DropTableSpaceStmt
        DropTransformStmt
        DropUserMappingStmt ExplainStmt FetchStmt
        GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt
        ListenStmt LoadStmt LockStmt NotifyStmt ExplainableStmt PreparableStmt
        CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
        RemoveFuncStmt RemoveOperStmt R
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值