Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсветка синтаксиса OCaml 
:(
    Опции темы
Void
Дата 19.1.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Начальство дало добро, ну а мы рады стараться smile


Правила подсветки:


Язык чувствителен к регистру.

Ключевые слова (#0000FF):
Код

and
as
assert
begin
class
constraint
do
done
downto
else
end
exception
external
false
for
fun
function
functor
if
in
include
inherit
initializer
lazy
let
match
method
module
mutable
new
object
of
open
private
rec
sig
struct
then
to
true
try
type
val
virtual
when
while
with


Некоторые встроенные типы и функции (#800000):
Код

unit
int
float
char
string
bool
exn
array
list
option
int32
int64
nativeint
lazy_t
ref
in_channel
out_channel
raise
not
or
mod
land
lor
lxor
lnot
lsl
lsr
asr
ignore
exit


Стандартные модули (#6a5acd):
Код

Arg
Arith_status
Array
Array1
Array2
Array3
ArrayLabels
Big_int
Bigarray
Buffer
Callback
CamlinternalMod
CamlinternalOO
Char
Complex
Condition
Dbm
Digest
Dynlink
Event
Filename
Format
Gc
Genlex
Graphics
GraphicsX11
Hashtbl
Int32
Int64
LargeFile
Lazy
Lexing
List
ListLabels
Map
Marshal
MoreLabels
Mutex
Nativeint
Num
Obj
Oo
Parsing
Printexc
Printf
Queue
Random
Scanf
Set
Sort
Stack
StdLabels
Str
Stream
String
StringLabels
Sys
Thread
ThreadUnix
Unix
UnixLabels
Weak


Комментарии (#008080):
Между (* и *), могут быть вложенными:
Код

(*
  comment1
  (* comment2 *)
  comment1
 *)

(Я смотрю, в подсветке Delphi вложенные комментарии не обрабатываются. Если это сложно, то и не надо.)

Символьные литералы (#008000):
Регулярное выражение:
Код

'([^\\\r\n]|(\\['"ntbr])|(\\\d{3})|(\\x[[:xdigit:]]{2}))'

Пример:
'a', ' ', '\n', '\022', '\xAC' - корректно
'ab', '\z', '\17', '\xGG' - некорректно
Важно в точности следовать этим правилам, потому что апостроф ' может входить в состав идентификатора, в т.ч. и в начале слова.

Строковые литералы (#008000):
Код

"([^\\\r\n]|(\\['"ntbr])|(\\\d{3})|(\\x[[:xdigit:]]{2}))*"


Численные константы (#00008b):
целые:
Код

((\d[\d_]*)|(0x[[:xdigit:]]([[:xdigit:]]|_)*)|(0o[0-7][0-7_]*)|(0b[01][01_]*))[nlL]?

вещественные:
Код

\d[\d_]*(\.[\d_]*)?([eE][+-]?\d[\d_]*)?

Т.е. правила почти те же самые, что и в Си, только внутри чисел символы подчеркивания _ игнорируются; восьмеричные и двоичные константы начинаются с 0o и 0b соответственно; у целых чисел может быть один из суффиксов n, l, L.


Жду замечаний и предложений.

Это сообщение отредактировал(а) Void - 26.1.2006, 15:14


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 25.1.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Насчёт регов не понял, сорри. Остальное почти вставил.
И ещё.. Можешь кусок кода дать для тестов?
Добавлено @ 21:13
Пока так работает: http://poligon.vingrad.ru/index.php?showto...mp;#entry613424


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Void
Дата 25.1.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(sergej.z @ 25.1.2006, 23:07 Найти цитируемый пост)
Насчёт регов не понял, сорри.

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

Цитата(sergej.z @ 25.1.2006, 23:07 Найти цитируемый пост)

И ещё.. Можешь кусок кода дать для тестов?

Без проблем. Вот код, в аттаче то, как он должен выглядеть:

Код

(* environment.mli *)

type ('var, 'func) t

exception Unbound_symbol of string

val make_empty : unit -> ('var, 'func) t
val add_scope : ('var, 'func) t -> ('var, 'func) t
val get_var : ('var, 'func) t -> string -> 'var
val set_var : ('var, 'func) t -> string -> 'var -> unit
val get_func : ('var, 'func) t -> string -> 'func
val add_func : ('var, 'func) t -> string -> 'func -> unit


(* environment.ml *)

open Hashtbl

type ('var, 'func) t = {
    vars : (string, 'var) Hashtbl.t list;
    funcs : (string, 'func) Hashtbl.t }

exception Unbound_symbol of string

let unbound name = raise (Unbound_symbol name)

let make_empty () = { vars = [create 17]; funcs = create 17 }

let add_scope env = { env with vars = create 7 :: env.vars }

let get_var env name =
    let rec scan = function
          [] -> unbound name
        | scope :: tail ->
            try find scope name
            with Not_found -> scan tail in
    scan env.vars

let set_var env = replace (List.hd env.vars)

let get_func env name =
    try find env.funcs name
    with Not_found -> unbound name

let add_func env = replace env.funcs


(* Some random tests.
  (* This is nested comment. *)
*)

let the_string = "Hello\044\x20\"world\"!" (* equivalent to 'Hello, "world"!' *)

let char1 = 'a'
and char2 = '\097'
and char3 = '\xFF'
and char4 = (* This is wrong character! *) '\44'
and char5 = (* This is wrong character also! *) '\xGE'

let array_of_integers = [| 0; 0o1; 0x1; 0b1; 23_17_16 |]
and list_of_reals = [ 2.; 3E1; 2.718_281_828E+00_00; (* This is wrong numbers! *) .123; 4.E_01 ]
and nativeint_int32_int64_tuple = 23n, 0x23l, 0o22L

let poly_variant_tuple = `Foo, `Bar

(* CamlP4 directives — no need to highlight specially. *)
#load "pa_extend.cmo";;


Аттач переименовать в ZIP.

Это сообщение отредактировал(а) Void - 26.1.2006, 14:58

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  ocaml.test 1,28 Kb


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 25.1.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Аттач не открывается smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Void
Дата 25.1.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



P.S. Название языка OCaml smile Objective Caml; Caml — от Categorial Abstract Machine Language, а последние две буквы по совместительству означают принадлежность к семейству ML smile
Добавлено @ 22:10
Сейчас перезагружу


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 25.1.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Гы! ОК smile переименую попозже smile Я вообщето это знаю(как то играл с ним), но каждый раз путаю smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Void
Дата 25.1.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Коротко основные баги, в порядке убывания важности:
  • Как и я предполагал, неправильно подсвечиваются символы: просто от апострофа до апострофа. Это надо поправить в любом случае, потому что идентификаторы, начинающиеся с ' встречаются постоянно — это переменные типов.
  • Строки не подсвечиваются вообще.
  • Не распознаются числа, разделенные подчеркиваниями, и суффиксы n и l.
Да, и комментарии лучше все-таки курсивом
Подумал, и решил, что, несмотря на то, что в подсветке большинства языков на форуме в комментариях используется italic, обычный текст читается лучше.

Пока вроде все.

Цитата
Гы! ОК smile переименую попозже smile Я вообщето это знаю(как то играл с ним), но каждый раз путаю smile

smile

Это сообщение отредактировал(а) Void - 26.1.2006, 15:13


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 26.1.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Насчёт символьных - так и не въехал. Можешь словами расписать?
И ещё. При подсветке мы исходим из того, что код БЕЗ синтактических ошибок. То есть если код с ошибками подсвечивается неправильно, то это ОК. Наша задача - всего лишь чтобы правильный код правильно подсвечивался.
поэтому я не понимаю определения "корректно" smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Void
Дата 26.1.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(sergej.z @ 26.1.2006, 19:16 Найти цитируемый пост)
Насчёт символьных - так и не въехал. Можешь словами расписать?

Попытаюсь. Правило довольно мудреное.
Итак, символьные константы заключаются в одинарные кавычки. Но они должны содержать только один символ — обыкновенный или escape-последовательность. Поэтому, встретив апостроф, мы не имеем права подсвечивать все подряд до следующего апострофа, как символ. В зависимости от того, является ли следующий за ним символ escape-последовательностью, мы должны проверить, является ли символ на позиции +2 ('a'), +3 ('\n'), +5 ('\032' или '\xEF') апострофом. Если нет — это уже НЕ символ.
Но это еще не все. Дело в том, что вот это:
Код
'var   foo'   foo'b'def   abc''

— валидные идентификаторы. А вот это:
Код
'a'b

уже рассматривается как последовательность символа и идентификатора, т.е. синтаксическая ошибка.
Т.о. апостроф наряду с буквами, цифрами и подчеркиванем может быть частью идентификатора.

При последовательном лексическом разборе все это разруливается на раз (собственно, я при написании регов основывался на исходниках лексера компилятора OCaml smile ). Как быть в случае с нашим движком подсветки — не знаю. В принципе, будет достаточно, чтобы принималась во внимание только первая часть правила: что символьные константы должны быть ровно в один символ. Идентификаторы с апострофами посередине я в реальном коде не видел ни разу. А вот в начале или в конце — постоянно.

Подводя итог, для наших целей будет достаточно, чтобы текст между апострофами подсвечивался как символ тогда и только тогда:
  • когда он состоит из одного символа, кроме \ и '
  • когда он состоит из бэкслэша и одного из символов n t b r ' " \ и пробел.
  • когда он состоит из бэкслэша и трех десятичных цифр
  • когда он состоит из "\x" и двух шестнадцатеричных цифр.
  • как вариант крайнего упрощения: вместо трех последних пунктов — бэкслэш и от одного до трех любых символов.


Цитата(sergej.z @ 26.1.2006, 19:16 Найти цитируемый пост)
И ещё. При подсветке мы исходим из того, что код БЕЗ синтактических ошибок. То есть если код с ошибками подсвечивается неправильно, то это ОК. Наша задача - всего лишь чтобы правильный код правильно подсвечивался. поэтому я не понимаю определения "корректно"

Я это понимаю smile Просто в некоторых случаях может получится так, что мы неправильно подсветим синтаксически правильный код.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 11.10.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Думаю, соответствующие участники уже знают про подсветку кода OCaml. Для вставки кодов OCaml используйте подсветку синтаксиса из выплывающего списка Код в форме ответа.
Тему открепляю. О подсветке сообщено в шапке форума.

Void, скажи, если  реализация ещё не отлажена. Тему можно будет опять зафиксировать.
PM MAIL ICQ   Вверх
Void
Дата 11.10.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



Цитата(Cr@$h @  11.10.2006,  23:26 Найти цитируемый пост)
Void, скажи, если  реализация ещё не отлажена. Тему можно будет опять зафиксировать. 

Говорю: она не работает. Т.е., если я правильно понимаю, OCaml добавлен в список кодов на форме, но сама реализация подсветки на форум не загружена.
Код
let fact = function
    | 0 -> 1
    | n when n > 0 -> n * fact (n - 1)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 11.10.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Хорошо, тогда фиксирую её обратно  smile 
Быстрое же у тебя время отклика получилось
PM MAIL ICQ   Вверх
Void
Дата 11.10.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 1
Всего: 173



С одной стороны, не сказать, что это так критично сейчас (последняя тема с кодом на *ML была много месяцев назад). С другой, надо бы админам намекнуть smile Так как теперь даже Полигона нет, чтобы проверить.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cr@$h
Дата 11.10.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Да. Можешь напрямую Сергея попросить посмотреть. С Fortran там тоже не реализовано...
PM MAIL ICQ   Вверх
sergejzr
Дата 12.10.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Блин. всё руки не доходят до оставшихся подсветок smile Любой, кто знает яваскрипт может помочь...


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.