/* This file is part of web2w. Copyright 2017 Martin Ruckert web2w is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. web2w is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with web2w. If not, see . Martin Ruckert, Hochschule Muenchen, Lothstrasse 64, 80336 Muenchen */ /*2:*/ #line 532 "web2w.w" /*6:*/ #line 585 "web2w.w" #define TEX INITIAL /*:6*//*7:*/ #line 644 "web2w.w" typedef struct token{ int tag; struct token*next,*previous,*link,*up; union{ /*8:*/ #line 661 "web2w.w" struct{ int sequenceno; int lineno; /*9:*/ #line 675 "web2w.w" char*text; /*:9*//*38:*/ #line 995 "web2w.w" int sym_no; struct symbol*sym_ptr; /*:38*/ #line 665 "web2w.w" } /*:8*/ #line 649 "web2w.w" ; /*94:*/ #line 2012 "web2w.w" struct{ int value; } /*:94*/ #line 650 "web2w.w" ; }; }token; /*:7*//*10:*/ #line 685 "web2w.w" extern const char*tagname(int tag); /*:10*//*15:*/ #line 719 "web2w.w" extern int wwlineno; /*:15*//*17:*/ #line 728 "web2w.w" extern int sequenceno; #define SEQ (sequenceno++) /*:17*//*18:*/ #line 736 "web2w.w" void seq(token*t,token*s); /*:18*//*20:*/ #line 749 "web2w.w" extern token*add_token(int tag); /*:20*//*22:*/ #line 761 "web2w.w" extern token*last_token; /*:22*//*25:*/ #line 794 "web2w.w" #define TOK(string,tag) (add_token(tag)->text= string) /*:25*//*26:*/ #line 807 "web2w.w" #define COPY copy_string(wwtext) /*:26*//*27:*/ #line 819 "web2w.w" #define BOS new_string() #define ADD add_string(wwtext) #define EOS (string_length()> 0?TOK(end_string(),TEXT):0) /*:27*//*28:*/ #line 831 "web2w.w" extern char*new_string(void); extern void add_string(char*str); extern char*end_string(void); extern char*copy_string(char*str); extern int string_length(void); /*:28*//*33:*/ #line 920 "web2w.w" typedef struct symbol{ char*name; int tag; int obsolete; int for_ctrl; int value; struct symbol*link; token*type; token*eq; }symbol; extern int get_sym_no(char*name); extern symbol*symbol_table[]; /*:33*//*39:*/ #line 1001 "web2w.w" #define SYM_PTR(name) symbol_table[get_sym_no(name)] #define SYMBOL {int s= get_sym_no(yytext);add_token(symbol_table[s]->tag)->sym_no= s;} #define SYM(t) (symbol_table[(t)->sym_no]) /*:39*//*41:*/ #line 1030 "web2w.w" extern void localize(token*t); /*:41*//*42:*/ #line 1037 "web2w.w" extern void scope_open(void); extern void scope_close(void); /*:42*//*47:*/ #line 1137 "web2w.w" extern void ww_push(token*t); extern token*ww_pop(token*t); extern int ww_is(int tag); /*:47*//*49:*/ #line 1180 "web2w.w" #define PUSH ww_push(last_token) #define PUSH_NULL ww_push(NULL) #define POP ww_pop(last_token) #define POP_NULL (ADD, POP) #define POP_MLEFT (EOS, TOK("}",RIGHT), BEGIN(MIDDLE), POP) #define POP_PLEFT (EOS, TOK("}",RIGHT), BEGIN(PASCAL), POP) #define POP_LEFT (ww_is(MLEFT)? POP_MLEFT : (ww_is(PLEFT)? POP_PLEFT: POP_NULL)) /*:49*//*50:*/ #line 1204 "web2w.w" extern void wwstring(char*wwtext); #define WWSTRING wwstring(wwtext) /*:50*//*56:*/ #line 1268 "web2w.w" typedef struct module{ token*atless; token*atgreater; struct module*left,*right; }module; extern void add_module(token*atless); extern module*find_module(token*atless); /*:56*//*60:*/ #line 1336 "web2w.w" #define AT_GREATER_EQ TOK("@>",ATGREATER), add_module(POP), TOK("=",EQ), PUSH, SEQ #define AT_GREATER TOK("@>",ATGREATER), find_module(POP) /*:60*//*61:*/ #line 1349 "web2w.w" extern token*program; #define PROGRAM (program->link= last_token,program= last_token),TOK("",EQ) /*:61*//*64:*/ #line 1378 "web2w.w" #define CHGTAG(t,x) ((t)->tag= (x)) #define CHGID(t,x) (SYM(t)->tag= (x)) #define CHGTYPE(t,x) (SYM(t)->type= (x)) #define CHGVALUE(t,x) (SYM(t)->value= (x)) #define CHGTEXT(t,x) ((t)->text= (x)) /*:64*//*66:*/ #line 1408 "web2w.w" extern void def_macro(token*eq,int tag); #define DEF_MACRO(tag) def_macro(last_token,tag),SEQ /*:66*//*69:*/ #line 1470 "web2w.w" extern int pplex(void); extern void pperror(const char*message); /*:69*//*84:*/ #line 1819 "web2w.w" extern int getval(token*t); /*:84*//*86:*/ #line 1856 "web2w.w" #define SETVAL(t,val) SYM(t)->value= val /*:86*//*95:*/ #line 2020 "web2w.w" token*join(int tag,token*left,token*right,int value); /*:95*//*106:*/ #line 2178 "web2w.w" #define IGN(t) ((t)->tag= CIGNORE) /*:106*//*131:*/ #line 2655 "web2w.w" extern void pstring_args(token*id,token*arg); extern void pstring_assign(token*id,token*val); /*:131*//*149:*/ #line 2987 "web2w.w" extern void clabel(token*t,int use); /*:149*//*151:*/ #line 3018 "web2w.w" extern int exit_no; #define TOK_RETURN {token *t= add_token(PRETURN); t->sym_no= exit_no; } /*:151*//*157:*/ #line 3110 "web2w.w" #define LNK(from,to) ((from)?(seq((from),(to)),(from)->link= (to)):0) /*:157*//*163:*/ #line 3214 "web2w.w" #define UP(from,to) ((from)->up= (to)) /*:163*//*174:*/ #line 3460 "web2w.w" extern token*winsert_after(token*t,int tag,char*text); /*:174*//*177:*/ #line 3500 "web2w.w" int dead_end(token*t,int lineno); /*:177*//*182:*/ #line 3631 "web2w.w" #define VAR_LOOP 0 #define TO_LOOP 1 #define DOWNTO_LOOP 2 /*:182*//*184:*/ #line 3685 "web2w.w" extern void mark_for_variable(token*id,int lineno,int value,int direction); #define FOR_CTRL_PACK(lineno,replace,direction,bits) \ ((lineno<<16)|((replace&0x1)<<15)|((direction&0x3)<<13)|(bits&0x1FFF)) #define FOR_CTRL_LINE(X) (((X)>>16)&0xFFFF) #define FOR_CTRL_REPLACE(X) (((X)>>15)&1) #define FOR_CTRL_DIRECTION(X) (((X)>>13)&0x3) #define FOR_CTRL_BITS(X) ((X)&0x1FFF) /*:184*//*189:*/ #line 3938 "web2w.w" extern void wsemicolon(token*p,token*t); extern void wend(token*p,token*t); /*:189*//*195:*/ #line 4028 "web2w.w" extern unsigned int param_mask,param_bit; #define SIGN_BIT (~(((unsigned int)~0)>>1)) #define START_PARAM (param_mask= 0,param_bit= SIGN_BIT) #define NEXT_PARAM (param_bit= param_bit>>1,CHECK(param_bit!=0,"Too many parameters")) #define REF_PARAM (param_mask= param_mask|param_bit) /*:195*//*201:*/ #line 4164 "web2w.w" extern void wreturn(token*t,int tail,token*link); /*:201*//*203:*/ #line 4233 "web2w.w" extern int x_over_n,xn_over_d; /*:203*//*211:*/ #line 4414 "web2w.w" typedef enum{dbgnone= 0x0, dbgbasic= 0x1, dbgflex= 0x2, dbglink= 0x4, dbgtoken= 0x8, dbgid= 0x10, dbgpascal= 0x20, dbgexpand= 0x40, dbgbison= 0x80, dbgparse= 0x100, dbgcweb= 0x200, dbgjoin= 0x400, dbgstring= 0x800, dbgfor= 0x1000, dbgslash= 0x2000, dbgmacro= 0x4000, dbgarray= 0x8000, dbgreturn= 0x10000, dbgsemicolon= 0x20000, dbgbreak= 0x40000 }debugmode; /*:211*//*212:*/ #line 4441 "web2w.w" extern FILE*logfile; extern int ww_flex_debug; extern debugmode debugflags; /*:212*//*216:*/ #line 4540 "web2w.w" #include #include #define MESSAGE(...) (fprintf(logfile,__VA_ARGS__),fflush(logfile)) #define ERROR(...) (fprintf(logfile,"ERROR: "),\ MESSAGE(__VA_ARGS__),fprintf(logfile,"\n"),exit(1)) #define CHECK(condition,...) (!(condition)? ERROR(__VA_ARGS__):0) /*:216*//*217:*/ #line 4550 "web2w.w" #define THE_TOKEN(t) "%d\t%d: %s\t[%s]\n",\ t->lineno,t->sequenceno,token2string(t),tagname(t->tag) /*:217*//*218:*/ #line 4556 "web2w.w" #define DBG(flags,...) {if(debugflags & flags) MESSAGE(__VA_ARGS__);} #define DBGTOKS(flags, from,to) { if (debugflags & flags) \ { token *t= from; MESSAGE("<<");\ while (t!=to) { MESSAGE("%s",token2string(t)); t= t->next;}\ MESSAGE(">>\n"); }} #define TAG(t) (t?tagname(t->tag):"NULL") #define DBGTREE(flags,t) DBG(flags,"%s -> %s | %s | %d\n",TAG(t),\ TAG(t->previous),TAG(t->next),t->value) /*:218*/ #line 533 "web2w.w" /*:2*/