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

📄 c.grm

📁 OXCC is a multipass, interpreting C compiler with several language extensions. It generates an Archi
💻 GRM
📖 第 1 页 / 共 2 页
字号:
/*--- C grammar with extensions for oxcc multipass compiler ---*/
/* 
	Norman D. Culver 
	Oxbow Software
	1323 S.E. 17th Street #662
	Ft. Lauderdale, FL 33316
	(305) 527-1663 Voice
	(305) 760-7584 Fax
	(305) 760-4679 Data
	norman.culver@channel1.com
    ndc@gcomm.com

	Copyright 1994 by Norman D. Culver, All Rights Reserved.
*/
/* 
	NOTE -- THE DEADWOOD IN THIS GRAMMAR IS THERE BECAUSE OF THE NEED TO
	RUNTIME INTERPRET AND/OR REGENERATE SOURCE FROM THE AST TREE

	NOTE -- PRODUCTIONS TERMINATED WITH $$; DO NOT MAKE AST NODES

	NOTE -- THE COMPILER COMPILER DERIVES ANY UNFORCED TERMINALS

    NOTE -- THIS IS THE ACTUAL GRAMMAR USED BY THE PARSER GENERATOR `lrg'
*/

/* Force a couple of terminal symbol values */
#1	{meta-name}
#2	{typedef-name}

/*--- Operator Precedence. ---*/

  !(  '?'                      )
  !(  '||'                     )
  !(  '&&'                     )
  !(  '|'                      )
  !(  '^'                      )
  !(  '&'                      )
  !(  '=='  '!='               )
  !(  '<'   '>'   '<='   '>='  )
  !(  '<<'  '>>'               )
  !(  '+'   '-'                )
  !(  '*'   '/'   '%'          )
 
/*--- Phrase Structure Grammar ---*/

File
	-> [Input]... <eof>		;

Input
	-> OuterDecl	$$;
	-> FuncDef		$$;
	-> Directive	$$;
	-> OuterAnf		$$;
	-> SegStuff		$$;

SegStuff
	->	__segdef__ DeclID [SegList] ';'	;
	->	__seguse__ DeclID ';'			;

SegList
	->	ConstExp \','...	$$;

FuncDef
	-> [FrontSpec]		
		FuncDeclarator				
		[Attr]
		[InnerDecl]...
		FuncBody			;

NestedFuncDef
	-> FrontSpec		
		FuncDeclarator
		FuncBody			;

FuncDeclarator
	-> Declarator ;

FuncBody
	-> LB
		[DeclOrFunc]...
		[StmtC]...
	   BodyExit			 	;

BodyExit
	->	RB	;

OuterDecl
	-> [FrontSpec] [InitDeclarator \','...] ';' 
		=> classify (typedef 'InitDeclarator' 'TypeAgain' 'ParenDeclarator' 
			'DeclID' <identifier> {meta-name} {typedef-name})  ;

InnerDecl
	-> FrontSpec [InitDeclarator \','...] ';'
		=> classify (typedef 'InitDeclarator' 'TypeAgain' 'ParenDeclarator' 
			'DeclID' <identifier> {meta-name} {typedef-name}) ;

FrontSpec
	-> TypeDefs				$$;
	-> DeclarationSpec...	$$;

TypeDefs
	-> TypeDef TdElem...				$$;
	-> TypeDef Esu...					$$;
	-> TypeDef TypedefName				$$;
	-> TypeDef TypeAgain \','...		$$;

TypeDef
	-> typedef 		;

TdElem
	->	Type		$$;
	->	Qualifier	$$;

TypeAgain
	-> TypedefName InitRHS	;	/* reuse of computed typedef */
	-> Identifier InitRHS	;

DeclarationSpec
	-> TypeSpec				$$;
	-> StorageClassSpec		$$;
	-> Qualifier			$$;
	-> FuncTypeModifier		$$;

InitDeclarator
	-> Declarator [Attr]			;
	-> Declarator [Attr] InitRHS	;

Declarator
	-> [Pointer] DirectDeclarator 		$$;

Pointer
	-> '*' [Qualifier]...				;
	-> '*' [Qualifier]... Pointer		;

DirectDeclarator
	-> DeclID							$$;
	-> ParenDeclarator 					$$;
	-> DirectDeclarator ArrayDecl		$$;
	-> DirectDeclarator FuncParams		$$;

DeclID
	-> <identifier>	;
	-> {meta-name}	;

ParenDeclarator
	-> '(' Declarator ')' ;

ArrayDecl
	-> '[' [BinopC] ']' ;

FuncParams
	-> '(' [ParamList] ')' ;

ParamList
	-> Param \','...			;
	-> Param \','... ',' '...'	;
	-> '...' ;

Param
	-> SpecQual... InitDeclarator		;
	-> SpecQual... [NoNameDeclarator]	;
	-> Identifier ;

NoNameDeclarator
	-> Pointer							;
	-> [Pointer] DirectNoNameDeclarator	;

DirectNoNameDeclarator
	-> ParenNoNameDeclarator						$$;
	-> [DirectNoNameDeclarator] ArrayDecl			$$;
	-> [DirectNoNameDeclarator] FuncParams			$$;

ParenNoNameDeclarator
	-> '(' NoNameDeclarator ')' ;

InitRHS
	-> '=' Init	;

TypeSpec
	-> Specs		$$;
	-> DynType		$$;

DynType
	-> TypedefName	$$;
	-> TypeOf		$$;

Specs
	-> Type			$$;
	-> Esu			$$;

Esu
	-> EnumSpec		$$;
	-> StructSpec	$$;
	-> UnionSpec	$$;

Type
	-> void		;
	-> char		;
	-> short	;
	-> int		;
	-> long		;
	-> float	;
	-> double	;
	-> signed	;
	-> unsigned	;
	-> _segment	;
	-> __segment ;
	
FuncTypeModifier
	-> inline		;
	-> __inline__	;
	-> __inline		;
	-> _cdecl		;
	-> __cdecl		;
	-> _pascal		;
	-> __pascal		;
	-> _fortran		;
	-> __fortran	;
	-> _interrupt	;
	-> __interrupt	;
	-> _ifunc		;
	-> _loadds		;
	-> __loadds		;
	-> _export		;
	-> __export		;
	-> _fastcall	;
	-> _saveregs	;
	-> __saveregs	;
	-> _syscall		;
	-> __syscall	;
	-> _stdcall		;
	-> __stdcall	;

Qualifier
	-> Based		;
	-> const		;
	-> volatile		;
	-> __volatile__	;
	-> _far			;
	-> __far		;
	-> _near		;
	-> __near		;
	-> _huge		;
	-> __huge		;
	-> _seg16		;
	-> __seg16		;
	-> _far16		;
	-> __far16		;
	-> register		;

Based
	-> _based '(' BaseExp ')'	$$;
	-> __based '(' BaseExp ')'	$$;
	
BaseExp
	->  CastExp	;
	-> _self	;
	-> __self	;

SpecQual
	-> TypeSpec		$$;
	-> Qualifier	$$;

TypedefName
	-> {meta-name} => require ({meta-name} {typedef-name}) ;

TypeOf
	-> typeof '(' CastExp ')'	;

StorageClassSpec
	-> extern		;
	-> static		;
	-> _ival		;
	-> auto			$$;

StructSpec	
	-> struct Tag									;
	-> struct '{' StructMembers... '}'				;
	-> struct Tag '{' StructMembers... '}'			;
	-> _Packed struct '{' StructMembers... '}'		;
	-> _Packed struct Tag '{' StructMembers... '}'	;

UnionSpec
	-> union Tag	;
	-> union '{' StructMembers... '}'		;
	-> union Tag '{' StructMembers... '}' 	;

StructMembers
	-> MemberSpec Members ';'	;  /* Allow unnamed structs and unions etc. */

MemberSpec
	-> [Qualifier]... Type... 	$$;	/* restrictions should be removed */
	-> [Qualifier]... Esu		$$;
	-> [Qualifier]... DynType	$$;

Members
	-> SMember \','... $$;

SMember
	-> Member	$$;
	-> Bitfield	$$;

Member
	-> MemberDeclarator [Attr] ;
	-> [Attr] ;

Bitfield
	-> FieldSize [Attr] ;
	-> MemberDeclarator FieldSize [Attr] ;

FieldSize
	-> ':' BinopC ;

MemberDeclarator
	-> [Pointer] DirectDeclarator	$$;

EnumSpec
	-> enum Tag										;
	-> enum '{' Enumerator \','... [','] '}'		;
	-> enum Tag '{' Enumerator \','... [','] '}'	;

Tag
	-> <identifier> ;
	-> {meta-name}	;

Enumerator
	-> EnumID			;
	-> EnumID EnumInit	;

EnumID
	-> <identifier> ;

EnumInit
	-> '=' BinopC ;

Init
	-> InitBlock	$$;
	-> InitExp		$$;

InitBlock
	-> '{' InitInner \','... [','] '}'	;

InitExp
	-> AssignExp		;

InitInner
	-> InitId InitBlock	$$;
	-> InitId InitExp	$$;
	-> InitBlock		$$;
	-> InitExp			$$;

InitId
	->	AryElem...	'='		;
	->	'.' InitLabel '='	;
	->  InitLabel ':' 		;

AryElem
	-> '[' InitElem ']'	$$;

InitElem
	->	Constant	;

InitLabel
	-> <identifier> ;
	-> {meta-name}	;

Attr
	-> Attr1 '(' Constant ')' ')' ')'	;
	-> Attr1 ')' ')'					;
	-> Attr1 '(' Identifier ')' ')' ')'	;
	-> Attr1 '(' Identifier ',' Constant ',' Constant ')' ')' ')'	;

Attr1
	-> __attribute__ '(' '(' AttrId	$$;

AttrId
	-> <identifier> ;
	-> {meta-name}	;

/* Statements */

StmtC
	-> ';'										;			/*0*/
	-> Exp ';'									;			/*1*/
	-> goto Identifier ';'						;			/*2*/
	-> continue ';'								;			/*3*/
	-> break ';'								;			/*4*/
	-> return [RetExp] ';'						;			/*5*/
	-> if '(' IfExp ')' IfStmtC					;			/*6*/
	-> if '(' IfExp ')' IfStmtC else ElseStmtC	;			/*7*/
	-> switch '(' SwExp ')' SwStmtC				;			/*8*/
	-> while '(' WhileExp ')' WhileStmtC		;			/*9*/
	-> do DoStmtC while '(' DoExp ')' ';'		;			/*10*/
	-> for '(' [ForInit] FS1 [ForCond] FS2 [ForPost] ')' ForStmtC	;	/*11*/
	-> BlockC									;			/*12*/
	-> Label ':' [StmtC]						;			/*13*/
	-> AsmStmt									;			/*14*/
	-> AnfBlock									;			/*15*/

FS1
	-> ';' ;
FS2
	-> ';' ;

RetExp
	-> Exp	;

IfExp
	-> Exp	;

SwExp
	-> Exp	;
	
WhileExp
	-> Exp	;

DoExp
	-> Exp	;

IfStmtC
	-> StmtC	;

ElseStmtC
	-> StmtC	;
	
DoStmtC
	-> StmtC	;

WhileStmtC
	-> StmtC	;
	
ForStmtC
	-> StmtC	;

SwStmtC
	-> StmtC	;

ForInit
	-> Exp	;

ForCond
	-> Exp	;

ForPost
	-> Exp	;

BlockC
	-> BlockEntry
		[Local]...
		[DeclOrFunc]...
		[StmtC]...
	   BlockExit			 	;

BlockEntry
	->	LB	;

BlockExit
	-> RB ;

DeclOrFunc
	-> InnerDecl		$$;
	-> NestedFuncDef	$$;

Local
	-> __label__ LocalID ':' $$;

LocalID
	-> <identifier>	;
	-> {meta-name}	;

Label
	->	<identifier> 					;
	->	{meta-name}						;
	->	default 						;
	->	case ConstExp 					;
	->	case ConstExp '...' ConstExp	;

OuterAnf
	->	AnfBlock [';']	;

AsmStmt
	-> GccAsmStmt		$$;
	-> MscAsmStmt		$$;

GccAsmStmt
	-> asm '(' [AsmString]... [GccIOspec] ')' ';' ;

AsmString

⌨️ 快捷键说明

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