printing is skipped. In all other cases, 'yylval' is set, and the token's
integer representation is returned.
*/
-int lexer
#define $($)#$
#define SCAN_ERROR -1
#define TK_EMPTY (TK_STACKP == TK_STACKX)
fprintf(stderr,__VA_ARGS__); \
goto done; \
} while (0)
+int lexer
()
{ struct tok token;
start:
/* Token Receiver
This receiver takes a struct tok and pushes it to the FIFO stack.
*/
-void lexer_pushtok
#define $($)#$ //stringifier
#define ERR_TK "Fatal: Generated over " $(TK_STACKSIZE) " tokens in one pass."
-( int tok, YYSTYPE lval )
+void lexer_pushtok
+( int tok,
+ YYSTYPE lval
+)
{ if (TK_LEN() >= TK_STACKSIZE)
{ fprintf(stderr, ERR_TK);
exit(EXIT_FAILURE);
/* Lexical analysis of a file
Strips a filename to its base name, then sends it to lexer_lex
*/
-int lexer_lexfile
#define HIDDEN_WARNING "%s is hidden and will not be parsed!\n", filename
+int lexer_lexfile
( const uint8_t *filename
)
{ static uint8_t fname[FNAME_MAX];
/* Scan filename and push the its tokens
onto the stack */
int lexer_lexfilename
-(uint8_t* str)
+( uint8_t* str
+)
{ int ntok, len;
uint8_t *filepath;
#include <stdio.h>
#include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
#include "parser.tab.h"
#include "apc.h"
#include <unistdio.h>
#include <unistr.h>
-
-extern void lexer_pushtok(int, YYSTYPE);
-extern int lexer_lexmapfile(int, int);
-extern int ipower(int, int);
-extern int ttov(uint8_t*, int);
-
+extern //lexer.c
+void lexer_pushtok(int, YYSTYPE);
+/* Public */
int lexer_setdirection(uint8_t*, int);
int lexer_lexstring(uint8_t*, int);
int lexer_setstr(uint8_t*, int);
-#define $($)#$
-#define PUSHTOK(TOK,LFUNC,UTYPE) \
- do { \
- printf("Lexer_lexstring:: PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \
- tok_t = TOK; \
- yylval.UTYPE = LFUNC(ts, p-ts); \
- lexer_pushtok(tok_t, yylval); \
- ++ntok; \
- } while (0);
-
%%{
machine lexstring;
# set up yylval and tok_t to be pushed to stack
- action push_ref { PUSHTOK(REF, ttov, ref); }
- action push_val { PUSHTOK(NUM, ttov, val); }
+ action push_ref { te = NULL; errno = 0;
+ yylval.ref = strtoll((char*)ts,(char**)&te,16);
+ if (errno | (te != NULL))
+ { fprintf(stderr, "Invalid hex number in file %s\n",(char*)str);
+ if (te != NULL)
+ { while (str++ < te)
+ fputc(' ', stderr);
+ fputc('^', stderr);
+ }
+ exit(1);
+ }
+ lexer_pushtok(REF, yylval); ntok++;
+ }
+ action push_link { lexer_pushtok(LINK,(YYSTYPE)0); ntok++; }
+ action push_val { te = NULL; errno = 0;
+ yylval.val = strtoll((char*)ts,(char**)&te,10);
+ if (errno)
+ { fprintf(stderr, "strtoll could not parse %s\n", (char*)str);
+ exit(1);
+ }
+ lexer_pushtok(NUM, yylval);
+ }
action push_name { printf("Lexer_lexstring:: action:push_name: from %s to %s\n", ts, p);
lexer_pushtok(NAME, yylval);
ntok++;
lexer_pushtok(D, yylval);
}
action push_height { printf("Lexer_lexstring:: action:push_height p = %s\n", p);
- PUSHTOK(HEIGHT, ttov, val);
}
action push_width { printf("Lexer_lexstring:: action:push_height p = %s\n", p);
- PUSHTOK(WIDTH, ttov, val);
}
- action push_link {yylval.str = (uint8_t*) '#'; lexer_pushtok(LINK,yylval); }
#action lex_error { printf("input error: character %c in filename %s is invalid\n p = %s\n", fc, str, p);}
action p { printf("Lexer_lexstring:: p = %s\n", p);}
#types of tokes a filename can contain
direction = (N | W | S | E | NW | NE | SW | SE) ;
#make sure 0x123123 doesnt get mistaken for a ref
- dimensions = (digit+ - '0') >set_ts %push_height 'x' (digit+ - '0') >set_ts %push_width;
+ dimensions = (digit+ - '0') >set_ts %push_val 'x' (digit+ - '0') >set_ts %push_val;
link = '#' %push_link;
SS = ('+SS' %to(push_SS)) | ('+SS' %to(push_SS) link ) ;
ref = '0x' >set_ts alnum+ %push_ref;
}%%
-int
-lexer_lexstring
-(uint8_t* str, int size)
+int lexer_lexstring
+( uint8_t* str,
+ int size
+)
{ uint8_t *p;
- uint8_t *ts, *pe;
- int cs, ntok, tok_t;
+ uint8_t *ts, *pe, *te;
+ int cs, ntok;//, tok_t;
ntok = 0;
p = ts = str;
}
%{
- #include "apc.h"
#include <stdio.h>
#include <string.h>
#include <dirent.h>
-
+ #include <unitypes.h>
extern int lexer_init(); //?
extern int lexer(); //?
extern void pop_cdat(void);
- extern void push_cdat(struct name*);
+ extern void push_cdat(uint8_t*);
extern void insert_vdat(void);
extern void insert_refid(int);
- extern void insert_set_name(struct name*);
- extern void insert_set_namelist(struct name*);
- extern void insert_link_name(struct name*);
- extern void insert_map(struct name*,int, int, int, int, uint8_t*);
- extern void insert_mlink(struct name*, int);
- extern void insert_vlink(struct name*, int);
- extern void insert_framesheet(struct name* ,int, int, int,int, uint8_t*);
+ extern void insert_set_name(uint8_t*);
+ extern void insert_set_namelist(uint8_t*);
+ extern void insert_link_name(uint8_t*);
+ extern void insert_map(uint8_t*,int, int, int, int, uint8_t*);
+ extern void insert_mlink(uint8_t*, int);
+ extern void insert_vlink(uint8_t*, int);
+ extern void insert_framesheet(uint8_t* ,int, int, int,int, uint8_t*);
#define yylex lexer
%define lr.type ielr
%union {
- int ref;
+ long long ref;
int val;
uint8_t* str;
- struct name* name;
void *voidp;
}
%token <val> HEIGHT
%token <val> WIDTH
%token <val> D
-%token <name> NAME
+%token <str> NAME
//nonterminals
%type <val> ref_id
/* Syntax Directed Translation Scheme of the APC grammar */