The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

Lexical Scanner

Lexical Scanner — универсальный лексический сканер.

Краткое описание


#include <glib.h>


            GScanner;
GScanner*   g_scanner_new                   (const GScannerConfig *config_templ);
            GScannerConfig;

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);

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);
gboolean    g_scanner_eof                   (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_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);

void        g_scanner_destroy               (GScanner *scanner);

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

#define     g_scanner_add_symbol            ( scanner, symbol, value )
#define     g_scanner_remove_symbol         ( scanner, symbol )
#define     g_scanner_foreach_symbol        ( scanner, func, data )

Описание

GScanner и связанные с ней функции обеспечивают универсальный лексический сканер.

Детали

GScanner

typedef struct {
  /* неиспользуемые поля */
  gpointer		user_data;
  guint			max_parse_errors;
  
  /* g_scanner_error() инкрементирует это поле */
  guint			parse_errors;
  
  /* имя входного потока, показываемое обработчиком сообщения по умолчанию */
  const gchar		*input_name;
  
  /* quarked data */
  GData			*qdata;
  
  /* ссылка на конфигурацию сканера */
  GScannerConfig	*config;
  
  /* поля заполняемые после g_scanner_get_next_token() */
  GTokenType		token;
  GTokenValue		value;
  guint			line;
  guint			position;
  
  /* поля заполняемые после g_scanner_peek_next_token() */
  GTokenType		next_token;
  GTokenValue		next_value;
  guint			next_line;
  guint			next_position;
  
  /* рассматриваются как закрытые */
  GHashTable		*symbol_table;
  gint			input_fd;
  const gchar		*text;
  const gchar		*text_end;
  gchar			*buffer;
  guint			scope_id;
  
  /* функция обработчик для _warn и _error */
  GScannerMsgFunc	msg_handler;
} GScanner;

Структура данных представляющая лексический сканер.

Вы должны установить input_name после создания сканера, та как оно используется обработчиком сообщений по умолчанию когда отображаются предупреждения и ошибки Если вы сканируете файл, имя файла будет хорошим выбором для этого.

Поля user_data и max_parse_errors неиспользуются. Если вам нужно связать дополнительные данные со сканером вы можете поместить их сюда.

Если вам нужно использовать собственный обработчик сообщений вы можете установить его в поле msg_handler. Тип функции обработки сообщений определяет GScannerMsgFunc.


g_scanner_new ()

GScanner*   g_scanner_new                   (const GScannerConfig *config_templ);

Создаёт новую GScanner. Структура config_templ определяет начальные установки сканера, которые копируются в структуру GScanner поле config. Для использования настроек по умолчанию вы можете поместить NULL.

config_templ : начальные настройки сканера.
Возвращает : новая GScanner.

GScannerConfig

typedef struct {
  /* Наборы символов
   */
  gchar		*cset_skip_characters;		/* по умолчанию: " \t\n" */
  gchar		*cset_identifier_first;
  gchar		*cset_identifier_nth;
  gchar		*cpair_comment_single;		/* по умолчанию: "#\n" */
  
  /* Чувствителен ли поиск символа к регистру?
   */
  guint		case_sensitive : 1;
  
  /* Логическое значение для настройки "на лету"
   * конфигурации правил сканирования.
   */
  guint		skip_comment_multi : 1;		/* C подобный комментарий */
  guint		skip_comment_single : 1;	/* единственная строка комментария */
  guint		scan_comment_multi : 1;		/* сканировать множество строк коментария? */
  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;		/* возвращать G_TOKEN_CHAR? */
  guint		symbol_2_token : 1;
  guint		scope_0_fallback : 1;		/* позволить 0 контекст поиска? */
  guint		store_int64 : 1; 		/* использовать значение.v_int64 вместо v_int */
  guint		padding_dummy;
} GScannerConfig;

Определяет настройки GScanner.

cset_skip_characters определяет символы которые сканер должен пропускать (по умолчанию символы пробелов: пробел, табуляцию, перевод каретки и перевод строки).

cset_identifier_first определяет символы которые могут начинать идентификаторы (по умолчанию это G_CSET_a_2_z, "_", и G_CSET_A_2_Z).

cset_identifier_nth определяет символы которые могут использоваться в идентификаторах после первого символа (по умолчанию это G_CSET_a_2_z, "_0123456789", G_CSET_A_2_Z, G_CSET_LATINS, G_CSET_LATINC).

cpair_comment_single определяет символы начала и конца единственной строки коментария. По умолчанию это "#\n" который означает что единственная строка комментария начинается с '#' и продолжается до '\n' (конец строки).

case_sensitive определяет чувствительность символов к регистру (по умолчанию FALSE).

skip_comment_multi определяет пропускать ли многострочные комментарии и не возвращать как лексемы (по умолчанию TRUE).

skip_comment_single определяет пропускать ли однострочные комментарии и не возвращать как лексемы (по умолчанию TRUE).

scan_comment_multi определяет распознавать ли многострочные комментарии (по умолчанию TRUE).

scan_identifier определяет распознавать ли идентификатор (по умолчанию TRUE).

scan_identifier_1char определяет распознавать ли единственный символ идентификатора (по умолчанию FALSE).

scan_identifier_NULL определяет возвращать ли NULL как G_TOKEN_IDENTIFIER_NULL. (по умолчанию FALSE).

scan_symbols определяет распознавать ли символы (по умолчанию TRUE).

scan_binary определяет распознавать ли двоичные числа (по умолчанию FALSE).

scan_octal определяет распознавать ли восьмеричные числа (по умолчанию TRUE).

scan_float определяет распознавать ли числа с плавающей точкой (по умолчанию TRUE).

scan_hex определяет распознавать ли шестнадцатеричные числа (по умолчанию TRUE).

scan_hex_dollar определяет распознавать ли '$' как префикс для шестнадцатеричных чисел (по умолчанию FALSE).

scan_string_sq определяет заключена ли строка в одиночные кавычки (по умолчанию TRUE).

scan_string_dq определяет заключена ли строка в двойные кавычки (по умолчанию TRUE).

numbers_2_int определяет должны ли двоичные, восьмеричные и шестнадцатеричные числа передаваться как G_TOKEN_INT (по умолчанию TRUE).

int_2_float определяет передаются ли все числа как G_TOKEN_FLOAT (по умолчанию FALSE).

identifier_2_string определяет передаётся ли идентификатор как строка (по умолчанию FALSE).

char_2_token определяет передаются символы устанавливая token = ch или как G_TOKEN_CHAR (по умолчанию TRUE).

symbol_2_token определяет передаются ли символы установленными как token = v_symbol или как G_TOKEN_SYMBOL (по умолчанию FALSE).

scope_0_fallback определяет разыскивается ли символ для контекста по умолчанию в дополнение к текущему контексту (по умолчанию FALSE).


g_scanner_input_file ()

void        g_scanner_input_file            (GScanner *scanner,
                                             gint input_fd);

Подготавливает файл для сканирования.

scanner : GScanner.
input_fd : дискриптор файла.

g_scanner_sync_file_offset ()

void        g_scanner_sync_file_offset      (GScanner *scanner);

Перематывает файловый дескриптор в текущую позицию буфера и позволяет читать файл с начала буфера. Это полезно когда используется третичный сканер файлового дескриптора, который прикрепляется к текущей позиции сканера.

scanner : GScanner.

g_scanner_input_text ()

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

Подготавливает для сканирования текстовый буфер.

scanner : GScanner.
text : текстовый буфер для сканирования.
text_len : длина текстового буфера.

g_scanner_peek_next_token ()

GTokenType  g_scanner_peek_next_token       (GScanner *scanner);

Получает следующую лексему, не удаляя её из потока ввода. Символьные данные помещаются в next_token, next_value, next_line, и next_position поля структуры GScanner.

Помните что пока лексема не удалена из входного потока (то есть следующий вызов g_scanner_get_next_token() будет возвращать туже лексему), она не будет переоценена. Это может привести к удивительным результатам когда изменяется контекст заглядывания за следующую лексему. Получение следующей лексемы после переключения контекста вернёт то что рассматривалось ранее, независимо от любых символов которые могут быть добавлены или удалены в новом контексте.

scanner : GScanner.
Возвращает : тип лексемы.

g_scanner_get_next_token ()

GTokenType  g_scanner_get_next_token        (GScanner *scanner);

Получает следующую лексему удаляя её из входного потока. Символьные данные помещаются в token, value, line, и position поля структуры GScanner.

scanner : GScanner.
Возвращает : тип лексемы.

g_scanner_cur_line ()

guint       g_scanner_cur_line              (GScanner *scanner);

Получает текущую строку во входном потоке (подсчёт начинается с 1).

scanner : GScanner.
Возвращает : текущая строка.

g_scanner_cur_position ()

guint       g_scanner_cur_position          (GScanner *scanner);

Получает текущую позицию в текущей строке (подсчёт начинается с 0).

scanner : GScanner.
Возвращает : текущая позиция в строке.

g_scanner_cur_token ()

GTokenType  g_scanner_cur_token             (GScanner *scanner);

Получает текущий тип лексемы. Это просто поле token в структуре GScanner.

scanner : GScanner.
Возвращает : текущий тип лексемы.

g_scanner_cur_value ()

GTokenValue g_scanner_cur_value             (GScanner *scanner);

Получает текущее значение лексемы. Это просто поле value в структуре GScanner.

scanner : GScanner.
Возвращает : текущее значение лексемы.

g_scanner_eof ()

gboolean    g_scanner_eof                   (GScanner *scanner);

Возвращает TRUE если сканер достиг конца файла или текстового буфера.

scanner : GScanner.
Возвращает : TRUE если сканер достиг конца файла или текстового буфера.

g_scanner_set_scope ()

guint       g_scanner_set_scope             (GScanner *scanner,
                                             guint scope_id);

Устанавливает текущий контекст.

scanner : GScanner.
scope_id : новый id контекста.
Возвращает : старый id контекста.

g_scanner_scope_add_symbol ()

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

Добавляет символ в полученный контекст.

scanner : GScanner.
scope_id : id контектса.
symbol : добавляемый символ.
value : значение символа.

g_scanner_scope_foreach_symbol ()

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

Вызывает полученную функцию для каждой пары символ/значение в полученном контексте GScanner. Функция помещает символ и значение каждой пары и полученный параметр user_data.

scanner : GScanner.
scope_id : id контекста.
func : функция вызываемая для каждой пары символ/значение.
user_data : пользовательские данные помещаемые в функцию.

g_scanner_scope_lookup_symbol ()

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

Находит символ в контексте и возвращает его значение. Если символа нет в контексте, возвращает NULL.

scanner : GScanner.
scope_id : id контекста.
symbol : разыскиваемый символ.
Возвращает : значение symbol в полученном контексте, или NULL если symbol не находится в полученном контексте.

g_scanner_scope_remove_symbol ()

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

Удаляет символ из контекста.

scanner : GScanner.
scope_id : id контекста.
symbol : символ для удаления.

g_scanner_freeze_symbol_table()

#define     g_scanner_freeze_symbol_table(scanner)

Внимание

g_scanner_freeze_symbol_table устарела начиная с версии 2.2 и не должна использоваться во вновь создаваемом коде. Этот макрос ничего не делает.

scanner : GScanner.

g_scanner_thaw_symbol_table()

#define     g_scanner_thaw_symbol_table(scanner)

Внимание

g_scanner_thaw_symbol_table устарела начиная с версии 2.2 и не должна использоваться во вновь создаваемом коде. Этот макрос ничего не делает.

scanner : GScanner.

g_scanner_lookup_symbol ()

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

Находит символ в текущем контексте и возвращает его значение. Если символ не находится в текущем контексте, то возвращает NULL.

scanner : GScanner.
symbol : символ для поиска.
Возвращает : значение symbol в текущем контексте, или NULL если symbol не находится в текущем контексте.

g_scanner_warn ()

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

Выводит предупреждающее сообщение через обработчик сообщений GScanner.

scanner : GScanner.
format : формат сообщения. Смотрите документацию для printf().
... : параметры вставляемые в строку формата.

g_scanner_error ()

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

Выводит сообщение об ошибке через обработчик сообщений GScanner.

scanner : GScanner.
format : формат сообщения. Смотрите документацию для printf().
... : параметры вставляемые в строку формата.

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);

Выводит сообщение через msg_handler сканера, реагируя на неожиданную лексему во входном потоке. Помните что вы не должны вызывать g_scanner_peek_next_token() сопровождаемый g_scanner_unexp_token() без промежуточного вызова g_scanner_get_next_token(), поскольку g_scanner_unexp_token() оценивает текущую лексему (не просматриваемую лексему) для создания части сообщения.

scanner : GScanner.
expected_token : ожидаемая лексема.
identifier_spec : строка описывающая как пользователю сканера обращаться к идентификаторам (NULL для идентификатора по умолчанию). Это используется если expected_token равен G_TOKEN_IDENTIFIER или G_TOKEN_IDENTIFIER_NULL.
symbol_spec : строка описывающая как пользователь сканера обращается к символам (NULL по умолчанию к "symbol"). Это используется если expected_token равен G_TOKEN_SYMBOL или какому нибудь символьному значению больше чем G_TOKEN_LAST.
symbol_name : имя символа, если текущая сканируемая лексема является символом.
message : строка сообщения выводимая в конце предупреждения/ошибки, или NULL.
is_error : если TRUE выводится как ошибка. Если FALSE выводится как предупреждение.

GScannerMsgFunc ()

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

Определяет тип функции обработчика сообщений.

scanner : GScanner.
message : сообщение.
error : TRUE если сообщение означает ошибку, FALSE если оно обозначает предупреждение.

g_scanner_destroy ()

void        g_scanner_destroy               (GScanner *scanner);

Освобождает всю память используемую GScanner.

scanner : GScanner.

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;

Возможные типы лексем возвращаемые из каждого вызова g_scanner_get_next_token().

G_TOKEN_EOF конец файла.
G_TOKEN_LEFT_PAREN символ '('.
G_TOKEN_LEFT_CURLY символ '{'.
G_TOKEN_RIGHT_CURLY символ '}'.

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;

Возможные ошибки, используются в поле v_error GTokenValue, когда лексема равна G_TOKEN_ERROR.

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 некорректное число с плавающей точкой.

G_CSET_a_2_z

#define G_CSET_a_2_z	"abcdefghijklmnopqrstuvwxyz"

Набор алфавитных символов ASCII в нижнем регистре. Используется для определения допустимых идентификаторов символов в GScannerConfig.


G_CSET_A_2_Z

#define G_CSET_A_2_Z	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Набор алфавитных символов ASCII в верхнем регистре. Используется для определения допустимых идентификаторов символов в GScannerConfig.


G_CSET_DIGITS

#define G_CSET_DIGITS	"0123456789"

Набор цифр. Используется для определения допустимых идентификаторов символов в GScannerConfig.


G_CSET_LATINC

#define     G_CSET_LATINC

Набор алфавитных символов ISO 8859-1 в верхнем регистре которые не являются символами ASCII. Используется для определения допустимых идентификаторов символов в GScannerConfig.


G_CSET_LATINS

#define     G_CSET_LATINS

Набор алфавитных символов ISO 8859-1 в нижнем регистре которые не являются символами ASCII. Используется для определения допустимых идентификаторов символов в GScannerConfig.


g_scanner_add_symbol()

#define     g_scanner_add_symbol( scanner, symbol, value )

Внимание

g_scanner_add_symbol устарела начиная с версии 2.2 и не должна использоваться во вновь создаваемом коде. Используйте вместо неё g_scanner_scope_add_symbol().

Добавляет символ к контексту по умолчанию.

scanner : GScanner.
symbol : добавляемый символ.
value : значение символа.

g_scanner_remove_symbol()

#define     g_scanner_remove_symbol( scanner, symbol )

Внимание

g_scanner_remove_symbol устарела начиная с версии 2.2 и не должна использоваться во вновь создаваемом коде. Используйте вместо неё g_scanner_scope_remove_symbol().

Удаляет символ из контекста по умолчанию.

scanner : GScanner.
symbol : удаляемый символ.

g_scanner_foreach_symbol()

#define     g_scanner_foreach_symbol( scanner, func, data )

Внимание

g_scanner_foreach_symbol устарела начиная с версии 2.2 и не должна использоваться во вновь создаваемом коде. Используйте вместо неё g_scanner_scope_foreach_symbol().

Вызываемая функция для каждого символа в контексте по умолчанию.

scanner : GScanner.
func : функция вызываемая для каждого символа.
data : данные помещаемые в функцию.



Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру