Lexical Scanner

Lexical Scanner

Synopsis


#include <glib.h>

                    GScanner;
                    GScannerConfig;
GScanner*           g_scanner_new                       (const GScannerConfig *config_templ);
void                g_scanner_destroy                   (GScanner *scanner);

void                g_scanner_input_file                (GScanner *scanner,
                                                         gint input_fd);
void                g_scanner_sync_file_offset          (GScanner *scanner);
void                g_scanner_input_text                (GScanner *scanner,
                                                         const gchar *text,
                                                         guint text_len);
GTokenType          g_scanner_peek_next_token           (GScanner *scanner);
GTokenType          g_scanner_get_next_token            (GScanner *scanner);
gboolean            g_scanner_eof                       (GScanner *scanner);

guint               g_scanner_cur_line                  (GScanner *scanner);
guint               g_scanner_cur_position              (GScanner *scanner);
GTokenType          g_scanner_cur_token                 (GScanner *scanner);
GTokenValue         g_scanner_cur_value                 (GScanner *scanner);

guint               g_scanner_set_scope                 (GScanner *scanner,
                                                         guint scope_id);
void                g_scanner_scope_add_symbol          (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol,
                                                         gpointer value);
void                g_scanner_scope_foreach_symbol      (GScanner *scanner,
                                                         guint scope_id,
                                                         GHFunc func,
                                                         gpointer user_data);
gpointer            g_scanner_scope_lookup_symbol       (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol);
void                g_scanner_scope_remove_symbol       (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol);
#define             g_scanner_add_symbol                ( scanner, symbol, value )
#define             g_scanner_remove_symbol             ( scanner, symbol )
#define             g_scanner_foreach_symbol            ( scanner, func, data )

#define             g_scanner_freeze_symbol_table       (scanner)
#define             g_scanner_thaw_symbol_table         (scanner)
gpointer            g_scanner_lookup_symbol             (GScanner *scanner,
                                                         const gchar *symbol);

void                g_scanner_warn                      (GScanner *scanner,
                                                         const gchar *format,
                                                         ...);
void                g_scanner_error                     (GScanner *scanner,
                                                         const gchar *format,
                                                         ...);
void                g_scanner_unexp_token               (GScanner *scanner,
                                                         GTokenType expected_token,
                                                         const gchar *identifier_spec,
                                                         const gchar *symbol_spec,
                                                         const gchar *symbol_name,
                                                         const gchar *message,
                                                         gint is_error);
void                (*GScannerMsgFunc)                  (GScanner *scanner,
                                                         gchar *message,
                                                         gboolean error);

#define             G_CSET_a_2_z
#define             G_CSET_A_2_Z
#define             G_CSET_DIGITS
#define             G_CSET_LATINC
#define             G_CSET_LATINS
enum                GTokenType;
union               GTokenValue;
enum                GErrorType;

Description

Details

GScanner

typedef struct {
  /* unused fields */
  gpointer		user_data;
  guint			max_parse_errors;
  
  /* g_scanner_error() increments this field */
  guint			parse_errors;
  
  /* name of input stream, featured by the default message handler */
  const gchar		*input_name;
  
  /* quarked data */
  GData			*qdata;
  
  /* link into the scanner configuration */
  GScannerConfig	*config;
  
  /* fields filled in after g_scanner_get_next_token() */
  GTokenType		token;
  GTokenValue		value;
  guint			line;
  guint			position;
  
  /* fields filled in after g_scanner_peek_next_token() */
  GTokenType		next_token;
  GTokenValue		next_value;
  guint			next_line;
  guint			next_position;
  
  /* to be considered private */
  GHashTable		*symbol_table;
  gint			input_fd;
  const gchar		*text;
  const gchar		*text_end;
  gchar			*buffer;
  guint			scope_id;
  
  /* handler function for _warn and _error */
  GScannerMsgFunc	msg_handler;
} GScanner;


GScannerConfig

typedef struct {
  /* Character sets
   */
  gchar		*cset_skip_characters;		/* default: " \t\n" */
  gchar		*cset_identifier_first;
  gchar		*cset_identifier_nth;
  gchar		*cpair_comment_single;		/* default: "#\n" */
  
  /* Should symbol lookup work case sensitive?
   */
  guint		case_sensitive : 1;
  
  /* Boolean values to be adjusted "on the fly"
   * to configure scanning behaviour.
   */
  guint		skip_comment_multi : 1;		/* C like comment */
  guint		skip_comment_single : 1;	/* single line comment */
  guint		scan_comment_multi : 1;		/* scan multi line comments? */
  guint		scan_identifier : 1;
  guint		scan_identifier_1char : 1;
  guint		scan_identifier_NULL : 1;
  guint		scan_symbols : 1;
  guint		scan_binary : 1;
  guint		scan_octal : 1;
  guint		scan_float : 1;
  guint		scan_hex : 1;			/* `0x0ff0' */
  guint		scan_hex_dollar : 1;		/* `$0ff0' */
  guint		scan_string_sq : 1;		/* string: 'anything' */
  guint		scan_string_dq : 1;		/* string: "\\-escapes!\n" */
  guint		numbers_2_int : 1;		/* bin, octal, hex => int */
  guint		int_2_float : 1;		/* int => G_TOKEN_FLOAT? */
  guint		identifier_2_string : 1;
  guint		char_2_token : 1;		/* return G_TOKEN_CHAR? */
  guint		symbol_2_token : 1;
  guint		scope_0_fallback : 1;		/* try scope 0 on lookups? */
  guint		store_int64 : 1; 		/* use value.v_int64 rather than v_int */
  guint		padding_dummy;
} GScannerConfig;


g_scanner_new ()

GScanner*           g_scanner_new                       (const GScannerConfig *config_templ);

config_templ :

Returns :


g_scanner_destroy ()

void                g_scanner_destroy                   (GScanner *scanner);

scanner :


g_scanner_input_file ()

void                g_scanner_input_file                (GScanner *scanner,
                                                         gint input_fd);

scanner :

input_fd :


g_scanner_sync_file_offset ()

void                g_scanner_sync_file_offset          (GScanner *scanner);

scanner :


g_scanner_input_text ()

void                g_scanner_input_text                (GScanner *scanner,
                                                         const gchar *text,
                                                         guint text_len);

scanner :

text :

text_len :


g_scanner_peek_next_token ()

GTokenType          g_scanner_peek_next_token           (GScanner *scanner);

scanner :

Returns :


g_scanner_get_next_token ()

GTokenType          g_scanner_get_next_token            (GScanner *scanner);

scanner :

Returns :


g_scanner_eof ()

gboolean            g_scanner_eof                       (GScanner *scanner);

scanner :

Returns :


g_scanner_cur_line ()

guint               g_scanner_cur_line                  (GScanner *scanner);

scanner :

Returns :


g_scanner_cur_position ()

guint               g_scanner_cur_position              (GScanner *scanner);

scanner :

Returns :


g_scanner_cur_token ()

GTokenType          g_scanner_cur_token                 (GScanner *scanner);

scanner :

Returns :


g_scanner_cur_value ()

GTokenValue         g_scanner_cur_value                 (GScanner *scanner);

scanner :

Returns :


g_scanner_set_scope ()

guint               g_scanner_set_scope                 (GScanner *scanner,
                                                         guint scope_id);

scanner :

scope_id :

Returns :


g_scanner_scope_add_symbol ()

void                g_scanner_scope_add_symbol          (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol,
                                                         gpointer value);

scanner :

scope_id :

symbol :

value :


g_scanner_scope_foreach_symbol ()

void                g_scanner_scope_foreach_symbol      (GScanner *scanner,
                                                         guint scope_id,
                                                         GHFunc func,
                                                         gpointer user_data);

scanner :

scope_id :

func :

user_data :


g_scanner_scope_lookup_symbol ()

gpointer            g_scanner_scope_lookup_symbol       (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol);

scanner :

scope_id :

symbol :

Returns :


g_scanner_scope_remove_symbol ()

void                g_scanner_scope_remove_symbol       (GScanner *scanner,
                                                         guint scope_id,
                                                         const gchar *symbol);

scanner :

scope_id :

symbol :


g_scanner_add_symbol()

#define             g_scanner_add_symbol( scanner, symbol, value )

Warning

g_scanner_add_symbol is deprecated and should not be used in newly-written code.

scanner :

symbol :

value :


g_scanner_remove_symbol()

#define             g_scanner_remove_symbol( scanner, symbol )

Warning

g_scanner_remove_symbol is deprecated and should not be used in newly-written code.

scanner :

symbol :


g_scanner_foreach_symbol()

#define             g_scanner_foreach_symbol( scanner, func, data )

Warning

g_scanner_foreach_symbol is deprecated and should not be used in newly-written code.

scanner :

func :

data :


g_scanner_freeze_symbol_table()

#define             g_scanner_freeze_symbol_table(scanner)

Warning

g_scanner_freeze_symbol_table is deprecated and should not be used in newly-written code.

scanner :


g_scanner_thaw_symbol_table()

#define             g_scanner_thaw_symbol_table(scanner)

Warning

g_scanner_thaw_symbol_table is deprecated and should not be used in newly-written code.

scanner :


g_scanner_lookup_symbol ()

gpointer            g_scanner_lookup_symbol             (GScanner *scanner,
                                                         const gchar *symbol);

scanner :

symbol :

Returns :


g_scanner_warn ()

void                g_scanner_warn                      (GScanner *scanner,
                                                         const gchar *format,
                                                         ...);

scanner :

format :

... :


g_scanner_error ()

void                g_scanner_error                     (GScanner *scanner,
                                                         const gchar *format,
                                                         ...);

scanner :

format :

... :


g_scanner_unexp_token ()

void                g_scanner_unexp_token               (GScanner *scanner,
                                                         GTokenType expected_token,
                                                         const gchar *identifier_spec,
                                                         const gchar *symbol_spec,
                                                         const gchar *symbol_name,
                                                         const gchar *message,
                                                         gint is_error);

scanner :

expected_token :

identifier_spec :

symbol_spec :

symbol_name :

message :

is_error :


GScannerMsgFunc ()

void                (*GScannerMsgFunc)                  (GScanner *scanner,
                                                         gchar *message,
                                                         gboolean error);

scanner :

message :

error :


G_CSET_a_2_z

#define G_CSET_a_2_z	"abcdefghijklmnopqrstuvwxyz"


G_CSET_A_2_Z

#define G_CSET_A_2_Z	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"


G_CSET_DIGITS

#define G_CSET_DIGITS	"0123456789"


G_CSET_LATINC

#define             G_CSET_LATINC


G_CSET_LATINS

#define             G_CSET_LATINS


enum GTokenType

typedef enum
{
  G_TOKEN_EOF			=   0,
  
  G_TOKEN_LEFT_PAREN		= '(',
  G_TOKEN_RIGHT_PAREN		= ')',
  G_TOKEN_LEFT_CURLY		= '{',
  G_TOKEN_RIGHT_CURLY		= '}',
  G_TOKEN_LEFT_BRACE		= '[',
  G_TOKEN_RIGHT_BRACE		= ']',
  G_TOKEN_EQUAL_SIGN		= '=',
  G_TOKEN_COMMA			= ',',
  
  G_TOKEN_NONE			= 256,
  
  G_TOKEN_ERROR,
  
  G_TOKEN_CHAR,
  G_TOKEN_BINARY,
  G_TOKEN_OCTAL,
  G_TOKEN_INT,
  G_TOKEN_HEX,
  G_TOKEN_FLOAT,
  G_TOKEN_STRING,
  
  G_TOKEN_SYMBOL,
  G_TOKEN_IDENTIFIER,
  G_TOKEN_IDENTIFIER_NULL,
  
  G_TOKEN_COMMENT_SINGLE,
  G_TOKEN_COMMENT_MULTI,
  G_TOKEN_LAST
} GTokenType;


union GTokenValue

union GTokenValue
{
  gpointer	v_symbol;
  gchar		*v_identifier;
  gulong	v_binary;
  gulong	v_octal;
  gulong	v_int;
  guint64       v_int64;
  gdouble	v_float;
  gulong	v_hex;
  gchar		*v_string;
  gchar		*v_comment;
  guchar	v_char;
  guint		v_error;
};


enum GErrorType

typedef enum
{
  G_ERR_UNKNOWN,
  G_ERR_UNEXP_EOF,
  G_ERR_UNEXP_EOF_IN_STRING,
  G_ERR_UNEXP_EOF_IN_COMMENT,
  G_ERR_NON_DIGIT_IN_CONST,
  G_ERR_DIGIT_RADIX,
  G_ERR_FLOAT_RADIX,
  G_ERR_FLOAT_MALFORMED
} GErrorType;