⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cparse.y

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 Y
📖 第 1 页 / 共 2 页
字号:
%{

//cparse.y: A Grammar for code parsing

#include <stdlib.h>
#include <stdio.h>
#include "wic.h"

#define CSTYPE ParseUnion

#ifndef __SMALL__
#define __SMALL__ 0            // To avoid warnings in MKS yacc
#endif

#pragma disable_message(118)
%}

/* Tokens for used by parsers.  NOTE: If any values are modified or added,
   make sure the same is done for cparse.y and token.h */

%token <token>  Y_EOF                   300  /* MKS yacc will not allow it to be 0*/
%token <token>  Y_EXCLAMATION           301
%token <token>  Y_NE                    302
%token <token>  Y_POUND                 303
%token <token>  Y_POUND_POUND           304
%token <token>  Y_AND                   305
%token <token>  Y_AND_AND               306
%token <token>  Y_AND_EQUAL             307
%token <token>  Y_LEFT_PAREN            308
%token <token>  Y_RIGHT_PAREN           309
%token <token>  Y_TIMES                 310
%token <token>  Y_TIMES_EQUAL           311
%token <token>  Y_PLUS                  312
%token <token>  Y_PLUS_PLUS             313
%token <token>  Y_PLUS_EQUAL            314
%token <token>  Y_COMMA                 315
%token <token>  Y_MINUS                 316
%token <token>  Y_MINUS_MINUS           317
%token <token>  Y_MINUS_EQUAL           318
%token <token>  Y_ARROW                 319
%token <token>  Y_DOT                   320
%token <token>  Y_DOT_DOT_DOT           321
%token <token>  Y_DIVIDE                322
%token <token>  Y_DIVIDE_EQUAL          323
%token <token>  Y_COLON                 324
%token <token>  Y_SEG_OP                325
%token <token>  Y_SEMICOLON             326
%token <token>  Y_LT                    327
%token <token>  Y_LSHIFT                328
%token <token>  Y_LSHIFT_EQUAL          329
%token <token>  Y_LE                    330
%token <token>  Y_EQUAL                 331
%token <token>  Y_EQ                    332
%token <token>  Y_GT                    333
%token <token>  Y_GE                    334
%token <token>  Y_RSHIFT                335
%token <token>  Y_RSHIFT_EQUAL          336
%token <token>  Y_QUESTION              337
%token <token>  Y_LEFT_BRACKET          338
%token <token>  Y_RIGHT_BRACKET         339
%token <token>  Y_XOR                   340
%token <token>  Y_XOR_EQUAL             341
%token <token>  Y___BASED               342
%token <token>  Y___CDECL               343
%token <token>  Y___EXPORT              344
%token <token>  Y___FAR                 345
%token <token>  Y___FAR16               346
%token <token>  Y___FORTRAN             347
%token <token>  Y___HUGE                348
%token <token>  Y___INTERRUPT           349
%token <token>  Y___LOADDS              350
%token <token>  Y___NEAR                351
%token <token>  Y___PASCAL              352
%token <token>  Y___PRAGMA              353
%token <token>  Y___SAVEREGS            354
%token <token>  Y___SEGMENT             355
%token <token>  Y___SEGNAME             356
%token <token>  Y___SELF                357
%token <token>  Y___STDCALL             358
%token <token>  Y__PACKED               359
%token <token>  Y__SEG16                360
%token <token>  Y__SYSCALL              361
%token <token>  Y_AUTO                  362
%token <token>  Y_CHAR                  363
%token <token>  Y_CONST                 364
%token <token>  Y_DOUBLE                365
%token <token>  Y_ELSE                  366
%token <token>  Y_ENUM                  367
%token <token>  Y_EXTERN                368
%token <token>  Y_FLOAT                 369
%token <token>  Y_INT                   370
%token <token>  Y_LONG                  371
%token <token>  Y_REGISTER              372
%token <token>  Y_SHORT                 373
%token <token>  Y_SIGNED                374
%token <token>  Y_SIZEOF                375
%token <token>  Y_STATIC                376
%token <token>  Y_STRUCT                377
%token <token>  Y_TYPEDEF               378
%token <token>  Y_UNION                 379
%token <token>  Y_UNSIGNED              380
%token <token>  Y_VOID                  381
%token <token>  Y_VOLATILE              382
%token <token>  Y_LEFT_BRACE            383
%token <token>  Y_OR                    384
%token <token>  Y_OR_EQUAL              385
%token <token>  Y_OR_OR                 386
%token <token>  Y_RIGHT_BRACE           387
%token <token>  Y_TILDE                 388
%token <token>  Y_ID                    389
%token <token>  Y_STRING                390
%token <token>  Y_INCLUDE_FILE_NAME     391
%token <token>  Y_TYPEDEF_NAME          392
%token <token>  Y_NUMBER                393
%token <token>  Y_PERCENT               394
%token <token>  Y_PERCENT_EQUAL         395
%token <token>  Y_DEFINED               396

%token <token>  Y_PRE_COMMENT           500
%token <token>  Y_PRE_NULL              501  /* # followed by newline */
%token <token>  Y_PRE_NEWLINE           502
%token <token>  Y_PRE_DEFINE            503
%token <token>  Y_PRE_ELIF              504
%token <token>  Y_PRE_ELSE              505
%token <token>  Y_PRE_ENDIF             506
%token <token>  Y_PRE_ERROR             507
%token <token>  Y_PRE_IF                508
%token <token>  Y_PRE_IFDEF             509
%token <token>  Y_PRE_IFNDEF            510
%token <token>  Y_PRE_INCLUDE           511
%token <token>  Y_PRE_LINE              512
%token <token>  Y_PRE_PRAGMA            513
%token <token>  Y_PRE_UNDEF             514
%token <token>  Y_PRE_SPECIAL_LEFT_PAREN 515

/*======================== Local Symbols =================================*/
/* Symbols specific to parse.y                                            */
/*========================================================================*/
%type <declList> decl
%type <dclr> init-declarator
%type <tree> initializer
%type <dclrList> init-declarator-list
%type <dummy> parse-interface
%type <dummy> external-definition
%type <dummy> translation-unit

/*========================================================================*/


/*======================== EXPRESSION Symbols ============================*/
/* This part is common to both preparse.y and cparse.y                    */
/*========================================================================*/
%type <tree> primary-expression
%type <tree> postfix-expression
%type <tree> expression-list-opt
%type <tree> expression-list
%type <tree> unary-expression
%type <label> unary-operator
%type <tree> cast-expression
%type <tree> multiplicative-expression
%type <tree> additive-expression
%type <tree> shift-expression
%type <tree> relational-expression
%type <tree> equality-expression
%type <tree> and-expression
%type <tree> exclusive-or-expression
%type <tree> inclusive-or-expression
%type <tree> logical-and-expression
%type <tree> logical-or-expression
%type <tree> conditional-expression
%type <tree> assignment-expression
%type <tree> expression
%type <tree> constant-expression
%type <token> declarator-id
%type <dinfo> decl-specs
%type <dinfo> non-type-decl-specs
%type <dinfo> non-type-decl-spec
%type <dinfo> type-spec
%type <dinfo> typedef-name
%type <dinfo> maybe-type-decl-specs
%type <dinfo> storage-class-spec
%type <dinfo> scalar-type-spec
%type <dsinfo> struct-or-union-spec
%type <token> struct-id
%type <token> struct-or-union
%type <dsbody> struct-or-union-body
%type <declList> struct-decl-list
%type <dinfo> struct-decl
%type <dclrList> struct-declarator-list
%type <dclr> struct-declarator
%type <declEnum> enum-spec
%type <enumList> enum-list
%type <enumList> enum-list-collect
%type <enumElem> comma-and-enumerator
%type <enumElem> enumerator
%type <dinfo> cv-qualifier
%type <tree> type-name
%type <tree> literal
%type <tree> strings
%type <tree> single-string
%type <dclr> declarator
%type <dclr> actual-declarator
%type <dclr> declarator-no-id
%type <dclr> actual-declarator-no-id
%type <dclrPtr> ptr-modifier
%type <token> mem-modifier
%type <token> pragma-modifier
%type <flag> cv-qualifiers-opt
%type <declList> abstract-args
%type <declList> arg-decl-list
%type <dinfo> arg-decl-elem
%type <dinfo> dot-dot-dot-decl
%type <token> identifier

/*==========================================================================*/

%start parse-interface

%%

parse-interface
    : Y_EOF
        { outputZapEOF($1); CACCEPT; }
    | translation-unit Y_EOF
        { outputZapEOF($2); CACCEPT; }
    | error
        { recoverError(); CACCEPT; }
    ;

translation-unit
    : external-definition
        { }
    | translation-unit external-definition
        { }
    ;

external-definition
    : decl
        { outputZapAll($1); }
    | Y_EXTERN Y_STRING decl
        { outputZapAll($3); zapTokens2($1, $2); }
    | Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_RIGHT_BRACE
        { zapTokens2($1, $2); zapTokens2($3, $5); }
    | Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_RIGHT_BRACE Y_SEMICOLON
        { zapTokens2($1, $2); zapTokens3($3, $5, $6); }
    | Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_EOF
        {
            reportError(RERR_MISSING_RIGHT_BRACE);
            zapTokens2($1, $2); zapTokens2($3, $5);
        }
    ;

decl
    : decl-specs Y_SEMICOLON
        { $$ = transformDecl($1); zapToken($2); }
    | decl-specs init-declarator-list Y_SEMICOLON
        { $$ = transformDecl(addDeclInfoDclrList($1, $2)); zapToken($3); }
    | error
        { recoverError(); $$ = NULL; }
    ;

init-declarator-list
    : init-declarator
        { $$ = createDclrList($1); }
    | init-declarator-list Y_COMMA init-declarator
        { $$ = addDclrList($1,  $3); zapToken($2); }
    ;

init-declarator
    : declarator
    | declarator Y_EQUAL initializer
        { addDclrInitializer($1, $2, $3);}
    ;

initializer
    : assignment-expression
    ;

/*======================== EXPRESSIONS ===================================*/
/* This part is common to both preparse.y and cparse.y                    */
/*========================================================================*/

primary-expression
    : literal
    | Y_LEFT_PAREN expression Y_RIGHT_PAREN
        { $$ = createCTree1(createConstr2Label(LABCT_PAREN_EXPR, $1, $3), $2); }
    | identifier
        { $$ = createCTreeRoot(createTokenLabel($1)); }
    ;

postfix-expression
    : primary-expression
    | postfix-expression Y_LEFT_BRACKET expression Y_RIGHT_BRACKET
        { $$ = createCTree2(createConstr2Label(LABCT_INDEX, $2, $4), $1,  $3); }
    | postfix-expression Y_LEFT_PAREN expression-list-opt Y_RIGHT_PAREN
        { $$ = createCTree2(createConstr2Label(LABCT_CALL, $2, $4), $1,  $3); }
    | postfix-expression Y_DOT identifier
        { $$ = createCTree2(createConstr1Label(LABCT_DOT, $2), $1,
                            createCTreeRoot(createTokenLabel($3))); }
    | postfix-expression Y_ARROW identifier
        { $$ = createCTree2(createConstr1Label(LABCT_ARROW, $2), $1,
                            createCTreeRoot(createTokenLabel($3))); }
    ;

expression-list-opt
    : /* Nothing */
        { $$ = createNULLCTree(); }
    | expression-list
    ;

expression-list
    : assignment-expression
    | expression-list Y_COMMA assignment-expression
        { $$ = createCTree2(createConstr1Label(LABCT_EXPR_LIST, $2), $1, $3); }
    ;

unary-expression
    : postfix-expression
    | unary-operator cast-expression
        { $$ = createCTree1( $1, $2 ); }
    | Y_SIZEOF unary-expression
        { $$ = createCTree1(createConstr1Label(LABCT_SIZEOF_EXPR, $1), $2); }
    | Y_SIZEOF Y_LEFT_PAREN type-name Y_RIGHT_PAREN
        { $$ = createCTree1(createConstr3Label(LABCT_SIZEOF_TYPE, $1, $2, $4), $3); }
    ;

unary-operator
    : Y_TIMES
        { $$ = createConstr1Label(LABCT_VALUE_AT_ADDR, $1); }
    | Y_AND
        { $$ = createConstr1Label(LABCT_ADDR_OF_VALUE, $1); }
    | Y_PLUS
        { $$ = createConstr1Label(LABCT_UNARY_PLUS, $1); }
    | Y_MINUS
        { $$ = createConstr1Label(LABCT_UNARY_MINUS, $1); }
    | Y_EXCLAMATION
        { $$ = createConstr1Label(LABCT_EXCLAMATION, $1); }
    | Y_TILDE
        { $$ = createConstr1Label(LABCT_TILDE, $1); }
    ;

