C编译器LEX和YACC输入源文件

   2019-07-03 44
核心提示:[db:简介]

C编译器LEX和YACC输入源文件。

%token IDENTIFIER ConSTANT STRING_LITERAL SIZEOF
%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
%token XOR_ASSIGN OR_ASSIGN TYPE_NAME

%token TYPEDEF EXTERN STATIC AUTO REGISTER
%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE ConST VOLATILE VOID
%token STRUCT unio ENUM ELIPSIS RANGE

%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO ConTINUE BREAK RETURN

%start file
%%

primary_expr
 : identifier
 | CONSTANT
 | STRING_LITERAL
 | ( expr )
 ;

postfix_expr
 : primary_expr
 | postfix_expr [ expr ]
 | postfix_expr ( )
 | postfix_expr ( argument_expr_list )
 | postfix_expr . identifier
 | postfix_expr PTR_OP identifier
 | postfix_expr INC_OP
 | postfix_expr DEC_OP
 ;

argument_expr_list
 : assignment_expr
 | argument_expr_list , assignment_expr
 ;

unary_expr
 : postfix_expr
 | INC_OP unary_expr
 | DEC_OP unary_expr
 | unary_operator cast_expr
 | SIZEOF unary_expr
 | SIZEOF ( type_name )
 ;

unary_operator
 : &
 | *
 | +
 | -
 | ~
 | !
 ;

cast_expr
 : unary_expr
 | ( type_name ) cast_expr
 ;

multiplicative_expr
 : cast_expr
 | multiplicative_expr * cast_expr
 | multiplicative_expr / cast_expr
 | multiplicative_expr % cast_expr
 

additive_expr
 : multiplicative_expr
 | additive_expr + multiplicative_expr
 | additive_expr - multiplicative_expr
 ;

shift_expr
 : additive_expr
 | shift_expr LEFT_OP additive_expr
 | shift_expr RIGHT_OP additive_expr
 ;

relational_expr
 : shift_expr
 | relational_expr < shift_expr
 | relational_expr > shift_expr
 | relational_expr LE_OP shift_expr
 | relational_expr GE_OP shift_expr
 ;

equality_expr
 : relational_expr
 | equality_expr EQ_OP relational_expr
 | equality_expr NE_OP relational_expr
 ;

and_expr
 : equality_expr
 | and_expr & equality_expr
 ;

exclusive_or_expr
 : and_expr
 | exclusive_or_expr ^ and_expr
 ;

inclusive_or_expr
 : exclusive_or_expr
 | inclusive_or_expr | exclusive_or_expr
 ;

logical_and_expr
 : inclusive_or_expr
 | logical_and_expr AND_OP inclusive_or_expr
 ;

logical_or_expr
 : logical_and_expr
 | logical_or_expr OR_OP logical_and_expr
 ;

conditional_expr
 : logical_or_expr
 | logical_or_expr ? logical_or_expr : conditional_expr
 ;

assignment_expr
 : conditional_expr
 | unary_expr assignment_operator assignment_expr
 ;

assignment_operator
 : =
 | MUL_ASSIGN
 | DIV_ASSIGN
 | MOD_ASSIGN
 | ADD_ASSIGN
 | SUB_ASSIGN
 | LEFT_ASSIGN
 | RIGHT_ASSIGN
 | AND_ASSIGN
 | XOR_ASSIGN
 | OR_ASSIGN
 ;

expr
 : assignment_expr
 | expr , assignment_expr
 

constant_expr
 : conditional_expr
 ;

declaration
 : declaration_specifiers
 | declaration_specifiers init_declarator_list
 ;

declaration_specifiers
 : storage_class_specifier
 | storage_class_specifier declaration_specifiers
 | type_specifier
 | type_specifier declaration_specifiers
 ;

init_declarator_list
 : init_declarator
 | init_declarator_list , init_declarator
 ;

init_declarator
 : declarator
 | declarator = initializer
 ;

storage_class_specifier
 : TYPEDEF
 | EXTERN
 | STATIC
 | AUTO
 | REGISTER
 ;

type_specifier
 : CHAR
 | SHORT
 | INT
 | LONG
 | SIGNED
 | UNSIGNED
 | FLOAT
 | DOUBLE
 | CONST
 | VOLATILE
 | VOID
 | struct_or_unio_specifier
 | enum_specifier
 | TYPE_NAME
 ;

struct_or_unio_specifier
 : struct_or_unio identifier { struct_declaration_list }
 | struct_or_unio { struct_declaration_list }
 | struct_or_unio identifier
 ;

struct_or_unio
 : STRUCT
 | unio
 ;

struct_declaration_list
 : struct_declaration
 | struct_declaration_list struct_declaration
 ;

struct_declaration
 : type_specifier_list struct_declarator_list
 ;

struct_declarator_list
 : struct_declarator
 | struct_declarator_list , struct_declarator
 ;

struct_declarator
 : declarator
 | : constant_expr
 | declarator : constant_expr
 ;

enum_specifier
 : ENUM { enumerator_list }
 | ENUM identifier { enumerator_list }
 | ENUM identifier
 ;

enumerator_list
 : enumerator
 | enumerator_list , enumerator
 ;

enumerator
 : identifier
 | identifier = constant_expr
 ;

declarator
 : declarator2
 | pointer declarator2
 ;

declarator2
 : identifier
 | ( declarator )
 | declarator2 [ ]
 | declarator2 [ constant_expr ]
 | declarator2 ( )
 | declarator2 ( parameter_type_list )
 | declarator2 ( parameter_identifier_list )
 ;

pointer
 : *
 | * type_specifier_list
 | * pointer
 | * type_specifier_list pointer
 ;

type_specifier_list
 : type_specifier
 | type_specifier_list type_specifier
 ;

parameter_identifier_list
 : identifier_list
 | identifier_list , ELIPSIS
 ;

identifier_list
 : identifier
 | identifier_list , identifier
 ;

parameter_type_list
 : parameter_list
 | parameter_list , ELIPSIS
 ;

parameter_list
 : parameter_declaration
 | parameter_list , parameter_declaration
 ;

parameter_declaration
 : type_specifier_list declarator
 | type_name
 ;

type_name
 : type_specifier_list
 | type_specifier_list abstract_declarator
 ;

abstract_declarator
 : pointer
 | abstract_declarator2
 | pointer abstract_declarator2
 ;

abstract_declarator2
 : ( abstract_declarator )
 | [ ]
 | [ constant_expr ]
 | abstract_declarator2 [ ]
 | abstract_declarator2 [ constant_expr ]
 | ( )
 | ( parameter_type_list )
 | abstract_declarator2 ( )
 | abstract_declarator2 ( parameter_type_list )
 ;

initializer
 : assignment_expr
 | { initializer_list }
 | { initializer_list , }
 ;

initializer_list
 : initializer
 | initializer_list , initializer
 ;

statement
 : labeled_statement
 | compound_statement
 | expression_statement
 | selection_statement
 | iteration_statement
 | jump_statement
 ;

labeled_statement
 : identifier : statement
 | CASE constant_expr : statement
 | DEFAULT : statement
 ;

compound_statement
 : { }
 | { statement_list }
 | { declaration_list }
 | { declaration_list statement_list }
 ;

declaration_list
 : declaration
 | declaration_list declaration
 ;

statement_list
 : statement
 | statement_list statement
 ;

expression_statement
 :
 | expr
 ;

selection_statement
 : IF ( expr ) statement
 | IF ( expr ) statement ELSE statement
 | SWITCH ( expr ) statement
 ;

iteration_statement
 : WHILE ( expr ) statement
 | DO statement WHILE ( expr )
 | FOR ( ) statement
 | FOR ( expr ) statement
 | FOR ( expr ) statement
 | FOR ( expr expr ) statement
 | FOR ( expr ) statement
 | FOR ( expr expr ) statement
 | FOR ( expr expr ) statement
 | FOR ( expr expr expr ) statement
 ;

jump_statement
 : GOTO identifier
 | ConTINUE
 | BREAK
 | RETURN
 | RETURN expr
 ;

