📄 preparse.y
字号:
%{
// File generated from preparse.y using yaccpre.bat
/*
preparse.y: A Grammar for preprocessor parsing
*/
#include <stdlib.h>
#include <stdio.h>
#include "wic.h"
static pToken _lastDefineTok;
#define PRESTYPE 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 preparse.y */
/*========================================================================*/
%type <tree> control-line
%type <tree> define-directive
%type <tree> directive
%type <token> file-name
%type <tree> pre-define-keyword
%type <tree> define-directive
%type <token> line-end
%type <data> no-expand-next-token-action
/*========================================================================*/
/*======================== 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
/*==========================================================================*/
%%
directive
: control-line
{
if ($1 != NULL) {
addSLListElem(g_dirList, $1);
}
PREACCEPT;
}
| error
{ recoverError(); PREACCEPT; }
;
control-line
: Y_PRE_NULL line-end
{ $$ = NULL; }
| Y_PRE_ELSE line-end
{ $$ = createCTreeRoot(createConstr1Label(LABCT_PRE_ELSE, $1)); }
| Y_PRE_ENDIF line-end
{ $$ = createCTreeRoot(createConstr1Label(LABCT_PRE_ENDIF, $1)); }
| Y_PRE_IF constant-expression line-end
{
if (g_opt.targetLang == TLT_FORTRAN) {
reportError(CERR_PREDIR_NOT_SUPPORTED, "#if");
}
$$ = createCTree1(createConstr1Label(LABCT_PRE_IF, $1), $2);
}
| Y_PRE_ELIF constant-expression line-end
{
if (g_opt.targetLang == TLT_FORTRAN) {
reportError(CERR_PREDIR_NOT_SUPPORTED, "#elif");
}
$$ = createCTree1(createConstr1Label(LABCT_PRE_ELIF, $1), $2);
}
| Y_PRE_INCLUDE file-name line-end
{
$$ = createCTreeRoot(createConstr2Label(LABCT_PRE_INCLUDE, $1, $2));
pushTokFile(getTokenIdName($2));
}
| pre-define-keyword define-directive
{ $$ = $2; }
| Y_PRE_IFDEF no-expand-next-token-action Y_ID line-end
{ $$ = createCTreeRoot(createConstr2Label(LABCT_PRE_IFDEF, $1, $3)); }
| Y_PRE_IFNDEF no-expand-next-token-action Y_ID line-end
{ $$ = createCTreeRoot(createConstr2Label(LABCT_PRE_IFNDEF, $1, $3)); }
| Y_PRE_PRAGMA
{
reportError(CERR_PREDIR_NOT_SUPPORTED, "#pragma");
$$ = eatPreDirList($1);
}
| Y_PRE_ERROR
{
if (g_opt.targetLang == TLT_FORTRAN) {
reportError(CERR_PREDIR_NOT_SUPPORTED, "#error");
}
$$ = eatPreDirList($1);
}
| Y_PRE_LINE
{
if (g_opt.targetLang == TLT_FORTRAN) {
reportError(CERR_PREDIR_NOT_SUPPORTED, "#line");
}
$$ = eatPreDirList($1);
}
| Y_PRE_UNDEF no-expand-next-token-action
{ $$ = eatPreDirList($1); }
| Y_PRE_NEWLINE
{ $$ = NULL; }
;
file-name
: Y_STRING
{ $$ = $1; }
| Y_INCLUDE_FILE_NAME
{ $$ = $1; }
;
pre-define-keyword
: Y_PRE_DEFINE
{
expandNextToken = 0;
expandThisLineHideErrors = 1;
_lastDefineTok = $1;
}
;
define-directive
: identifier constant-expression line-end
{ $$ = createEnumFromDefine(_lastDefineTok, $1, $2); }
| identifier Y_PRE_SPECIAL_LEFT_PAREN
{ expandThisLine = 0; $$ = createDefineMacroCTree(); }
| identifier error
{ $$ = createDefineMacroCTree(); }
| error
{ recoverError(); $$ = NULL; }
;
line-end
: Y_PRE_NEWLINE
{
$$ = $1;
}
;
no-expand-next-token-action
: { expandNextToken = 0; }
;
postfix-expression
: Y_DEFINED Y_LEFT_PAREN no-expand-next-token-action identifier Y_RIGHT_PAREN
{ $$ = createCTreeRoot(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -