/* Copyright (C) 1995 Bjoern Beutel. */
/* Description. =============================================================*/
/* This module supports scanning (lexical analysis) of malaga source files. */
/* Constants. ===============================================================*/
/* The next token is read by "read_next_token".
* Its value is stored in NEXT_TOKEN.
* A token that consists of one character has the code of that character.
* A token value of EOF stands for end-of-file.
* All other tokens are as follows: */
enum
{
TOK_STRING = 256, /* A string. */
TOK_IDENT, /* An identifier. */
TOK_VARIABLE, /* A variable name. */
TOK_CONSTANT, /* A constant name. */
TOK_NUMBER, /* A floating number. */
TOK_ASSIGN, /* ":=". */
TOK_ASSIGN_PLUS, /* ":=+". */
TOK_ASSIGN_MINUS, /* ":=-". */
TOK_ASSIGN_ASTERISK, /* ":=*". */
TOK_ASSIGN_SLASH, /* ":=/". */
TOK_NOT_EQUAL, /* "/=". */
TOK_NOT_CONGRUENT, /* "/~". */
TOK_ACCEPT,
TOK_ALLO_RULE,
TOK_AND,
TOK_ASSERT,
TOK_BREAK,
TOK_CHOOSE,
TOK_COMBI_RULE,
TOK_CONTINUE,
TOK_DEFAULT,
TOK_DEFINE,
TOK_ELSE,
TOK_ELSEIF,
TOK_END,
TOK_END_RULE,
TOK_ERROR,
TOK_FOREACH,
TOK_GREATER,
TOK_GREATER_EQUAL,
TOK_IF,
TOK_IN,
TOK_INCLUDE,
TOK_INITIAL,
TOK_INPUT_FILTER,
TOK_LESS,
TOK_LESS_EQUAL,
TOK_MATCHES,
TOK_NOT,
TOK_OR,
TOK_OUTPUT_FILTER,
TOK_PARALLEL,
TOK_PRUNING_RULE,
TOK_REPEAT,
TOK_REQUIRE,
TOK_RESULT,
TOK_RETURN,
TOK_ROBUST_RULE,
TOK_RULES,
TOK_SELECT,
TOK_STOP,
TOK_SUBRULE,
TOK_THEN,
TOK_WHILE
};
enum {FIRST_KEYWORD = TOK_ACCEPT, LAST_KEYWORD = TOK_WHILE};
enum {NUMBER_OF_KEYWORDS = (LAST_KEYWORD - FIRST_KEYWORD + 1)};
/* Variables. ===============================================================*/
extern int_t next_token; /* Next token that is to be consumed by parser. */
extern string_t token_name;
/* If NEXT_TOKEN == TOK_IDENT, the name is in TOKEN_NAME. */
extern char_t *token_string;
/* If NEXT_TOKEN == TOK_STRING, the name is in TOKEN_STRING. */
extern double token_number;
/* If NEXT_TOKEN == TOK_NUMBER, its content is in TOKEN_NUMBER. */
/* Functions. ===============================================================*/
extern void init_scanner( void );
/* Initialise the scanner. */
extern void terminate_scanner( void );
/* Terminate the scanner, even when it's scanning. */
extern void begin_include( string_t file_name );
/* Open a new level of inclusion and read tokens from file FILE_NAME. */
extern void end_include( void );
/* Stop reading from current source stream and read from former file. */
extern void end_includes( void );
/* Stop reading from all nested source streams. */
extern void set_scanner_input( string_t input );
/* Make the scanner use INPUT as scanner input
* until "set_scanner_input( NULL )" is called.
* INPUT must remain valid until then. */
extern string_t current_file_name( void );
/* Return the name of the file reading from or NULL. */
extern int_t current_line_number( void );
/* Return the line number where the last char has been read or -1. */
extern int_t current_column( void );
/* Return the column where the last char has been read or -1. */
extern void read_next_token( void );
/* Read the next token from current source into NEXT_TOKEN.
* If end of input stream is reached, return EOF. */
extern void test_token( int_t token );
/* Test if TOKEN is the next token. If it's not, report an error. */
extern void parse_token( int_t token );
/* Test if TOKEN is the next token and read next token. */
extern string_t token_as_text( int_t token );
/* Return TOKEN as a string readable for humans.
* Note that the string is only valid until this function is called again. */
/* End of file. =============================================================*/