Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 17:36

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: размышления по поводу парсера
СообщениеДобавлено: Чт окт 04, 2007 01:09 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
У стандартного парсера (любого форта, в том числе и СПФ) есть один неприятный недостаток - он работает с фиксированными переменными TIB #TIB >IN которые необходимо сохранять, для случаев, когда нужно прервать текущий разбор, и восстанавливать, когда необходимо его продолжить:
Код:
    2>R SAVE-SOURCE      \ сохраняем состояние текущего потока
    2R> SOURCE!          \ устанавливаем текущий поток на нужный текст
    .. some work ..      \ тут обрабатываем стандартный поток
    RESTORE-SOURCE       \ восстанавливаем поток
(пример для СПФ).

Так как форт-система является открытой, и есть практика использования структур интерпретатора для написания своих программ, стоит следить за применимостью каждого из используемых слов для других применений.
В свое время Андрей Черезов написал свой вариант парсера http://www.forth.org.ru/~ac/rationale/forth.txt, более полезного, чем стандартный, использующий слова WORD и PARSE. (За исключением пары слов: OnDelimiter и OnNotDelimiter, которые я не считаю удачными 8)
Но имеет таки один недостаток - данный набор слов слабо применим для использования его вне пределов стандартного потока ввода, так как достаточно неудобно для каждого действия сохранять и принудительно восстанавливать указанные выше переменные.

Что предлагаю я. Сделать парсер независимым от форт-системы на сколько это возможно.
(имена специально не пересекаются со стандартными)
<pre>
\ 02-10-2007 mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ парсер

REQUIRE ADDR devel\~moleg\lib\util\addr.f
REQUIRE IFNOT devel\~moleg\lib\util\ifnot.f

?DEFINED char 1 CHARS VALUE char \ на всякий случай
?DEFINED OFF : OFF 0! ;

\ ------------------------------------------------------------------------------

VOCABULARY parser
ALSO parser DEFINITIONS

0 \ структура-описатель разбираемого текста
ADDR -- off_buffer \ адрес начала буфера
CELL -- off_scope \ размер разбираемого текста
CELL -- off_position \ текущая позиция разбора
CONSTANT /src

