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

📄 defgen.y

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 Y
字号:
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
  
    Date	By		Reason
    ----	--		------
    15-Jun-94	D.Wellstood	Initial Implementation
*
****************************************************************************/

%token <String>		T_NUM
%token <String>		T_NAME
%token <String>		T_FNAME
%token <String>		T_STRING

/* reserved words */
%token <String>		T_CHAR
%token <String>		T_SHORT
%token <String>		T_INT
%token <String>		T_LONG
%token <String>		T_SIGNED
%token <String>		T_UNSIGNED
%token <String>		T_FLOAT
%token <String>		T_DOUBLE
%token <String>		T_VOID
%token <String>		T_CONST
%token <String>		T_STRUCT
%token <String>		T_UNION
%token <String>		T_NEAR
%token <String>		T_FAR
%token <String>		T_HUGE
%token <String>		T_CDECL
%token <String>		T_PASCAL
%token <String>		T_FORTRAN
%token <String>		T_SYSCALL
%token <String>		T_EXPORT     
%token <String>		T_LPAREN
%token <String>		T_RPAREN
%token <String>		T_EXTERN
%token <String>		T_LINE

/* punctuation */
%token T_LSQ_BRACKET
%token T_PERIOD
%token T_RSQ_BRACKET
%token T_SEMICOLON
%token T_STAR
%token T_COMMA
%token T_POUND
%token T_SLASH

%type <Parm>		Y_PARAMETERS
%type <Parm>		Y_PARAM_LIST
%type <Type>		Y_TYPENAME
%type <String>		Y_STRUCT_OR_UNION
%type <String>		Y_STRUCT_OR_UNION_KEYWORD
%type <String>		Y_PREDEFINED_TYPE
%type <String>		Y_FNAME 
%type <String>		Y_NAME
%type <String>		Y_TYPENAME1
%type <Token>		Y_SPECIFIER
%type <Parm>		Y_DECLARATION
%type <Parm>		Y_DECLARATOR
%type <Parm>		Y_DIRECT_DECLARATOR
%type <Parm>		Y_ABS_DIRECT_DECLARATOR
%type <Parm>		Y_ABS_DECLARATOR


%start Y_FILE
%%

Y_FILE
	: Y_LINE
	| Y_FILE Y_LINE
	;

Y_LINE
	: Y_FUNCTION_STMNT
	| Y_LINE_STMNT
	| Y_STRUCT_STMNT
	| Y_UNION_STMNT
	;
	
Y_LINE_STMNT
	: T_SLASH T_SLASH T_POUND T_LINE Y_FNAME T_NUM
	    {
	        SemLine( $5, $6 ); 
	    }	
	;
	
Y_STRUCT_STMNT
	: T_STRUCT Y_NAME T_SEMICOLON
	    {}
	;

Y_UNION_STMNT
	: T_UNION Y_NAME T_SEMICOLON
	    {}
	;
	
Y_FUNCTION_STMNT
	: T_EXTERN Y_DECLARATION T_SEMICOLON
	    {
	        SemFunction( $2 );
	    }
	;

Y_DECLARATION
	: Y_TYPENAME Y_DECLARATOR
	    {
	        $$ = $2;
		$$->type = $1;
	    }
	| Y_TYPENAME Y_ABS_DECLARATOR
	    {
	        $$ = $2;
		$$->type = $1;
	    }
	| Y_TYPENAME
	    {
	        $$ = SemCreateParam( $1, NULL, 0, 0 );
	    }
	;
	
Y_ABS_DECLARATOR
	: T_STAR 
	    {
	        $$ = SemCreateParam( NULL, NULL, 1, 0 );
	    }
	| Y_SPECIFIER 
	    {
	        $$ = SemCreateParam( NULL, NULL, 0, 0 );
		$$->modifiers = SemAddSpecifier( $$->modifiers, $1 );
	    }
	| Y_ABS_DIRECT_DECLARATOR
	| T_STAR Y_ABS_DECLARATOR
	    {
	        $$ = $2;
		$$->ptrcnt++;
	    }
	| Y_SPECIFIER Y_ABS_DECLARATOR
	    {
	    	$$ = $2;
		$$->modifiers = SemAddSpecifier( $$->modifiers, $1 );
	    }
	;

Y_ABS_DIRECT_DECLARATOR
    	: T_LPAREN Y_ABS_DECLARATOR T_RPAREN
	    { $$ = $2; }
	| Y_ARRAY
	    {
	        $$ = SemCreateParam( NULL, NULL, 0, 1 );
	    }
	| Y_ABS_DIRECT_DECLARATOR Y_ARRAY
	    {
	        $$ = $1;
		$$->arraycnt ++;
	    }
	;
	
Y_DECLARATOR
	: T_STAR Y_DECLARATOR
	    {
	        $$ = $2;
		$$->ptrcnt++;
	    }
	| Y_SPECIFIER Y_DECLARATOR
	    {
	        $$ = $2;
		$$->modifiers = SemAddSpecifier( $$->modifiers, $1 );
	    }
	| Y_DIRECT_DECLARATOR
	;
	
Y_DIRECT_DECLARATOR
	: Y_NAME
	    {
	        $$ = SemCreateParam( NULL, $1, 0, 0 );
	    }
	| T_LPAREN Y_DECLARATOR T_RPAREN
	    { $$ = $2; }
	| Y_DIRECT_DECLARATOR Y_ARRAY
	    {
	        $$ = $1;
		$$->arraycnt ++;
	    }
	| Y_DIRECT_DECLARATOR Y_PARAMETERS
	    {
	        $$ = $1;
	        if( $$->parameters == NULL ) {
		    $$->parameters = $2;
		}
	    }
	;
	
Y_SPECIFIER
	: T_NEAR
	    { $$ = T_NEAR; }
	| T_CONST
	    { $$ = T_CONST; }
	| T_FAR
	    { $$ = T_FAR; }
	| T_HUGE
	    { $$ = T_HUGE; }
	| T_CDECL
	    { $$ = T_CDECL; }
	| T_PASCAL
	    { $$ = T_PASCAL; }
	| T_FORTRAN
	    { $$ = T_FORTRAN; }
	| T_SYSCALL
	    { $$ = T_SYSCALL; }
	| T_EXPORT     
	    { $$ = T_EXPORT; }
	;
	
Y_PARAMETERS
	: T_LPAREN Y_PARAM_LIST T_RPAREN
	    { $$ = $2; }
	| T_LPAREN Y_PARAM_LIST T_COMMA T_PERIOD T_PERIOD T_PERIOD T_RPAREN
	    {
	        ReportWarning( "Ellipsis (...) parmeters are not supported" );
		$$ = $2;
		$$->err = TRUE;
	    }
	;
	
Y_PARAM_LIST
	: Y_DECLARATION
	    { $$ = $1; }
	| Y_PARAM_LIST T_COMMA Y_DECLARATION
	    {
		ParamInfo	*cur;
		
	        if( $1 == NULL ) {
		    $$ = $3;
		} else {
		    cur = $1;
		    while( cur->next != NULL ) cur = cur->next;
		    cur->next = $3;
		    $3->next = NULL;
		    $$ = $1;
		}
	    }
	| /* nothing */
	    { $$ = NULL; }
	;
	
Y_ARRAY
	: T_LSQ_BRACKET T_RSQ_BRACKET 
	| T_LSQ_BRACKET T_NUM T_RSQ_BRACKET 
	;
	
Y_TYPENAME
	: Y_TYPENAME1
	    {
	    	$$ = malloc( sizeof( TypeInfo ) );
	        $$->typename = $1;
	    }
	| T_CONST Y_TYPENAME1
	    {
	    	$$ = malloc( sizeof( TypeInfo ) );
	        $$->typename = $2;
	    }
	;
	
Y_TYPENAME1
	: Y_NAME
	| Y_PREDEFINED_TYPE 
	| Y_STRUCT_OR_UNION 
	;
	
Y_STRUCT_OR_UNION
	: Y_STRUCT_OR_UNION_KEYWORD Y_NAME
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	;

Y_STRUCT_OR_UNION_KEYWORD
	: T_UNION
	| T_STRUCT
	;

Y_PREDEFINED_TYPE 
	: T_SIGNED
	| T_UNSIGNED
	| T_CHAR
	| T_SHORT
	| T_LONG
	| T_INT
	| T_FLOAT
	| T_DOUBLE
	| T_VOID
	| T_SIGNED T_CHAR
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_UNSIGNED T_CHAR
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_SIGNED T_SHORT
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_UNSIGNED T_SHORT
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_SIGNED T_INT
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_UNSIGNED T_INT 
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_SIGNED T_LONG
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	| T_UNSIGNED T_LONG
	    {
	        $$ = malloc( strlen( $1 ) + strlen( $2 ) + 2 );
		sprintf( $$, "%s %s", $1, $2 );
		free( $1 );
		free( $2 );
	    }
	;

Y_FNAME 
	: T_NAME
	| T_FNAME
	| T_STRING
	| T_CHAR
	| T_SHORT
	| T_INT
	| T_LONG
	| T_SIGNED
	| T_UNSIGNED
	| T_FLOAT
	| T_DOUBLE
	| T_VOID
	| T_CONST
	| T_STRUCT
	| T_UNION
	| T_NEAR
	| T_FAR
	| T_HUGE
	| T_CDECL
	| T_PASCAL
	| T_FORTRAN
	| T_SYSCALL
	| T_EXPORT     
	| T_LPAREN
	| T_RPAREN
	| T_EXTERN
	| T_LINE
	;	
	
Y_NAME
	: T_NAME
	| T_LINE
	;

⌨️ 快捷键说明

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