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

📄 preparse.y

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 Y
📖 第 1 页 / 共 3 页
字号:
%{
// File generated from preparse.y using yaccpre.bat

/*
preparse.y: A Grammar for preprocessor parsing
*/

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

static pToken _lastDefineTok;

#define PRESTYPE 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 preparse.y                                         */
/*========================================================================*/
%type <tree> control-line
%type <tree> define-directive
%type <tree> directive
%type <token> file-name
%type <tree> pre-define-keyword
%type <tree> define-directive
%type <token> line-end
%type <data> no-expand-next-token-action
/*========================================================================*/

/*======================== 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

/*==========================================================================*/
%%

directive
    : control-line
    {
        if ($1 != NULL) {
            addSLListElem(g_dirList, $1);
        }
        PREACCEPT;
    }
    | error
        { recoverError(); PREACCEPT; }
    ;

control-line
    : Y_PRE_NULL line-end
        { $$ = NULL; }

    | Y_PRE_ELSE line-end
        { $$ = createCTreeRoot(createConstr1Label(LABCT_PRE_ELSE, $1)); }

    | Y_PRE_ENDIF line-end
        { $$ = createCTreeRoot(createConstr1Label(LABCT_PRE_ENDIF, $1)); }

    | Y_PRE_IF constant-expression line-end
        {
            if (g_opt.targetLang == TLT_FORTRAN) {
                reportError(CERR_PREDIR_NOT_SUPPORTED, "#if");
            }
            $$ = createCTree1(createConstr1Label(LABCT_PRE_IF, $1), $2);
        }

    | Y_PRE_ELIF constant-expression line-end
        {
            if (g_opt.targetLang == TLT_FORTRAN) {
                reportError(CERR_PREDIR_NOT_SUPPORTED, "#elif");
            }
            $$ = createCTree1(createConstr1Label(LABCT_PRE_ELIF, $1), $2);
        }

    | Y_PRE_INCLUDE file-name line-end
        {
            $$ = createCTreeRoot(createConstr2Label(LABCT_PRE_INCLUDE, $1, $2));
            pushTokFile(getTokenIdName($2));
        }
    | pre-define-keyword define-directive
      { $$ = $2; }

    | Y_PRE_IFDEF no-expand-next-token-action Y_ID line-end
        { $$ = createCTreeRoot(createConstr2Label(LABCT_PRE_IFDEF, $1, $3)); }

    | Y_PRE_IFNDEF no-expand-next-token-action Y_ID line-end
        { $$ = createCTreeRoot(createConstr2Label(LABCT_PRE_IFNDEF, $1, $3)); }

    | Y_PRE_PRAGMA
        {
            reportError(CERR_PREDIR_NOT_SUPPORTED, "#pragma");
            $$ = eatPreDirList($1);
        }

    | Y_PRE_ERROR
        {
            if (g_opt.targetLang == TLT_FORTRAN) {
                reportError(CERR_PREDIR_NOT_SUPPORTED, "#error");
            }
            $$ = eatPreDirList($1);
        }

    | Y_PRE_LINE
        {
            if (g_opt.targetLang == TLT_FORTRAN) {
                reportError(CERR_PREDIR_NOT_SUPPORTED, "#line");
            }
            $$ = eatPreDirList($1);
        }

    | Y_PRE_UNDEF no-expand-next-token-action
        { $$ = eatPreDirList($1); }

    | Y_PRE_NEWLINE
        { $$ = NULL; }
    ;

file-name
    : Y_STRING
        { $$ = $1; }
    | Y_INCLUDE_FILE_NAME
        { $$ = $1; }
    ;

pre-define-keyword
    : Y_PRE_DEFINE
        {
            expandNextToken = 0;
            expandThisLineHideErrors = 1;
            _lastDefineTok = $1;
        }
    ;

define-directive
    : identifier constant-expression line-end
        { $$ = createEnumFromDefine(_lastDefineTok, $1, $2); }
    | identifier Y_PRE_SPECIAL_LEFT_PAREN
        { expandThisLine = 0; $$ = createDefineMacroCTree(); }
    | identifier error
        { $$ = createDefineMacroCTree(); }
    | error
        { recoverError(); $$ = NULL; }
    ;

line-end
    : Y_PRE_NEWLINE
        {
            $$ = $1;
        }
    ;

no-expand-next-token-action
    :  {  expandNextToken = 0; }
    ;

postfix-expression
    : Y_DEFINED Y_LEFT_PAREN no-expand-next-token-action identifier Y_RIGHT_PAREN
        { $$ = createCTreeRoot(

⌨️ 快捷键说明

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