\ инициализировать разбор строки √
\ нужно указать строку, и адрес начала записи, где будет храниться промежуточная
\ информация для разбора.
: consider ( asc # 'src --> src )
TUCK off_scope !
TUCK off_buffer A!
off_position OFF ;

\ вернуть адрес начала разбираемого текста и его длину √
: content ( src --> addr u ) DUP off_buffer A@ SWAP off_scope @ ;

\ вернуть адрес первого неразобранного символа √
: viewpoint ( src --> addr ) DUP off_buffer A@ SWAP off_position @ + ;

\ вернуть TRUE если весь текст уже разобран √
: ?complete ( src --> flag ) DUP off_scope @ SWAP off_position @ > INVERT ;

\ посмотреть на текущий разбираемый символ √
: PeekOne ( src --> char ) viewpoint C@ ;

\ сместить указатель первого неразобранного символа на одну позицию влево √
: MissOne ( src --> )
DUP off_position @ char + OVER off_scope @ MIN SWAP off_position ! ;

\ взять очередной неразобранный символ, вернуть TRUE, если буфер не пуст √
: NextOne ( src --> char flag ) DUP ?complete OVER PeekOne ROT MissOne SWAP ;

\ получить текущий символ, вернуть флаг его актуальности √
: present ( src --> char flag )
DUP ?complete
IF FALSE
ELSE PeekOne TRUE
THEN ;

\ что считать разделителем еще большой вопрос
: ?separator ( char --> flag ) BL > INVERT ;

\ пропустить все символы разделители до первого значащего символа,
\ либо до конца разбираемой строки
: MissSeparators ( src --> )
BEGIN DUP present WHILE
?separator WHILE
DUP MissOne
REPEAT DROP EXIT
THEN 2DROP ;

\ пропустить текст вплодь до разделителя
: MissLexeme ( src --> )
BEGIN DUP present WHILE
?separator WHILENOT
DUP MissOne
REPEAT DROP EXIT
THEN 2DROP ;

\ выделить из буфера блок символов вплоть до разделителя
: PassLexeme ( src --> asc # )
DUP >R viewpoint
R@ off_position @
R@ MissLexeme
R> off_position @ - NEGATE ;

\ получить очередную лексему
: lexeme ( src --> asc # ) DUP MissSeparators PassLexeme ;

\ пропустить символы вплоть до первого встреченного char
: misstill ( src char --> )
BEGIN OVER present WHILE
OVER <> WHILE
OVER MissOne
REPEAT 2DROP EXIT
THEN 2DROP DROP ;

\ взять часть строки от первого неразобранного символа до первого символа char,
\ либо до конца строки, если char не встретится.
: piece ( src char --> asc # )
OVER viewpoint -ROT
OVER >R misstill
R@ viewpoint OVER -
R> MissOne ;

</pre>

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
и дальше совместимость со стандартным парсером:
<pre>
USER-CREATE system_buff /src USER-ALLOT

: TIB ( --> addr ) system_buff off_buffer A@ ;
: TIB# ( --> addr ) system_buff off_scope ;
: >IN ( --> addr ) system_buff off_position ;

\ вернуть адрес и длинну входного буфера
: SOURCE ( --> asc # ) system_buff content ;

\ установить asc # входным буфером
\ (точнее, областью разбора - PARSE-AREA)
: SOURCE! ( asc # --> ) system_buff consider ;

\ достигнут ли конец TIB ?
: EndOfChunk ( --> flag ) system_buff ?complete ;

\ адрес первой непроинтерпретированного символа
: CharAddr ( --> addr ) system_buff viewpoint ;

\ прочесть символ из текущего значения >IN
: PeekChar ( --> char ) system_buff PeekOne ;

\ является ли символ char пробельным
: IsDelimiter ( char --> flag ) ?separator ;

\ извлечь очередной символ из входного потока
: GetChar ( --> char flag ) system_buff present ;

\ пропустить один символ во входном потоке
: SkipChar ( --> ) system_buff MissOne ;

\ взять очередной символ из входного потока √
\ flag = TRUE если входной поток исчерпан
: NextChar ( --> char flag ) system_buff NextOne ;

\ пропустить пробельные символы
: SkipDelimiters ( --> ) system_buff MissSeparators ;

\ пропустить непробельные символы
: SkipWord ( --> ) system_buff MissLexeme ;

\ пропустить до символа char
: SkipUpTo ( char --> ) system_buff SWAP misstill ;

\ выделить строку до первого пробельного символа во входном потоке
\ результирующую строку вернуть в виде asc #
: ParseWord ( --> asc # ) system_buff PassLexeme ;

\ это слово теперь будем использовать в INTERPRET
\ - удобнее: не использует WORD и, соответственно, не мусорит в HERE;
\ и разделителями считает все что <=BL, в том числе TAB и CRLF
: NextWord ( --> asc # ) system_buff lexeme ;

\ получить строку из входного буфера, ограниченную символом char
: PARSE ( char / asc <char> --> asc # ) system_buff SWAP piece ;

</pre>

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ответ на цитату из irq-а
<pre> [true-grue] С одной стороы "1 CHARS VALUE char", а с другой "BL > INVERT" :) </pre>

да. Так и есть. В юникодах, "пробельные символы" находятся в нулевой странице. То есть данный код
будет работать и на юникоде 8) (судя по его, юникода, описанию )

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


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

Фраза, выдранная из лога IRC, намекала на непоследовательность принятого решения. О кодировках и Юникоде можно прочесть во множестве открытых источников. В данном случае, особое внимание предлагается обратить на термин Byte Order Mark (BOM).


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
true-grue писал(а):
ответ на цитату из форума
Фраза, выдранная из лога IRC, намекала на непоследовательность принятого решения. О кодировках и Юникоде можно прочесть во множестве открытых источников. В данном случае, особое внимание предлагается обратить на термин Byte Order Mark (BOM).


не обязательно на этом уровне необходимо решать BOM 8) по-моему гораздо логичнее это делать на уровне C@ C! 8)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 26, 2007 05:22 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
продолжаем размышления:
Код:
\ 02-10-2007 mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ новый парсер

REQUIRE ADDR     devel\~moleg\lib\util\addr.f
REQUIRE IFNOT    devel\~moleg\lib\util\ifnot.f
REQUIRE ROUND    devel\~moleg\lib\util\stackadd.f
REQUIRE B@       devel\~mOleg\lib\util\bytes.f

?DEFINED OFF   : OFF ( addr --> ) 0! ;
?DEFINED ON    : ON  ( addr --> ) -1 SWAP ! ;
?DEFINED \?    : \?  [COMPILE] \ ; IMMEDIATE

VOCABULARY parser  ALSO parser DEFINITIONS  \ на время отладки в другой словарь
\ ------------------------------------------------------------------------------

  0 \ структура-описатель разбираемого текста
    CELL -- off_scope    \ размер разбираемого текста
    CELL -- off_position \ текущая позиция разбора
    ADDR -- off_buffer   \ адрес начала буфера
    ADDR -- off_char@    \ метод извлечения символа
    ADDR -- off_char+    \ метод смещения к следующему символу
  CONSTANT /source


\ методика работы с iso потоком:

\ на один символ влево
: (1char+) ( addr --> addr++ ) 1 + ;

\ извлечь символ
: (1char@) ( addr --> char ) B@ ;

\ вернуть указатели на (1char+) (1char@) годные, для работы с символами
\ в iso кодировке
: iso-stream ( --> 'char@ 'char+ ) ['] (1char@) ['] (1char+) ;

\ методика работы с utf-8 потоком:

CREATE utf8cnt \ табличка для определения длины символа в utf8 кодировке
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B, 0x01 B,
           0x02 B, 0x02 B, 0x02 B, 0x02 B, 0x02 B, 0x02 B, 0x02 B, 0x02 B,
           0x03 B, 0x03 B, 0x03 B, 0x03 B, 0x04 B, 0x04 B, 0x05 B, 0x06 B,

\ определить длину символа.
\ на входе адрес, где символ лежит, на выходе его длина
: (8char#) ( addr --> # ) B@ 2 RSHIFT [ utf8cnt ] LITERAL + B@ ;

\ увеличить адрес на величину, равную размеру одного символа
\ символ находится по указанному адресу!
: (8char+) ( addr --> addr++ ) DUP (8char#) + ;

CREATE utf8hdr \ маска для выделения данных из первого байта
               0x7F B, 0x3F B, 0x1F B, 0x0F B, 0x07 B, 0x03 B, 0x01 B,

\ извлечь символ из указанной позиции.
\ на входе адрес, по которому хранится символ,
\ на выходе его 32 битное значение
: (8char@) ( 'char --> char )
           DUP B@ DUP 0x80 < IF NIP EXIT THEN
           OVER (8char#) [ utf8hdr ] LITERAL + B@ AND
           BEGIN SWAP 1 + TUCK
                 B@ DUP 0xC0 AND 0x80 = WHILE
                 0x3F AND  SWAP 6 LSHIFT  OR
           REPEAT DROP NIP ;

\ вернуть указатели на (8char+) (8char@) годные, для работы с символами
\ в utf8 кодировке
: utf8-stream ( --> 'char@ 'char+ ) ['] (8char@) ['] (8char+) ;

\ тип потока предполагается определять во время инициализации:
\  utf8-stream 'stream set-type
\ или
\  iso-stream 'stream set-type
\ и так далее.

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

\ установить методики: извлечения символа из потока, приращения символа
\ для указанного потока src
: set-type ( 'char@ 'char+ src --> ) TUCK off_char+ A! off_char@ A! ;

\ увеличить указатель addr на величину одного символа.
: CHAR+ ( addr src --> char+ ) off_char+ @ EXECUTE ;

\ извлечь символ c указанного addr в src потоке.
: CHAR@ ( addr src --> 32_bit_char ) off_char@ @ EXECUTE ;

\ --------------------------------------------------------------------------

\ инициализировать разбор строки √
\ нужно указать строку, и адрес начала записи, где будет храниться промежуточная
\ информация для разбора.
: CONSIDER ( asc # 'src --> )
           TUCK off_scope !
           TUCK off_buffer A!
           off_position OFF ;

\ вернуть адрес начала разбираемого текста и его длину √
: CONTENT ( src --> addr u ) DUP off_buffer A@ SWAP off_scope @ ;

\ вернуть адрес первого неразобранного символа √
: viewpoint ( src --> addr ) DUP off_buffer A@ SWAP off_position @ + ;

\ вернуть TRUE если весь текст уже разобран √
: ?complete ( src --> flag ) DUP off_scope @ SWAP off_position @ > INVERT ;

\ посмотреть на текущий разбираемый символ √
: PeekOne ( src --> char ) DUP viewpoint SWAP CHAR@ ;

\ сместить указатель первого неразобранного символа на одну позицию влево √
: MissOne ( src --> )
          DUP off_position @
          OVER CHAR+
          OVER off_scope @ MIN
          SWAP off_position ! ;

\ взять очередной неразобранный символ, вернуть TRUE, если буфер не пуст √
: NextOne ( src --> char flag ) DUP ?complete OVER PeekOne ROT MissOne SWAP ;

\ получить текущий символ, вернуть флаг его актуальности √
: present ( src --> char flag )
          DUP ?complete
          IF FALSE
           ELSE PeekOne TRUE
          THEN ;

\ что считать разделителем еще большой вопрос
: ?separator ( char --> flag ) BL > INVERT ;

\ пропустить все символы разделители до первого значащего символа,
\ либо до конца разбираемой строки
: MissSeparators ( src --> )
                 BEGIN DUP present WHILE
                       ?separator WHILE
                       DUP MissOne
                   REPEAT DROP EXIT
                 THEN 2DROP ;

\ пропустить текст вплодь до разделителя
: MissLexeme ( src --> )
             BEGIN DUP present WHILE
                   ?separator WHILENOT
                   DUP MissOne
               REPEAT DROP EXIT
             THEN 2DROP ;

\ выделить из буфера блок символов вплоть до разделителя
: PassLexeme ( src --> asc # )
             DUP >R viewpoint
                 R@ off_position @
                 R@ MissLexeme
                 R> off_position @ - NEGATE ;

\ получить очередную лексему
: lexeme ( src --> asc # ) DUP MissSeparators PassLexeme ;

\ пропустить символы вплоть до первого встреченного char
: misstill ( src char --> )
           BEGIN OVER present WHILE
                 OVER <> WHILE
                 OVER MissOne
             REPEAT 2DROP EXIT
           THEN 2DROP DROP ;

\ взять часть строки от первого неразобранного символа до первого символа char,
\ либо до конца строки, если char не встретится.
: piece ( src char --> asc # )
        OVER viewpoint -ROT
        OVER >R misstill
        R@ viewpoint OVER -
        R> MissOne ;


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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 26, 2007 20:45 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А как это будет работать, если разбираемый текст больше размера буфера? Особенно возле границы буфера?

Я для себя еще не придумал корректную и более-менее красивую реализацию. Мне нигде не попадался анализ поведения разбора вблизи границ буфера. Обычно это скромно умалчивается... ;)

_________________
With best wishes, in4.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
in4 писал(а):
А как это будет работать, если разбираемый текст больше размера буфера? Особенно возле границы буфера?

а это уже проблемы слова REFILL.

in4 писал(а):
Я для себя еще не придумал корректную и более-менее красивую реализацию. Мне нигде не попадался анализ поведения разбора вблизи границ буфера. Обычно это скромно умалчивается...

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

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


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Я сейчас обрезаю по ближайшему концу строки. SPF, вроде, тоже.
Это значит, что все трюки предобработки д.б. ограничены одной строкой... :(
А хотелось бы иметь плавающее окно на файл... ;)

_________________
With best wishes, in4.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
in4 писал(а):
Я сейчас обрезаю по ближайшему концу строки. SPF, вроде, тоже.
Это значит, что все трюки предобработки д.б. ограничены одной строкой...

причем некоторые слова заточены именно под такую реализацию!
например, нельзя загрузить исходный файл в буфер, и сказать EVALUATE , так как
первое же слово \ скипанет все содержимое файла.
Есть и другие такие слова (я имею ввиду спф, например в СМАЛ32 этой проблемы небыло!)
in4 писал(а):
А хотелось бы иметь плавающее окно на файл...

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

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


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
in4 писал(а):
А хотелось бы иметь плавающее окно на файл...
а что, предполагаются гигабайтные исходники?

Нет, предполагается очень маленькое окно для файлового буфера - в микроконтроллере и/или в ВМ... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 28, 2007 01:25 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
in4 писал(а):
Я для себя еще не придумал корректную и более-менее красивую реализацию. Мне нигде не попадался анализ поведения разбора вблизи границ буфера. Обычно это скромно умалчивается...

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

Хм. есть языки, в которых присутствует ограничение на длину строки ... Что не позволяет тут сделать так?

_________________
понимаю некоторую бестолковость некоторых вопросов


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

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

Нет, предполагается очень маленькое окно для файлового буфера - в микроконтроллере и/или в ВМ...

тогда зачем тебе юникод?
вполне хватит обычного для форта WORD, реализованного как примитив, либо же PARSE, тоже в виде примитива.

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


Последний раз редактировалось mOleg Ср ноя 28, 2007 22:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 28, 2007 12:05 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
вопрос писал(а):
Хм. есть языки, в которых присутствует ограничение на длину строки ... Что не позволяет тут сделать так?

Дело в том, что в текстовом файле хранятся строки разной длины подряд.
И для того, чтобы корректно обрабатывать текст построчно нужно либо копировать часть последней строки в начало буфера, либо перемещать указатель файла до начала последней строки (я так и делаю).
А если нужно отмотать назад несколько строк - начинаются проблемы. И они усугубляются, если нужно отматывать больше, чем размер буфера.

Аналогичная проблема возникает, если нужно сохранить файловый контекст - например при INCLUDE(D). Приходится отматывать текущий файл на начало буфера - вычислять, где это самое начало буфера с учетом, что файловый указатель некратен размеру буфера и уже был отмотан после коррекции файлового указателя последним чтением буфера.
Если у кого-то есть красивое решение такого чтения - мне интересно!

mOleg писал(а):
вполне хватит обычного для форта WORD

WORD устарело и уже не катит в современных системах.
Для парсинга я обычно использую
Код:
: blsp  bl skip parse ;

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 28, 2007 14:24 
Цитата:
А если нужно отмотать назад несколько строк - начинаются проблемы.

А зачем это бывает нужно?


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

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


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

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


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

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