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;
DetailsGScannertypedef 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;
The data structure representing a lexical scanner.
You should set
The
If you want to use your own message handler you can set the
GScannerConfigtypedef 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;
Specifies the GScanner parser configuration. Most settings can be changed during the parsing phase and will affect the lexical parsing of the next unpeeked token.
g_scanner_new ()GScanner* g_scanner_new (const GScannerConfig *config_templ);
Creates a new GScanner.
The
g_scanner_destroy ()void g_scanner_destroy (GScanner *scanner); Frees all memory used by the GScanner.
g_scanner_input_file ()void g_scanner_input_file (GScanner *scanner, gint input_fd); Prepares to scan a file.
g_scanner_sync_file_offset ()void g_scanner_sync_file_offset (GScanner *scanner); Rewinds the filedescriptor to the current buffer position and blows the file read ahead buffer. This is useful for third party uses of the scanners filedescriptor, which hooks onto the current scanning position.
g_scanner_input_text ()void g_scanner_input_text (GScanner *scanner, const gchar *text, guint text_len); Prepares to scan a text buffer.
g_scanner_peek_next_token ()GTokenType g_scanner_peek_next_token (GScanner *scanner);
Parses the next token, without removing it from the input stream.
The token data is placed in the
Note that, while the token is not removed from the input stream (i.e.
the next call to
g_scanner_get_next_token ()GTokenType g_scanner_get_next_token (GScanner *scanner);
Parses the next token just like
g_scanner_eof ()gboolean g_scanner_eof (GScanner *scanner);
Returns g_scanner_cur_line ()guint g_scanner_cur_line (GScanner *scanner);
Returns the current line in the input stream (counting from 1).
This is the line of the last token parsed via
g_scanner_cur_position ()guint g_scanner_cur_position (GScanner *scanner);
Returns the current position in the current line (counting from 0).
This is the position of the last token parsed via
g_scanner_cur_token ()GTokenType g_scanner_cur_token (GScanner *scanner);
Gets the current token type.
This is simply the
g_scanner_cur_value ()GTokenValue g_scanner_cur_value (GScanner *scanner);
Gets the current token value.
This is simply the
g_scanner_set_scope ()guint g_scanner_set_scope (GScanner *scanner, guint scope_id); Sets the current scope.
g_scanner_scope_add_symbol ()void g_scanner_scope_add_symbol (GScanner *scanner, guint scope_id, const gchar *symbol, gpointer value); Adds a symbol to the given scope.
g_scanner_scope_foreach_symbol ()void g_scanner_scope_foreach_symbol (GScanner *scanner, guint scope_id, GHFunc func, gpointer user_data);
Calls the given function for each of the symbol/value pairs in the
given scope of the GScanner. The function is passed the symbol and
value of each pair, and the given
g_scanner_scope_lookup_symbol ()gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, guint scope_id, const gchar *symbol);
Looks up a symbol in a scope and return its value. If the
symbol is not bound in the scope, g_scanner_scope_remove_symbol ()void g_scanner_scope_remove_symbol (GScanner *scanner, guint scope_id, const gchar *symbol); Removes a symbol from a scope.
g_scanner_add_symbol()#define g_scanner_add_symbol( scanner, symbol, value ) Warning
Adds a symbol to the default scope.
g_scanner_remove_symbol()#define g_scanner_remove_symbol( scanner, symbol ) Warning
Removes a symbol from the default scope.
g_scanner_foreach_symbol()#define g_scanner_foreach_symbol( scanner, func, data ) Warning
Calls a function for each symbol in the default scope.
g_scanner_freeze_symbol_table()#define g_scanner_freeze_symbol_table(scanner) Warning
There is no reason to use this macro, since it does nothing.
g_scanner_thaw_symbol_table()#define g_scanner_thaw_symbol_table(scanner) Warning
There is no reason to use this macro, since it does nothing.
g_scanner_lookup_symbol ()gpointer g_scanner_lookup_symbol (GScanner *scanner, const gchar *symbol);
Looks up a symbol in the current scope and return its value. If the
symbol is not bound in the current scope, g_scanner_warn ()void g_scanner_warn (GScanner *scanner, const gchar *format, ...); Outputs a warning message, via the GScanner message handler.
g_scanner_error ()void g_scanner_error (GScanner *scanner, const gchar *format, ...); Outputs an error message, via the GScanner message handler.
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);
Outputs a message through the scanner's msg_handler, resulting from an
unexpected token in the input stream.
Note that you should not call
GScannerMsgFunc ()void (*GScannerMsgFunc) (GScanner *scanner, gchar *message, gboolean error); Specifies the type of the message handler function. G_CSET_a_2_z#define G_CSET_a_2_z The set of lowercase ASCII alphabet characters. Used for specifying valid identifier characters in GScannerConfig. G_CSET_A_2_Z#define G_CSET_A_2_Z The set of uppercase ASCII alphabet characters. Used for specifying valid identifier characters in GScannerConfig. G_CSET_DIGITS#define G_CSET_DIGITS The set of digits. Used for specifying valid identifier characters in GScannerConfig. G_CSET_LATINC#define G_CSET_LATINC The set of uppercase ISO 8859-1 alphabet characters which are not ASCII characters. Used for specifying valid identifier characters in GScannerConfig. G_CSET_LATINS#define G_CSET_LATINS The set of lowercase ISO 8859-1 alphabet characters which are not ASCII characters. Used for specifying valid identifier characters in GScannerConfig. enum GTokenTypetypedef 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;
The possible types of token returned from each union GTokenValueunion 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;
};
A union holding the value of the token. enum GErrorTypetypedef 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;
The possible errors, used in the
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||