file
 : external_definition
 | file external_definition
 ;

external_definition
 : function_definition
 | declaration
 ;

function_definition
 : declarator function_body
 | declaration_specifiers declarator function_body
 ;

function_body
 : compound_statement
 | declaration_list compound_statement
 ;

identifier
 : IDENTIFIER
 ;
%%

#include <stdio.h>

extern char yytext[];
extern int column;

yyerror(s)
char *s;
{
 fflush(stdout);
 printf("n%*sn%*sn", column, "^", column, s);
}

main()
{
 int yyparse();

 return(yyparse());
}
RogueMonster
else
  echo "will not over write ./main.c"
fi
if `test ! -s ./scan.l`
then
echo "writting ./scan.l"
cat > ./scan.l << RogueMonster
D   [0-9]
L   [a-zA-Z_]
H   [a-fA-F0-9]
E   [Ee][+-]?{D}+
FS   (f|F|l|L)
IS   (u|U|l|L)*

%{
#include <stdio.h>
#include "y.tab.h"

void count();
%}

%%
" }

%%

yywrap()
{
 return(1);
}

comment()
{
 char c, c1;

loop:
 while ((c = input()) != * && c != 0)
  putcha(c);

 if ((c1 = input()) != / && c != 0)
 {
  unput(c1);
  goto loop;
 }

 if (c != 0)
  putcha(c1);
}

int column = 0;

void count()
{
 int i;

 for (i = 0; yytext[i] != 0 i++)
  if (yytext[i] == n)
   column = 0;
  else if (yytext[i] == t)
   column += 8 - (column % 8);
  else
   column++;

 ECHO;
}

int check_type()
{

 return(IDENTIFIER);
}
RogueMonster
else
  echo "will not over write ./scan.l"
fi
if `test ! -s ./y.tab.h`
then
echo "writting ./y.tab.h"
cat > ./y.tab.h << RogueMonster
# define IDENTIFIER 257
# define ConSTANT 258
# define STRING_LITERAL 259
# define SIZEOF 260
# define PTR_OP 261
# define INC_OP 262
# define DEC_OP 263
# define LEFT_OP 264
# define RIGHT_OP 265
# define LE_OP 266
# define GE_OP 267
# define EQ_OP 268
# define NE_OP 269
# define AND_OP 270
# define OR_OP 271
# define MUL_ASSIGN 272
# define DIV_ASSIGN 273
# define MOD_ASSIGN 274
# define ADD_ASSIGN 275
# define SUB_ASSIGN 276
# define LEFT_ASSIGN 277
# define RIGHT_ASSIGN 278
# define AND_ASSIGN 279
# define XOR_ASSIGN 280
# define OR_ASSIGN 281
# define TYPE_NAME 282
# define TYPEDEF 283
# define EXTERN 284
# define STATIC 285
# define AUTO 286
# define REGISTER 287
# define CHAR 288
# define SHORT 289
# define INT 290
# define LONG 291
# define SIGNED 292
# define UNSIGNED 293
# define FLOAT 294
# define DOUBLE 295
# define ConST 296
# define VOLATILE 297
# define VOID 298
# define STRUCT 299
# define unio 300
# define ENUM 301
# define ELIPSIS 302
# define RANGE 303
# define CASE 304
# define DEFAULT 305
# define IF 306
# define ELSE 307
# define SWITCH 308
# define WHILE 309
# define DO 310
# define FOR 311
# define GOTO 312
# define ConTINUE 313
# define BREAK 314
# define RETURN 315
RogueMonster
else
  echo "will not over write ./y.tab.h"
fi
echo "Finished archive 1 of 1"
exit

|| Tom Stockfisch, UCSD Chemistry tps%chem@sdcsvax.UCSD

 
举报收藏 0打赏 0
 
更多>同类数控技术
推荐图文
推荐数控技术
点击排行
网站首页  |  关于我们  |  升级会员  |  联系客服  |  广告合作  |  广告位图  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  RSS订阅  |  违规举报  |  蜀ICP备2021024440号