cast-expression
    : unary-expression
    | Y_LEFT_PAREN type-name Y_RIGHT_PAREN cast-expression
        { $$ = createCTree2(createConstr2Label(LABCT_CAST_EXPR, $1, $3), $2, $4); }
    ;

multiplicative-expression
    : cast-expression
    | multiplicative-expression Y_TIMES cast-expression
        { $$ = createCTree2(createConstr1Label(LABCT_TIMES, $2), $1, $3); }
    | multiplicative-expression Y_DIVIDE cast-expression
        { $$ = createCTree2(createConstr1Label(LABCT_DIVIDE, $2), $1, $3); }
    | multiplicative-expression Y_PERCENT cast-expression
        { $$ = createCTree2(createConstr1Label(LABCT_PERCENT, $2), $1, $3); }
    ;

additive-expression
    : multiplicative-expression
    | additive-expression Y_PLUS multiplicative-expression
        { $$ = createCTree2(createConstr1Label(LABCT_PLUS, $2), $1, $3); }
    | additive-expression Y_MINUS multiplicative-expression
        { $$ = createCTree2(createConstr1Label(LABCT_MINUS, $2), $1, $3); }
    ;

shift-expression
    : additive-expression
    | shift-expression Y_RSHIFT additive-expression
        { $$ = createCTree2(createConstr1Label(LABCT_RSHIFT, $2), $1, $3); }
    | shift-expression Y_LSHIFT additive-expression
        { $$ = createCTree2(createConstr1Label(LABCT_LSHIFT, $2), $1, $3); }
    ;

relational-expression
    : shift-expression
    | relational-expression Y_LT shift-expression
        { $$ = createCTree2(createConstr1Label(LABCT_LT, $2), $1, $3); }
    | relational-expression Y_LE shift-expression
        { $$ = createCTree2(createConstr1Label(LABCT_LE, $2), $1, $3); }
    | relational-expression Y_GT shift-expression
        { $$ = createCTree2(createConstr1Label(LABCT_GT, $2), $1, $3); }
    | relational-expression Y_GE shift-expression
        { $$ = createCTree2(createConstr1Label(LABCT_GE, $2), $1, $3); }
    ;

equality-expression
    : relational-expression
    | equality-expression Y_EQ relational-expression
        { $$ = createCTree2(createConstr1Label(LABCT_EQ, $2), $1, $3); }
    | equality-expression Y_NE relational-expression
        { $$ = createCTree2(createConstr1Label(LABCT_NE, $2), $1, $3); }
    ;

and-expression
    : equality-expression
    | and-expression Y_AND equality-expression
        { $$ = createCTree2(createConstr1Label(LABCT_AND, $2), $1, $3); }
    ;

exclusive-or-expression
    : and-expression
    | exclusive-or-expression Y_XOR and-expression
        { $$ = createCTree2(createConstr1Label(LABCT_XOR, $2), $1, $3); }
    ;

inclusive-or-expression
    : exclusive-or-expression
    | inclusive-or-expression Y_OR exclusive-or-expression
        { $$ = createCTree2(createConstr1Label(LABCT_OR, $2), $1, $3); }
    ;

logical-and-expression
    : inclusive-or-expression
    | logical-and-expression Y_AND_AND inclusive-or-expression
        { $$ = createCTree2(createConstr1Label(LABCT_AND_AND, $2), $1, $3); }
    ;

logical-or-expression
    : logical-and-expression
    | logical-or-expression Y_OR_OR logical-and-expression
        { $$ = createCTree2(createConstr1Label(LABCT_OR_OR, $2), $1, $3); }
    ;

conditional-expression
    : logical-or-expression
    | logical-or-expression Y_QUESTION expression Y_COLON assignment-expression
        {
            $$ = createCTree2(createConstr1Label(LABCT_QUESTION, $2), $1,
                        createCTree2(createConstr1Label(LABCT_COLON, $4), $3, $5));
        }
    ;

assignment-expression
    : conditional-expression
    ;

expression
    : assignment-expression
    | expression Y_COMMA assignment-expression
        { $$ = createCTree2(createConstr1Label(LABCT_EXPR_SEPARATOR, $2), $1, $3); }
    ;

constant-expression
    : conditional-expression

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -