mirror of https://github.com/arendst/Tasmota.git
138 lines
4.2 KiB
C
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
|