IDA SDK
|
Tools for parsing C-like input. More...
Classes | |
struct | token_t |
Parser token. More... | |
struct | cast_t |
Preprocessor cast. More... | |
struct | lex_value_t |
Macros | |
#define | LXOPT_PARSE_FLOATS 0x0001 |
enable floating point constants | |
#define | LXOPT_REQ_SEPARATOR 0x0002 |
require a separator between a number and an ident or a character/string constant or dot | |
#define | LXOPT_NOCASE_FILES 0x0004 |
case-insensitive file search | |
#define | LXOPT_C99_CONSTANTS 0x0008 |
the size and sign of constants depend on the value itself and the 'U', 'L', and 'LL' modifier suffixes. More... | |
Typedefs | |
typedef ushort | lxtype |
see Parser token types | |
typedef error_t | lx_resolver_t(lexer_t *lx, void *ud, token_t *curtok, sval_t *res) |
Preprocessor callback for unknown tokens. More... | |
typedef error_t | lx_parse_cast_t(lexer_t *lx, cast_t *cast, token_t *ct) |
Preprocessor callbacks for casts. More... | |
typedef int idaapi | lx_preprocessor_cb(void *ud, const char *fname, int nl, const char *line) |
Preprocessor callback. More... | |
typedef int idaapi | lx_pragma_cb(void *ud, const char *line) |
Callback for #pragma directives. More... | |
typedef int idaapi | lx_warning_cb(void *ud, const char *line) |
Callback for #warning directives. More... | |
typedef int idaapi | lx_macro_cb(void *ud, const char *name, const char *body, int nargs, bool isfunc, bool is_new_macro) |
Callback for #define directives. More... | |
typedef int idaapi | lx_undef_cb(void *ud, const char *name) |
Callback for #undef directives. More... | |
Functions | |
idaman lexer_t *ida_export | create_lexer (const char *const *keys, size_t size, void *ud=nullptr) |
Create new lexical analyzer and set its keyword table. More... | |
idaman void ida_export | destroy_lexer (lexer_t *lx) |
Destroy a lexical analyzer. | |
idaman error_t ida_export | lex_define_macro (lexer_t *lx, const char *macro, const char *body, int nargs=0, bool isfunc=false) |
Define a macro. | |
idaman void ida_export | lex_undefine_macro (lexer_t *lx, const char *macro) |
Undefine a macro. More... | |
idaman int ida_export | lex_set_options (lexer_t *lx, int options) |
Set lexer options. More... | |
idaman error_t ida_export | lex_get_token (lexer_t *lx, token_t *t) |
Get next token. More... | |
idaman error_t ida_export | lex_get_token2 (lexer_t *lx, token_t *t, int32 *p_lnnum) |
idaman int ida_export | lex_enum_macros (const lexer_t *lx, int idaapi cb(const char *name, const char *body, int nargs, bool isfunc, void *ud), void *ud=nullptr) |
Enumerate all macros. More... | |
idaman const char *ida_export | lex_print_token (qstring *buf, const token_t *t) |
Debug: get text representation of token. | |
String oriented functions | |
idaman error_t ida_export | lex_init_string (lexer_t *lx, const char *line, void *macros=nullptr) |
Set the input line and the macro table. More... | |
File oriented functions | |
idaman error_t ida_export | lex_init_file (lexer_t *lx, const char *file) |
Initialization: file may be nullptr. More... | |
idaman const char *ida_export | lex_get_file_line (lexer_t *lx, int32 *linenum, const char **lineptr, int level=0) |
Error handling. More... | |
idaman void ida_export | lex_term_file (lexer_t *lx, bool del_macros) |
Termination: also see lex_init_file() | |
Variables | |
const lxtype | lx_end = 1 |
no more tokens | |
const lxtype | lx_ident = 2 |
ident | |
const lxtype | lx_number = 3 |
long constant | |
const lxtype | lx_string = 4 |
string constant (token_t.chr != 0 => unicode string) | |
const lxtype | lx_char = 5 |
char constant | |
const lxtype | lx_typename = 6 |
user-defined type | |
const lxtype | lx_float = 7 |
IEEE floating point constant. | |
const lxtype | lx_int64 = 8 |
int64 constant | |
const lxtype | lx_key = 128 |
keywords start. More... | |
Token stack | |
typedef qstack< token_t > | tokenstack_t |
see get_token(), unget_token() | |
bool | get_token (token_t *t, lexer_t *lx, tokenstack_t &buf) |
Retrieve token from a stack or lexer. More... | |
void | unget_token (const token_t &t, tokenstack_t &buf) |
Push a token back onto the token stack. | |
Tools for parsing C-like input.
Functions in this file use objects of opaque type lexer_t. To create a lexer_t instance, use create_lexer().
#define LXOPT_C99_CONSTANTS 0x0008 |
the size and sign of constants depend on the value itself and the 'U', 'L', and 'LL' modifier suffixes.
Otherwise the constant is always considered as signed and the size depends only on the number of bytes in the value
Preprocessor callback for unknown tokens.
Will be called when preprocessor calculates the value of #if expression.
Preprocessor callbacks for casts.
Will be called when preprocessor calculates the value of #if expression.
typedef int idaapi lx_preprocessor_cb(void *ud, const char *fname, int nl, const char *line) |
Preprocessor callback.
It will be called for each input line.
typedef int idaapi lx_pragma_cb(void *ud, const char *line) |
Callback for #pragma directives.
typedef int idaapi lx_warning_cb(void *ud, const char *line) |
Callback for #warning directives.
typedef int idaapi lx_macro_cb(void *ud, const char *name, const char *body, int nargs, bool isfunc, bool is_new_macro) |
Callback for #define directives.
typedef int idaapi lx_undef_cb(void *ud, const char *name) |
Callback for #undef directives.
idaman lexer_t *ida_export create_lexer | ( | const char *const * | keys, |
size_t | size, | ||
void * | ud = nullptr |
||
) |
Create new lexical analyzer and set its keyword table.
If keys==nullptr, then set the default C keyword table
idaman void ida_export lex_undefine_macro | ( | lexer_t * | lx, |
const char * | macro | ||
) |
Undefine a macro.
lx | the lexer object |
macro | macro to undefine |
idaman int ida_export lex_set_options | ( | lexer_t * | lx, |
int | options | ||
) |
Get next token.
lx | the lexer object |
t | the output buffer for the token |
p_lnnum | the line number where the token starts |
idaman int ida_export lex_enum_macros | ( | const lexer_t * | lx, |
int idaapi | cbconst char *name, const char *body, int nargs, bool isfunc, void *ud, | ||
void * | ud = nullptr |
||
) |
Enumerate all macros.
Do so until 'cb' returns non-zero.
idaman error_t ida_export lex_init_string | ( | lexer_t * | lx, |
const char * | line, | ||
void * | macros = nullptr |
||
) |
Set the input line and the macro table.
if macros==nullptr, the macro table will not be changed.
idaman error_t ida_export lex_init_file | ( | lexer_t * | lx, |
const char * | file | ||
) |
Initialization: file may be nullptr.
Also see lex_term_file().
idaman const char *ida_export lex_get_file_line | ( | lexer_t * | lx, |
int32 * | linenum, | ||
const char ** | lineptr, | ||
int | level = 0 |
||
) |
Error handling.
if level > 0, then return information about the enclosing file which included the current one.
|
inline |
Retrieve token from a stack or lexer.
If buf is not empty then get the token on top of the stack. If buf is empty then gen the next token from the lexer.
const lxtype lx_key = 128 |
keywords start.
All keys are lx_key + keynum.
Two-char separators are: (c1 + (c2 << 8)).
Three-char separators: