Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
_Harry писал(а): Вот во что в итоге превратился #define ну, в общем не страшно.
[quote="_Harry"]Вот во что в итоге превратился #define[/quote] ну, в общем не страшно.
|
|
|
|
Добавлено: Ср авг 18, 2010 18:30 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
_Harry писал(а): Очень распространеная вещь тогда надо в #define парсить строку до конца, и разбирать ее отдельно так же глянь на слова \ найти начало текущей строки : <EOL ( start end --> addr ) \ найти начало следующей строки \ в случае ненахождения возвращает адрес последнего символа строки : EOL> ( start end --> addr ) лежат в kernel\compiler\parseradd.f
[quote="_Harry"]Очень распространеная вещь[/quote] тогда надо в #define парсить строку до конца, и разбирать ее отдельно
так же глянь на слова \ найти начало текущей строки : <EOL ( start end --> addr ) \ найти начало следующей строки \ в случае ненахождения возвращает адрес последнего символа строки : EOL> ( start end --> addr )
лежат в kernel\compiler\parseradd.f
|
|
|
|
Добавлено: Ср авг 18, 2010 18:29 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
Код: ALSO HIDDEN
\ Пропустить символ Lf во входном буфере : SkipLf ( -- ) CharAddr C@ Lf_ = IF system_buff MissOne THEN ;
\ Неполный! аналог Си-шного #define \ создает слово /name которое при вызове выдает на стек адрес и длину \ строки /expression ( макросы не поддерживаются ) : #define ( /name /expression -- ) NextWord s" (" SEARCH ABORT" Макросы не поддерживаются!" CREATED CharAddr <C C@ Cr_ = IF SkipLf CharAddr 0 ELSE Cr_ PARSE /*...*/ _//! THEN S", IMMEDIATE DOES> ( -- asc # ) COUNT ; \ С коментариями разбираемся перед сохранением строки что вобщем не соответсвует Си \ но так лучше.
PREVIOUS Вот во что в итоге превратился #define
[code]ALSO HIDDEN
\ Пропустить символ Lf во входном буфере : SkipLf ( -- ) CharAddr C@ Lf_ = IF system_buff MissOne THEN ;
\ Неполный! аналог Си-шного #define \ создает слово /name которое при вызове выдает на стек адрес и длину \ строки /expression ( макросы не поддерживаются ) : #define ( /name /expression -- ) NextWord s" (" SEARCH ABORT" Макросы не поддерживаются!" CREATED CharAddr <C C@ Cr_ = IF SkipLf CharAddr 0 ELSE Cr_ PARSE /*...*/ _//! THEN S", IMMEDIATE DOES> ( -- asc # ) COUNT ; \ С коментариями разбираемся перед сохранением строки что вобщем не соответсвует Си \ но так лучше.
PREVIOUS[/code] Вот во что в итоге превратился #define :(
|
|
|
|
Добавлено: Ср авг 18, 2010 18:08 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
mOleg писал(а): я лично не могу представить почему у тебя получается обсуждаемая проблема. Потому что это не форт а Си (не к ночи будь помянут...) Код: #define __name__ #ifdef __name__ ... ... #else ... ... #endif Очень распространеная вещь Просто определяется то или иное имя без соответствующей строки. и используется для условной компиляции.
[quote="mOleg"]я лично не могу представить почему у тебя получается обсуждаемая проблема.[/quote]Потому что это не форт а Си :evil: (не к ночи будь помянут...) [code]#define __name__ #ifdef __name__ ... ... #else ... ... #endif[/code]Очень распространеная вещь Просто определяется то или иное имя без соответствующей строки. и используется для условной компиляции.
|
|
|
|
Добавлено: Ср авг 18, 2010 18:04 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
_Harry писал(а): Хм ну да все вроде так но какой то неприятный "осадок" от этого остается. ну, осадка быть не должно, по крайней мере альтернативное поведение разбора будет гораздо хуже, т.к. в куче мест придется править привычный сложившийся код, причем, поведение ведь вполне логичное, я лично не могу представить почему у тебя получается обсуждаемая проблема.
[quote="_Harry"]Хм ну да все вроде так но какой то неприятный "осадок" от этого остается.[/quote] ну, осадка быть не должно, по крайней мере альтернативное поведение разбора будет гораздо хуже, т.к. в куче мест придется править привычный сложившийся код, причем, поведение ведь вполне логичное, я лично не могу представить почему у тебя получается обсуждаемая проблема.
|
|
|
|
Добавлено: Ср авг 18, 2010 15:23 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
mOleg писал(а): Вобщем, это не баг - это фича Хм ну да все вроде так но какой то неприятный "осадок" от этого остается. mOleg писал(а): в данном случае можно так: CharAddr <C C@ Cr_ = IF ." пустая строка" ELSE ." непустая строка" THEN Попробую так
[quote="mOleg"]Вобщем, это не баг - это фича [/quote]Хм ну да все вроде так но какой то неприятный "осадок" от этого остается.
[quote="mOleg"]в данном случае можно так: CharAddr <C C@ Cr_ = IF ." пустая строка" ELSE ." непустая строка" THEN [/quote]Попробую так
|
|
|
|
Добавлено: Ср авг 18, 2010 15:05 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
_Harry писал(а): А его на самом деле нет и поэтому переход на следующую строкуперескакивает т.е. находится на 1 строку позже см. пример выше. это не проблема, точнее надуманная проблема. Реально, либо сначала ищется конец строки и потом отдельно "разбирается строка", такие примеры в форке есть, либо после PARSE (либо использующего PARSE слова) находится хотя бы одна лексема. _Harry писал(а): mOleg писал(а):за PARSE оставлять хотя бы пробел Ну да а редактор их удалит и правильно сделает да, это так, можно защищаться от редактирования таким образом _Harry писал(а): Ну а Cr_ значит самому удалять кстати его может и не быть т.е.надо еще и проверку делать удалять не надо ничего. Собственно, я так понимаю, ты хочешь, чтобы у тебя текст типа: #define bla #define lala something не приводил к "побочному эффекту"? в данном случае можно так: CharAddr <C C@ Cr_ = IF ." пустая строка" ELSE ." непустая строка" THEN _Harry писал(а): А в описании об этом сказано?Помоему это пример "плохой автоматики"! Почему собственно надо пропускать первый символ? Нет, но я и не видел, чтобы где-нибудь это было описано Тем не менее замечание правильное, дополнения в доку внесу. а вообще естественно: ты выбираешь строку до указанного разделителя, после чего, разделитель тебе уже не нужен, возьми тот же пример с ." " ,где [CHAR] " PARSE если бы PARSE не пропускало разделительную " , то дальше бы вылазила ошибка. Вобщем, это не баг - это фича
[quote="_Harry"]А его на самом деле нет и поэтому переход на следующую строкуперескакивает т.е. находится на 1 строку позже см. пример выше.[/quote] это не проблема, точнее надуманная проблема. Реально, либо сначала ищется конец строки и потом отдельно "разбирается строка", такие примеры в форке есть, либо после PARSE (либо использующего PARSE слова) находится хотя бы одна лексема.
[quote="_Harry"]mOleg писал(а):за PARSE оставлять хотя бы пробел Ну да а редактор их удалит и правильно сделает [/quote] да, это так, можно защищаться от редактирования таким образом ;)
[quote="_Harry"]Ну а Cr_ значит самому удалять кстати его может и не быть т.е.надо еще и проверку делать[/quote] удалять не надо ничего. Собственно, я так понимаю, ты хочешь, чтобы у тебя текст типа:
#define bla #define lala something не приводил к "побочному эффекту"? в данном случае можно так: CharAddr <C C@ Cr_ = IF ." пустая строка" ELSE ." непустая строка" THEN
[quote="_Harry"]А в описании об этом сказано?Помоему это пример "плохой автоматики"! Почему собственно надо пропускать первый символ?[/quote] Нет, но я и не видел, чтобы где-нибудь это было описано 8) Тем не менее замечание правильное, дополнения в доку внесу. а вообще естественно: ты выбираешь строку до указанного разделителя, после чего, разделитель тебе уже не нужен, возьми тот же пример с ." " ,где [CHAR] " PARSE если бы PARSE не пропускало разделительную " , то дальше бы вылазила ошибка. Вобщем, это не баг - это фича ;)
|
|
|
|
Добавлено: Ср авг 18, 2010 09:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
вопрос писал(а): Не пойму в чём проблема mOleg писал(а): следующий за PARSE символ (символ разделитель) автоматически пропускается. А его на самом деле нет и поэтому переход на следующую строку перескакивает т.е. находится на 1 строку позже см. пример выше.
[quote="вопрос"]Не пойму в чём проблема[/quote] [quote="mOleg"]следующий за PARSE символ (символ разделитель) автоматически пропускается.[/quote]А его на самом деле нет и поэтому переход на следующую строку перескакивает т.е. находится на 1 строку позже см. пример выше.
|
|
|
|
Добавлено: Ср авг 18, 2010 03:00 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
Не пойму в чём проблема - перенос строки не рассматривается как разделитель?
Не пойму в чём проблема - перенос строки не рассматривается как разделитель?
|
|
|
|
Добавлено: Ср авг 18, 2010 00:27 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
mOleg писал(а): за PARSE оставлять хотя бы пробел Ну да а редактор их удалит и правильно сделает mOleg писал(а): достаточно написать Lf_ PARSE Ну а Cr_ значит самому удалять кстати его может и не быть т.е. надо еще и проверку делать Ну только как обходной вариант пойдет. mOleg писал(а): дело в том, что следующий за PARSE символ (символ разделитель) автоматически пропускается. Это действительно для всех фортов, А в описании об этом сказано?Помоему это пример "плохой автоматики"! Почему собственно надо пропускать первый символ? mOleg писал(а): так что исправлять нечего Как минимум надо поправить описание PARSE. Ну или привести в соответствие с описанием поведение.
[quote="mOleg"]за PARSE оставлять хотя бы пробел [/quote] Ну да а редактор их удалит и правильно сделает 8) [quote="mOleg"]достаточно написать Lf_ PARSE[/quote]Ну а Cr_ значит самому удалять кстати его может и не быть т.е. надо еще и проверку делать :roll: Ну только как обходной вариант пойдет. :roll: [quote="mOleg"]дело в том, что следующий за PARSE символ (символ разделитель) автоматически пропускается. Это действительно для всех фортов, [/quote][u]А в описании об этом сказано?[/u] Помоему это пример "плохой автоматики"! Почему собственно надо пропускать первый символ?
[quote="mOleg"]так что исправлять нечего [/quote]Как минимум надо поправить описание PARSE. Ну или привести в соответствие с описанием поведение.
|
|
|
|
Добавлено: Вт авг 17, 2010 23:55 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
_Harry писал(а): Перепрыгивает на другую строкуи дает строку такую же как - s" \rtest"Надо как то поправить достаточно написать Lf_ PARSE дело в том, что следующий за PARSE символ (символ разделитель) автоматически пропускается. Это действительно для всех фортов, так что исправлять нечего (правда, отличие будет в том, что текст загружается обычно построчно, в форке же он целиком в памяти). Либо, как вариант, за PARSE оставлять хотя бы пробел
[quote="_Harry"]Перепрыгивает на другую строкуи дает строку такую же как - s" \rtest"Надо как то поправить[/quote] достаточно написать Lf_ PARSE
дело в том, что следующий за PARSE символ (символ разделитель) автоматически пропускается. Это действительно для всех фортов, так что исправлять нечего (правда, отличие будет в том, что текст загружается обычно построчно, в форке же он целиком в памяти). Либо, как вариант, за PARSE оставлять хотя бы пробел ;)
|
|
|
|
Добавлено: Вт авг 17, 2010 19:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: Дополнения, изменения, ошибки. |
|
|
Если транслируется файл Код: Cr_ PARSE test Перепрыгивает на другую строку и дает строку такую же как - s" \rtest"Надо как то поправить
Если транслируется файл [code]Cr_ PARSE test[/code] Перепрыгивает на другую строку и дает строку такую же как - [b][color=#00BF00]s" \rtest"[/color][/b] Надо как то поправить
|
|
|
|
Добавлено: Вт авг 17, 2010 18:03 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
ок, обязательно посмотрю.
сейчас уже много правок от последней версии, при первой возможности выложу
пока туго с инетом...
да, когда один операнд перед операцией а другой после, то называется это инфиксной, если перед, как в лиспе, то префиксной, а если после, как обычно, то постфиксной.
ок, обязательно посмотрю.
сейчас уже много правок от последней версии, при первой возможности выложу 8)
пока туго с инетом...
да, когда один операнд перед операцией а другой после, то называется это инфиксной, если перед, как в лиспе, то префиксной, а если после, как обычно, то постфиксной.
|
|
|
|
Добавлено: Пт ноя 06, 2009 11:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ошибка в samples
pp2.fts - \ 19.02.2009 ~mOleg
\ æopyright [C] 2009 mOleg mininoleg@yahoo.com
\ преобразование префиксной (не инфиксной?) записи в постфиксную
запускаем форк
Код: mOleg kernel fork(mininoleg@yahoo.com). build from SPF4.17 sources. windows Version 4.09 Build 926 at 01.Nov.2009
fork.ini included
FORTH(0)>samples/pp2.fts
a+b+c+d == a b + c + d + a+ b+c+d == a b + c + d + a +b+c+d == a b + c + d + a + b+c+d == a b + c + d + (a+b+c)+d == a b + c + d + a+(b+c)+d == a b c + + d + a=b+c*d&e == a b c d e AND * + = a&b*c+d=e == a b AND c * d + e = a:b+(c*d) == a b c d * + ! [base+index*n]>0 == base index n * + @ 0 > Ok FORTH(0)> Ok FORTH(0)>expr a + b * ( a * ( c + d ) ) a + b * ( a * ( c + d ) ) == a b a c d + * Ok FORTH(0)>
Как видим, собственные тесты код проходит благополучно, а на введенной вручную формуле спотыкается
expr a + b * ( a * ( c + d ) ) a + b * ( a * ( c + d ) ) == a b a c d + * Ok
теряются все операторы за скобками
Ошибка в samples
pp2.fts - \ 19.02.2009 ~mOleg
\ æopyright [C] 2009 mOleg mininoleg@yahoo.com
\ преобразование префиксной [i](не инфиксной?)[/i] записи в постфиксную
запускаем форк
[code]mOleg kernel fork(mininoleg@yahoo.com). build from SPF4.17 sources. windows Version 4.09 Build 926 at 01.Nov.2009
fork.ini included
FORTH(0)>samples/pp2.fts
a+b+c+d == a b + c + d + a+ b+c+d == a b + c + d + a +b+c+d == a b + c + d + a + b+c+d == a b + c + d + (a+b+c)+d == a b + c + d + a+(b+c)+d == a b c + + d + a=b+c*d&e == a b c d e AND * + = a&b*c+d=e == a b AND c * d + e = a:b+(c*d) == a b c d * + ! [base+index*n]>0 == base index n * + @ 0 > Ok FORTH(0)> Ok FORTH(0)>expr a + b * ( a * ( c + d ) ) a + b * ( a * ( c + d ) ) == a b a c d + * Ok FORTH(0)>[/code]
Как видим, собственные тесты код проходит благополучно, а на введенной вручную формуле спотыкается
[b]expr a + b * ( a * ( c + d ) ) a + b * ( a * ( c + d ) ) == a b a c d + * Ok[/b]
теряются все операторы за скобками
|
|
|
|
Добавлено: Вс ноя 01, 2009 17:10 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): а где он описан этот формат? И список слов без описаний надо тоже иметь под рукой... список слов генерится при каждой сборке и находится в файле .\names.xrf сам файл справки называется .\_\doc\glossary.txt и с его форматом, я думаю, вы очень легко разберетесь просто заглянув в него WingLion писал(а): имхо, было бы неплохо сделать автомат, который по словам проходится и выдает рыбу для заполнения хелпа... в данном случае оно не нужно (см glossary.txt) WingLion писал(а): А сделать опцию наоборот можно? в смысле, чтобы по какому-то специальному ключу батник версию не менял...
я подумаю, хотя вам оно не особо надо, собрать исполнимый файл можно один раз и больше его не делать. Версия exe-шника будет стабильной
[quote="WingLion"]а где он описан этот формат? И список слов без описаний надо тоже иметь под рукой...[/quote] список слов генерится при каждой сборке и находится в файле .\names.xrf сам файл справки называется .\_\doc\glossary.txt и с его форматом, я думаю, вы очень легко разберетесь просто заглянув в него
[quote="WingLion"]имхо, было бы неплохо сделать автомат, который по словам проходится и выдает рыбу для заполнения хелпа...[/quote] в данном случае оно не нужно (см glossary.txt)
[quote="WingLion"]А сделать опцию наоборот можно? в смысле, чтобы по какому-то специальному ключу батник версию не менял...[/quote]
я подумаю, хотя вам оно не особо надо, собрать исполнимый файл можно один раз и больше его не делать. Версия exe-шника будет стабильной :)
|
|
|
|
Добавлено: Пт июл 03, 2009 21:23 |
|
|
|
|