/* * Copyright (c) 2011 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef LEX_T_H_ #define LEX_T_H_ #include "bigint_t.h" /** Lexical element class */ typedef enum { lc_invalid, lc_eof, lc_ident, lc_lit_char, lc_lit_int, lc_lit_string, /* Keywords */ lc_and, lc_as, lc_break, lc_bool, lc_builtin, lc_char, lc_class, lc_deleg, lc_do, lc_elif, lc_else, lc_end, lc_enum, lc_except, lc_false, lc_finally, lc_for, lc_fun, lc_new, lc_get, lc_if, lc_in, lc_int, lc_interface, lc_is, lc_nil, lc_not, lc_or, lc_override, lc_packed, lc_private, lc_prop, lc_protected, lc_public, lc_raise, lc_resource, lc_return, lc_self, lc_set, lc_static, lc_string, lc_struct, lc_switch, lc_then, lc_this, lc_true, lc_var, lc_with, lc_when, lc_while, lc_yield, /* Operators */ lc_period, lc_slash, lc_lparen, lc_rparen, lc_lsbr, lc_rsbr, lc_equal, lc_notequal, lc_lt, lc_gt, lc_lt_equal, lc_gt_equal, lc_assign, lc_plus, lc_minus, lc_mult, lc_increase, /* Punctuators */ lc_comma, lc_colon, lc_scolon, lc__limit } lclass_t; typedef struct { /* String ID */ int sid; } lem_ident_t; typedef struct { /* Character value */ bigint_t value; } lem_lit_char_t; typedef struct { /* Integer value */ bigint_t value; } lem_lit_int_t; typedef struct { /* String value */ char *value; } lem_lit_string_t; /** Lexical element */ typedef struct { /* Lexical element class */ lclass_t lclass; union { lem_ident_t ident; lem_lit_char_t lit_char; lem_lit_int_t lit_int; lem_lit_string_t lit_string; } u; /** Coordinates of this lexical element */ struct cspan *cspan; } lem_t; /** Lexer state object */ typedef struct lex { /** Input object */ struct input *input; /** Lexing buffer */ char *inbuf; /** Pointer to current position in lexing buffer */ char *ibp; /** Number of the line currently in inbuf */ int ib_line; /** Column number adjustment (due to tabs) */ int col_adj; /** @c b_true if we have the previous lem in @c prev */ bool_t prev_valid; /** Previous lem (only valid if @c current_valid is true) */ lem_t prev; /** @c b_true if we have the current lem in @c current */ bool_t current_valid; /** Curent lem (only valid if @c current_valid is true) */ lem_t current; } lex_t; #endif