📄 cparse.y
字号:
%{
//cparse.y: A Grammar for code parsing
#include <stdlib.h>
#include <stdio.h>
#include "wic.h"
#define CSTYPE 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 parse.y */
/*========================================================================*/
%type <declList> decl
%type <dclr> init-declarator
%type <tree> initializer
%type <dclrList> init-declarator-list
%type <dummy> parse-interface
%type <dummy> external-definition
%type <dummy> translation-unit
/*========================================================================*/
/*======================== 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
/*==========================================================================*/
%start parse-interface
%%
parse-interface
: Y_EOF
{ outputZapEOF($1); CACCEPT; }
| translation-unit Y_EOF
{ outputZapEOF($2); CACCEPT; }
| error
{ recoverError(); CACCEPT; }
;
translation-unit
: external-definition
{ }
| translation-unit external-definition
{ }
;
external-definition
: decl
{ outputZapAll($1); }
| Y_EXTERN Y_STRING decl
{ outputZapAll($3); zapTokens2($1, $2); }
| Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_RIGHT_BRACE
{ zapTokens2($1, $2); zapTokens2($3, $5); }
| Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_RIGHT_BRACE Y_SEMICOLON
{ zapTokens2($1, $2); zapTokens3($3, $5, $6); }
| Y_EXTERN Y_STRING Y_LEFT_BRACE translation-unit Y_EOF
{
reportError(RERR_MISSING_RIGHT_BRACE);
zapTokens2($1, $2); zapTokens2($3, $5);
}
;
decl
: decl-specs Y_SEMICOLON
{ $$ = transformDecl($1); zapToken($2); }
| decl-specs init-declarator-list Y_SEMICOLON
{ $$ = transformDecl(addDeclInfoDclrList($1, $2)); zapToken($3); }
| error
{ recoverError(); $$ = NULL; }
;
init-declarator-list
: init-declarator
{ $$ = createDclrList($1); }
| init-declarator-list Y_COMMA init-declarator
{ $$ = addDclrList($1, $3); zapToken($2); }
;
init-declarator
: declarator
| declarator Y_EQUAL initializer
{ addDclrInitializer($1, $2, $3);}
;
initializer
: assignment-expression
;
/*======================== EXPRESSIONS ===================================*/
/* This part is common to both preparse.y and cparse.y */
/*========================================================================*/
primary-expression
: literal
| Y_LEFT_PAREN expression Y_RIGHT_PAREN
{ $$ = createCTree1(createConstr2Label(LABCT_PAREN_EXPR, $1, $3), $2); }
| identifier
{ $$ = createCTreeRoot(createTokenLabel($1)); }
;
postfix-expression
: primary-expression
| postfix-expression Y_LEFT_BRACKET expression Y_RIGHT_BRACKET
{ $$ = createCTree2(createConstr2Label(LABCT_INDEX, $2, $4), $1, $3); }
| postfix-expression Y_LEFT_PAREN expression-list-opt Y_RIGHT_PAREN
{ $$ = createCTree2(createConstr2Label(LABCT_CALL, $2, $4), $1, $3); }
| postfix-expression Y_DOT identifier
{ $$ = createCTree2(createConstr1Label(LABCT_DOT, $2), $1,
createCTreeRoot(createTokenLabel($3))); }
| postfix-expression Y_ARROW identifier
{ $$ = createCTree2(createConstr1Label(LABCT_ARROW, $2), $1,
createCTreeRoot(createTokenLabel($3))); }
;
expression-list-opt
: /* Nothing */
{ $$ = createNULLCTree(); }
| expression-list
;
expression-list
: assignment-expression
| expression-list Y_COMMA assignment-expression
{ $$ = createCTree2(createConstr1Label(LABCT_EXPR_LIST, $2), $1, $3); }
;
unary-expression
: postfix-expression
| unary-operator cast-expression
{ $$ = createCTree1( $1, $2 ); }
| Y_SIZEOF unary-expression
{ $$ = createCTree1(createConstr1Label(LABCT_SIZEOF_EXPR, $1), $2); }
| Y_SIZEOF Y_LEFT_PAREN type-name Y_RIGHT_PAREN
{ $$ = createCTree1(createConstr3Label(LABCT_SIZEOF_TYPE, $1, $2, $4), $3); }
;
unary-operator
: Y_TIMES
{ $$ = createConstr1Label(LABCT_VALUE_AT_ADDR, $1); }
| Y_AND
{ $$ = createConstr1Label(LABCT_ADDR_OF_VALUE, $1); }
| Y_PLUS
{ $$ = createConstr1Label(LABCT_UNARY_PLUS, $1); }
| Y_MINUS
{ $$ = createConstr1Label(LABCT_UNARY_MINUS, $1); }
| Y_EXCLAMATION
{ $$ = createConstr1Label(LABCT_EXCLAMATION, $1); }
| Y_TILDE
{ $$ = createConstr1Label(LABCT_TILDE, $1); }
;
cast-expression
: unary-expression
| Y_LEFT_PAREN type-name Y_RIGHT_PAREN cast-expression
{ $$ = createCTree2(createConstr2Label(LABCT_CAST_EXPR, $1, $3), $2, $4); }
;
multiplicative-expression
: cast-expression
| multiplicative-expression Y_TIMES cast-expression
{ $$ = createCTree2(createConstr1Label(LABCT_TIMES, $2), $1, $3); }
| multiplicative-expression Y_DIVIDE cast-expression
{ $$ = createCTree2(createConstr1Label(LABCT_DIVIDE, $2), $1, $3); }
| multiplicative-expression Y_PERCENT cast-expression
{ $$ = createCTree2(createConstr1Label(LABCT_PERCENT, $2), $1, $3); }
;
additive-expression
: multiplicative-expression
| additive-expression Y_PLUS multiplicative-expression
{ $$ = createCTree2(createConstr1Label(LABCT_PLUS, $2), $1, $3); }
| additive-expression Y_MINUS multiplicative-expression
{ $$ = createCTree2(createConstr1Label(LABCT_MINUS, $2), $1, $3); }
;
shift-expression
: additive-expression
| shift-expression Y_RSHIFT additive-expression
{ $$ = createCTree2(createConstr1Label(LABCT_RSHIFT, $2), $1, $3); }
| shift-expression Y_LSHIFT additive-expression
{ $$ = createCTree2(createConstr1Label(LABCT_LSHIFT, $2), $1, $3); }
;
relational-expression
: shift-expression
| relational-expression Y_LT shift-expression
{ $$ = createCTree2(createConstr1Label(LABCT_LT, $2), $1, $3); }
| relational-expression Y_LE shift-expression
{ $$ = createCTree2(createConstr1Label(LABCT_LE, $2), $1, $3); }
| relational-expression Y_GT shift-expression
{ $$ = createCTree2(createConstr1Label(LABCT_GT, $2), $1, $3); }
| relational-expression Y_GE shift-expression
{ $$ = createCTree2(createConstr1Label(LABCT_GE, $2), $1, $3); }
;
equality-expression
: relational-expression
| equality-expression Y_EQ relational-expression
{ $$ = createCTree2(createConstr1Label(LABCT_EQ, $2), $1, $3); }
| equality-expression Y_NE relational-expression
{ $$ = createCTree2(createConstr1Label(LABCT_NE, $2), $1, $3); }
;
and-expression
: equality-expression
| and-expression Y_AND equality-expression
{ $$ = createCTree2(createConstr1Label(LABCT_AND, $2), $1, $3); }
;
exclusive-or-expression
: and-expression
| exclusive-or-expression Y_XOR and-expression
{ $$ = createCTree2(createConstr1Label(LABCT_XOR, $2), $1, $3); }
;
inclusive-or-expression
: exclusive-or-expression
| inclusive-or-expression Y_OR exclusive-or-expression
{ $$ = createCTree2(createConstr1Label(LABCT_OR, $2), $1, $3); }
;
logical-and-expression
: inclusive-or-expression
| logical-and-expression Y_AND_AND inclusive-or-expression
{ $$ = createCTree2(createConstr1Label(LABCT_AND_AND, $2), $1, $3); }
;
logical-or-expression
: logical-and-expression
| logical-or-expression Y_OR_OR logical-and-expression
{ $$ = createCTree2(createConstr1Label(LABCT_OR_OR, $2), $1, $3); }
;
conditional-expression
: logical-or-expression
| logical-or-expression Y_QUESTION expression Y_COLON assignment-expression
{
$$ = createCTree2(createConstr1Label(LABCT_QUESTION, $2), $1,
createCTree2(createConstr1Label(LABCT_COLON, $4), $3, $5));
}
;
assignment-expression
: conditional-expression
;
expression
: assignment-expression
| expression Y_COMMA assignment-expression
{ $$ = createCTree2(createConstr1Label(LABCT_EXPR_SEPARATOR, $2), $1, $3); }
;
constant-expression
: conditional-expression
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -