Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб окт 24, 2020 05:19

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: разбор сишных структур и перечислений
СообщениеДобавлено: Вс мар 15, 2009 00:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
пока рабочий набросок.

<pre>
\ 24.02.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ (пока набросок) предназначено для разбора Сишных структур

util/ unit.fts

ALSO ROOT HIDDEN DEFINITIONS

string/ c-parser.fts

\ взять значение в перечислении .. = 0x01234 | = ,
: C-eVAL ( --> n )
C-TOKEN S?" ="
IF C-TOKEN c-val C-TOKEN
ELSE L@ -ROT 1 L+
THEN
S?" ," ?EXIT \ , просто пропустить
DDUP S?" }" IF <BACK ;THEN \ } оставить на месте
ERROR" Ошибка в записи перечисления!" ;

0 VALUE с-structures

\ создать константу
: C-ENUM ( l: const d: asc # / expr --> )
[ ALSO UNITS ] (F) [ PREVIOUS ] C-eVAL LIT, [COMPILE] ;F ;

\ найти слово в словаре WS
: SearchIdiom ( asc # --> asc # 0 | xt imm )
DDUP с-structures SEARCH-WORDLIST
*IF DSWAP DDROP ;THEN ;

\ разобрать параметр для #define
: c-expr ( asc # --> n ) \ тут может быть число, а может быть и имя...
SearchIdiom IF ALSO EXECUTE ;THEN c-val LIT, ;

\ разобраться с параметром в [] при определении имнени поля в структуре
: c-idiom ( / ?? --> n )
C-TOKEN c-val \ пока только числа
;

\ создать именованное поле в структуре
: c-field ( off # / fld_name ; --> off )
D>R C-TOKEN [ ALSO UNITS ] (F) [ PREVIOUS ]
C-TOKEN S?" ["
IF c-idiom C-TOKEN S?" ]"
IFNOT ERROR" Не найдена закрывающая ] скобка!" THEN
C-TOKEN S?" ;" IFNOT ERROR" Ожидается ; " THEN
ELSE
S?" ;" IFNOT ERROR" Ожидается ; " THEN
1
THEN
DR> ROT * OVER LIT, + >R COMPILE +
[COMPILE] ;F
R> ;

\ завершить перечисление
: |enum ( flag / ??? ; --> flag )
IF s" /size" \ у перечисления тоже есть размер = int ?
[ ALSO UNITS ] (F) [ PREVIOUS ] CELL LIT, [COMPILE] ;F
RECENT
THEN
C-TOKEN S?" ;" ?EXIT \ если не надо определять тип

S: CELL LIT, COMPILE c-field [COMPILE] ;

\ пока не поддерживаются варианты перечисления
\ все пропускается до ; (оно сильно надо?)
SkipTo;
;

\ разобрать перечисление
: enumerate ( flag --> ) >R
1 >L BEGIN C-TOKEN *WHILE \ пока не конец входного потока
S?" }" IF LDROP R> |enum ;THEN
C-ENUM
REPEAT
ERROR" Перечисление не закончено!" ;

\ взять имя типа поля из входного потока и передать ему управление
: c-struct ( off asc # --> off )
с-structures SEARCH-WORDLIST
IF EXECUTE ;THEN ERROR" Неверное имя типа!" ;

\ разобрать структуру до конца
: analyse ( off flag / ?? --> ) >R
BEGIN C-TOKEN *WHILE
S?" }" WHILENOT
c-struct
REPEAT \ --> off
R> IF >R s" /size"
[ ALSO UNITS ] (F) [ PREVIOUS ] R@ LIT, [COMPILE] ;F
RECENT
ELSE >R
THEN
C-TOKEN S?" ;" IF RDROP ;THEN
S: R> LIT, COMPILE c-field [COMPILE] ;
BEGIN C-TOKEN S?" ;" WHILENOT DDROP REPEAT
EXIT
THEN ERROR" Входной поток неожиданно исчерпан!" ;

USER-CREATE temp 0x100 USER-ALLOT \ временное хранилище для лексемы

ALSO ROOT THIS

Unit: WS

CONTEXT A@ TO с-structures \ vid словаря WS

\ базовый тип поля
: BYTE ( off / expr --> off ) 1 c-field ;

\ разбор сишного перечисления
: enum ( / ??? --> )
C-TOKEN S?" {" \ если скобка , то перечисление не прячется в словарь
IF FALSE
ELSE SearchIdiom
IF DROP C-TOKEN S?" {"
IFNOT S: CELL LIT, COMPILE c-field [COMPILE] ;
SkipTo; RECENT
;THEN
ELSE Sub [ ALSO UNITS ] container [ PREVIOUS ]
ALSO WITH DEFINITIONS
THEN
C-TOKEN S?" {" IFNOT ERROR" Ожидается открывающая скобка!" THEN
TRUE
THEN enumerate RECENT ;

\ разбор сишной структуры
: struct ( / ??? --> )
C-TOKEN S?" {" \ если скобка , то не создается словаря для хранения структуры
IF FALSE
ELSE
Sub [ ALSO UNITS ] container [ PREVIOUS ]
ALSO WITH DEFINITIONS
C-TOKEN S?" {" IFNOT ERROR" Пока не поддерживается!" THEN
TRUE
THEN 0 SWAP analyse RECENT ;

\ коментарий до конца строки
: // ( / bla --> ) [COMPILE] \ ; IMMEDIATE

EndUnit

ROOT DEFINITIONS

\ сделать словарь WS контекстным и текущим,
: typedef ( --> 0 ) [COMPILE] WS DEFINITIONS ;

\ определить константу в словаре WS (вне зависимости
\ от текущего словаря и состояния контекста)
: #define ( / name number --> )
[COMPILE] WS THIS
[ ALSO HIDDEN ] F: NextWord c-expr [COMPILE] ;F [ PREVIOUS ]
DEFINITIONS ;

RECENT
</pre>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 15, 2009 00:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
понимает описания сишных объединений и структур вида:
<pre>

typedef enum { aaa, bbb, ccc };
typedef enum {1st,2st,3st} NUMBS;
typedef enum _nums {first,second,thrid,fourth,fifth,sixth,seventh,eighth,ninth};
typedef enum _nums NUMS ;

и таких:
// определение базовых сишных типов
typedef struct _CHAR {BYTE _off;} CHAR;
typedef struct _WORD {BYTE _off[2];} WORD;
typedef struct _DWORD {BYTE _off[4];} DWORD;
typedef struct _SHORT {BYTE _off[2];} SHORT;

typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;
</pre>
пока не сделал объединения - оно надо?
и нельзя писать
typedef struct aaaa bbbb;
с указателями тоже пока не заморачивался.
выравнивание игнорируется так же (не разбирался каким должно быть)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 15, 2009 00:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
да, для каждой структуры создается собственный словарь в корневом словаре с именем WS , то есть предполагается использовать типа так:

WS _BY_HANDLE_FILE_INFORMATION nFileSizeHigh

от переменной state использование не зависит.
вот.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 15, 2009 21:00 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 289
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
Как-то неуютно на каждую структуры - свой словарь... :shock:
Или это во мне сишник беснуется? :dmad;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 15, 2009 21:11 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
Wlad писал(а):
Как-то неуютно на каждую структуры - свой словарь...
Или это во мне сишник беснуется?

а как иначе. Все упирается в пространства имен. В сях на каждую структуру свое пространство...
по крайней мере в доке по ваткомовскому Си.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 15, 2009 23:21 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 289
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
Да, Вы правы.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 16, 2009 12:15 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Цитата:
string/ c-parser.fts

В последней выложеной сборке этого нет. Что там?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 16, 2009 21:13 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
В последней выложеной сборке этого нет. Что там?

да, пардон, там следующее:
<pre>
\ 27.02.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ парсер Си-шных лексем

ALSO FORTH DEFINITIONS
util/ ufl.fts
util/ numbers.fts
string/ xWord.fts
string/ add.fts
RECENT

\ список разделителей токенов в Си
s" !"#%&'()*+,-./:;<=>?[\\]^{|}~ " Delimiter: c-delimiters

\ взять из входного потока очередной токен
: c-token ( --> asc # )
SkipDelimiters
c-delimiters xWord *IF ;THEN
DROP EndOfChunk IF 0 ;THEN
DUP C# SkipChar ;

\ взять из входного потока очередной токен
: C-TOKEN ( --> asc # )
BEGIN c-token DUP WHILENOT
DROP REFILL *WHILE
DDROP
REPEAT
THEN ;

\ определить систему счисления в которой записано число
: ?c-base ( asc # --> asc # base )
OVER C@ [CHAR] 0 =
IFNOT 0x0A
ELSE SKIP1
OVER C@ [CHAR] x [CHAR] X OneOf
IF SKIP1 0x10
ELSE 0x08
THEN
THEN ;

\ удалить буквы U L LL UL в конце строки
: ?suffix ( asc # --> asc # )
DDUP + <C C@ [CHAR] F > + \ любой символ больше 'F' удаляется
DDUP + <C C@ [CHAR] F > + ;

\ распознать число согласно Си-шным правилам: 1234 01234 0x1234
: c-val ( asc # --> n )
?suffix ?SIGN >L ?c-base S>VAL \ --> ud flag
IFNOT ERROR" Число записано неверно!" THEN
ABORT" Слишком большое число!"
L> IF NEGATE THEN ;

\ пропустить все лексемы вплодь до первой встречи символа ';' включая последний
: SkipTo; ( / ???; --> ) BEGIN C-TOKEN s" ;" S?= WHILENOT DDROP REPEAT ;
</pre>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 11:02 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Цитата:
да, пардон, там следующее:

Ага ок.
Еще маленькое соображение.
Все слова которые возникнут в результате обработки си-шных файлов надо использовать только во время компиляции. То есть они должны быть во временном словаре, а то их будет очень много лишних.
С #define все понятно, а вот как быть с полями структур?

Еще замечание
Цитата:
: #define ( / name number --> ) ...

Вообще то : #define это макрос заменяющий один текст другим.
То есть на си будет правильно :
Код:
#define lalala  x=(a + b )/c -4559
Если конечно компилятор знает x a b c.
Хотя чаще всего так определяются константы.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 16:28 
Не в сети
Аватара пользователя

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
_Harry писал(а):
Вообще то : #define это макрос заменяющий один текст другим.

я даже скажу больше, #define обрабатывает поток лексем (как они видны компилятору),
поэтому внутри аргументов могут быть запятые

вот этот код вполне корректен:

Код:
#define x(a,b,c) a; b; c

main()
{
x(func(1,2,3),{1.2;(4,5)},func(",,,\n"); func(1,2,(2,3,4),3);)
}


с точки зрения препроцессора тут 3 аргумента:
    1) func(1,2,3)
    2) {1.2;(4,5)}
    3) func(",,,\n"); func(1,2,(2,3,4),3);


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 17:27 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
garbler
Во во и что с этим "богатством синтаксиса" делать
:^)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 20:33 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
Еще маленькое соображение.

Все слова которые возникнут в результате обработки си-шных файлов надо использовать только во время компиляции. То есть они должны быть во временном словаре, а то их будет очень много лишних.

ну, вобщем да, с другой стороны на это можно не обращать внимания.
я же пока застрял на объединениях - не сложно, а скорее нудно потому что.

_Harry писал(а):
Еще замечание
Цитата:: #define ( / name number --> ) ...
Вообще то : #define это макрос заменяющий один текст другим.
То есть на си будет правильно :
Код:#define lalala  x=(a + b )/c -4559 Если конечно компилятор знает x a b c.
Хотя чаще всего так определяются константы.

вы правы. получается, что надо весь Си писать (точнее транслятор Си2Форт), что очень лень.
другой выход - делать только часть поддержки, то есть оставлять ручную работу но, облегчать ее, собственно попытка чего и сделана.
Но, пока совсем не ясно как быть с выравниванием (там много особых случаев может быть, которые могут не быть описаны, ну к примеру, байтовые поля не выравниваются, если их 4, или они сами выравнивают значение после себя.)

_Harry писал(а):
Во во и что с этим "богатством синтаксиса" делать

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 20:55 
Не в сети
Аватара пользователя

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
пока не сделал объединения - оно надо?
и нельзя писать
typedef struct aaaa bbbb;
с указателями тоже пока не заморачивался.
выравнивание игнорируется так же (не разбирался каким должно быть)


в Си ещё битовые поля есть (и они даже используются частенько):
Код:
typedef struct _LDT_ENTRY {
    WORD    LimitLow;
    WORD    BaseLow;
    union {
        struct {
            BYTE    BaseMid;
            BYTE    Flags1;     // Declare as bytes to avoid alignment
            BYTE    Flags2;     // Problems.
            BYTE    BaseHi;
        } Bytes;
        struct {
            DWORD   BaseMid : 8;
            DWORD   Type : 5;
            DWORD   Dpl : 2;
            DWORD   Pres : 1;
            DWORD   LimitHi : 4;
            DWORD   Sys : 1;
            DWORD   Reserved_0 : 1;
            DWORD   Default_Big : 1;
            DWORD   Granularity : 1;
            DWORD   BaseHi : 8;
        } Bits;
    } HighWord;
} LDT_ENTRY, *PLDT_ENTRY;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 21:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5016
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 21 раз.
Поблагодарили: 58 раз.
garbler писал(а):
в Си ещё битовые поля есть (и они даже используются частенько):

угу, еще и эта радость 8(

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 17, 2009 22:42 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
garbler писал(а):
_Harry писал(а):
Вообще то : #define это макрос заменяющий один текст другим.

я даже скажу больше, #define обрабатывает поток лексем (как они видны компилятору),
поэтому внутри аргументов могут быть запятые

Не забываем также об возможности определения "символических переменных"


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB