#include #include #include #include #include "parser.h" #include "util.h" typedef struct Cursor{ const char *s; int l; } Cursor; typedef enum Tokentype{ TT_EOF, //str=NULL, len=-1 TT_SYMBOL, TT_WORD, TT_NUMBER, TT_ERR=-1 //str is an error description, len=-1 } Tokentype; typedef struct Token{ Tokentype type; const char *str; //pointer into source int len; } Token; #define SYMBOLCHARS "()[]" static Token tt_make(Tokentype type,const char *str,int len){ Token tok={type,str,len}; return tok; } static Token tt_eof(void){ return tt_make(TT_EOF,NULL,-1); } static Token tt_err(const char *errstr){ return tt_make(TT_ERR,errstr,-1); } static void advance(Cursor *cursor,int n){ assert(cursor->l>=n); cursor->s+=n; cursor->l-=n; } static bool iswordchar(char c){ return strchr(SYMBOLCHARS,c)==NULL&&c>=33&&c<=126; } static Token nexttoken(Cursor *cursor){ while(cursor->l>=1&&isspace(*cursor->s))advance(cursor,1); if(cursor->l==0)return tt_eof(); if(strchr(SYMBOLCHARS,*cursor->s)!=NULL){ advance(cursor,1); return tt_make(TT_SYMBOL,cursor->s-1,1); } if(isdigit(*cursor->s)||(cursor->l>=2&&cursor->s[0]=='-'&&isdigit(cursor->s[1]))){ char *endp; strtod(cursor->s,&endp); assert(endp>cursor->s); int len=endp-cursor->s; advance(cursor,len); return tt_make(TT_NUMBER,cursor->s-len,len); } int i; for(i=0;il;i++){ if(!iswordchar(cursor->s[i]))break; } if(i==0){ return tt_err("Unrecognised character while looking for next token"); } advance(cursor,i); return tt_make(TT_WORD,cursor->s-i,i); } static ParseRet parse_(Cursor *cursor){ ; } ParseRet parse(const char *source,int length){ Cursor cursor={source,length}; return parse_(&cursor); }