Tasmota/lib/libesp32/Berry/src/be_lexer.h

138 lines
4.2 KiB
C

/********************************************************************
** Copyright (c) 2018-2020 Guan Wenliang
** This file is part of the Berry default interpreter.
** skiars@qq.com, https://github.com/Skiars/berry
** See Copyright Notice in the LICENSE file or at
** https://github.com/Skiars/berry/blob/master/LICENSE
********************************************************************/
#ifndef BE_LEXER_H
#define BE_LEXER_H
#include "be_object.h"
typedef enum {
TokenNone = 0,
TokenEOS, /* end of source */
TokenId, /* identifier */
TokenInteger,
TokenReal,
TokenString,
/* operator, don't change order */
/* assign operator */
OptAssign, /* operator, = */
OptAddAssign, /* operator, += */
OptSubAssign, /* operator, -= */
OptMulAssign, /* operator, *= */
OptDivAssign, /* operator, /= */
OptModAssign, /* operator, %= */
OptAndAssign, /* operator, &= */
OptOrAssign, /* operator, |= */
OptXorAssign, /* operator, ^= */
OptLsfAssign, /* operator, <<= */
OptRsfAssign, /* operator, >>= */
/* binary operator */
OptAdd, /* operator, + */
OptSub, /* operator, - */
OptMul, /* operator, * */
OptDiv, /* operator, / */
OptMod, /* operator, % */
OptLT, /* operator, < */
OptLE, /* operator, <= */
OptEQ, /* operator, == */
OptNE, /* operator, != */
OptGT, /* operator, > */
OptGE, /* operator, >= */
OptBitAnd, /* operatoe, & */
OptBitOr, /* operatoe, | */
OptBitXor, /* operatoe, ^ */
OptShiftL, /* operatoe, << */
OptShiftR, /* operatoe, >> */
OptConnect, /* operator, .. */
OptAnd, /* operator, && */
OptOr, /* operator, || */
/* unary operator */
OptNot, /* operator, ! */
OptFlip, /* operator, ~ */
/* postfix operator or bracket */
OptLBK, /* operator, ( bracket */
OptRBK, /* operator, ) bracket */
OptLSB, /* operator, [ square bracket */
OptRSB, /* operator, ] square bracket */
OptLBR, /* operator, { brace */
OptRBR, /* operator, } brace */
OptDot, /* operator, . dot */
/* other symbol */
OptComma, /* operator, , */
OptSemic, /* operator, ; */
OptColon, /* operator, : */
OptQuestion, /* operator, ? */
OptArrow, /* operator, -> */
/* keyword */
KeyIf, /* keyword if */
KeyElif, /* keyword elif */
KeyElse, /* keyword else */
KeyWhile, /* keyword while */
KeyFor, /* keyword for */
KeyDef, /* keyword def */
KeyEnd, /* keyword end */
KeyClass, /* keyword class */
KeyBreak, /* keyword break */
KeyContinue, /* keyword continue */
KeyReturn, /* keyword return */
KeyTrue, /* keyword true */
KeyFalse, /* keyword false */
KeyNil, /* keyword nil */
KeyVar, /* keyword var */
KeyDo, /* keyword do */
KeyImport, /* keyword import */
KeyAs, /* keyword as */
KeyTry, /* keyword try */
KeyExcept, /* keyword except */
KeyRaise /* keyword raise */
} btokentype;
struct blexerreader {
const char *s;
size_t len;
void *data;
breader readf;
};
struct blexerbuf {
char *s;
size_t len, size;
};
typedef struct btoken {
btokentype type;
union {
bstring *s;
bint i;
breal r;
} u;
} btoken;
typedef struct blexer {
const char *fname;
btoken token;
int linenumber;
int lastline;
btokentype cacheType;
struct blexerbuf buf;
struct blexerreader reader;
bmap *strtab;
bvm *vm;
int cursor;
} blexer;
void be_lexer_init(blexer *lexer, bvm *vm,
const char *fname, breader reader, void *data);
void be_lexer_deinit(blexer *lexer);
void be_lexerror(blexer *lexer, const char *msg);
int be_lexer_scan_next(blexer *lexer);
bstring* be_lexer_newstr(blexer *lexer, const char *str);
const char *be_token2str(bvm *vm, btoken *token);
const char* be_tokentype2str(btokentype type);
#endif