分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

/*below is Yacc Grammer source for ANSI C*/

/*YACC--LALR(1) PARSER*/

%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 UNION 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_union_specifier

| enum_specifier

| TYPE_NAME

;

struct_or_union_specifier

: struct_or_union identifier '{' struct_declaration_list '}'

| struct_or_union '{' struct_declaration_list '}'

| struct_or_union identifier

;

struct_or_union

: STRUCT

| UNION

;

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%*s\n%*s\n", column, "^", column, s);

}

main()

{

int yyparse();

return(yyparse());

}

\Rogue\Monsterelse

echo "will not over write ./main.c"

fi

if `test ! -s ./scan.l`

then

echo "writting ./scan.l"

cat > ./scan.l << '\Rogue\Monster\'

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();

%}

%%

"/*" { comment(); }

"auto" { count(); return(AUTO); }

"break" { count(); return(BREAK); }

"case" { count(); return(CASE); }

"char" { count(); return(CHAR); }

"const" { count(); return(CONST); }

"continue" { count(); return(CONTINUE); }

"default" { count(); return(DEFAULT); }

"do" { count(); return(DO); }

"double" { count(); return(DOUBLE); }

"else" { count(); return(ELSE); }

"enum" { count(); return(ENUM); }

"extern" { count(); return(EXTERN); }

"float" { count(); return(FLOAT); }

"for" { count(); return(FOR); }

"goto" { count(); return(GOTO); }

"if" { count(); return(IF); }

"int" { count(); return(INT); }

"long" { count(); return(LONG); }

"register" { count(); return(REGISTER); }

"return" { count(); return(RETURN); }

"short" { count(); return(SHORT); }

"signed" { count(); return(SIGNED); }

"sizeof" { count(); return(SIZEOF); }

"static" { count(); return(STATIC); }

"struct" { count(); return(STRUCT); }

"switch" { count(); return(SWITCH); }

"typedef" { count(); return(TYPEDEF); }

"union" { count(); return(UNION); }

"unsigned" { count(); return(UNSIGNED); }

"void" { count(); return(VOID); }

"volatile" { count(); return(VOLATILE); }

"while" { count(); return(WHILE); }

{L}({L}|{D})* { count(); return(check_type()); }

0[xX]{H}+{IS}? { count(); return(CONSTANT); }

0[xX]{H}+{IS}? { count(); return(CONSTANT); }

0{D}+{IS}? { count(); return(CONSTANT); }

0{D}+{IS}? { count(); return(CONSTANT); }

{D}+{IS}? { count(); return(CONSTANT); }

{D}+{IS}? { count(); return(CONSTANT); }

'(\\.|[^\\'])+' { count(); return(CONSTANT); }

{D}+{E}{FS}? { count(); return(CONSTANT); }

{D}*"."{D}+({E})?{FS}? { count(); return(CONSTANT); }

{D}+"."{D}*({E})?{FS}? { count(); return(CONSTANT); }

\"(\\.|[^\\"])*\" { count(); return(STRING_LITERAL); }

">>=" { count(); return(RIGHT_ASSIGN); }

"<<=" { count(); return(LEFT_ASSIGN); }

"+=" { count(); return(ADD_ASSIGN); }

"-=" { count(); return(SUB_ASSIGN); }

"*=" { count(); return(MUL_ASSIGN); }

"/=" { count(); return(DIV_ASSIGN); }

"%=" { count(); return(MOD_ASSIGN); }

"&=" { count(); return(AND_ASSIGN); }

"^=" { count(); return(XOR_ASSIGN); }

"|=" { count(); return(OR_ASSIGN); }

">>" { count(); return(RIGHT_OP); }

"<<" { count(); return(LEFT_OP); }

"++" { count(); return(INC_OP); }

"--" { count(); return(DEC_OP); }

"->" { count(); return(PTR_OP); }

"&&" { count(); return(AND_OP); }

"||" { count(); return(OR_OP); }

"<=" { count(); return(LE_OP); }

">=" { count(); return(GE_OP); }

"==" { count(); return(EQ_OP); }

"!=" { count(); return(NE_OP); }

";" { count(); return(';'); }

"{" { count(); return('{'); }

"}" { count(); return('}'); }

"," { count(); return(','); }

":" { count(); return(':'); }

"=" { count(); return('='); }

"(" { count(); return('('); }

")" { count(); return(')'); }

"[" { count(); return('['); }

"]" { count(); return(']'); }

"." { count(); return('.'); }

"&" { count(); return('&'); }

"!" { count(); return('!'); }

"~" { count(); return('~'); }

"-" { count(); return('-'); }

"+" { count(); return('+'); }

"*" { count(); return('*'); }

"/" { count(); return('/'); }

"%" { count(); return('%'); }

"<" { count(); return('<'); }

">" { count(); return('>'); }

"^" { count(); return('^'); }

"|" { count(); return('|'); }

"?" { count(); return('?'); }

[ \t\v\n\f] { count(); }

. { /* ignore bad characters */ }

%%

yywrap()

{

return(1);

}

comment()

{

char c, c1;

loop:

while ((c = input()) != '*' && c != 0)

putchar(c);

if ((c1 = input()) != '/' && c != 0)

{

unput(c1);

goto loop;

}

if (c != 0)

putchar(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()

{

/*

* pseudo code --- this is what it should check

*

* if (yytext == type_name)

* return(TYPE_NAME);

*

* return(IDENTIFIER);

*/

/*

* it actually will only return IDENTIFIER

*/

return(IDENTIFIER);

}

\Rogue\Monsterelse

echo "will not over write ./scan.l"

fi

if `test ! -s ./y.tab.h`

then

echo "writting ./y.tab.h"

cat > ./y.tab.h << '\Rogue\Monster\'

# 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 UNION 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

\Rogue\Monsterelse

echo "will not over write ./y.tab.h"

fi

echo "Finished archive 1 of 1"

exit

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有