Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added 1C:Executor (sbsl) lexer #2011

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/Languages.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
- Brainfuck (`brainfuck`)
- BrightScript (`brightscript`)
- 1C (BSL) (`bsl`)
- 1C:Executor (SBSL) (`sbsl`)
- C (`c`)
- C# (`csharp`)
- C++ (`cpp`)
Expand Down
10 changes: 10 additions & 0 deletions lib/rouge/demos/sbsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
структура Исполнитель
метод СказатьПривет()
Консоль.Записать("Привет, мир")
;
;

метод Скрипт()
пер Исполнитель = новый Исполнитель()
Исполнитель.СказатьПривет()
;
102 changes: 102 additions & 0 deletions lib/rouge/lexers/sbsl.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# frozen_string_literal: true

module Rouge
module Lexers
class Sbsl < RegexLexer
title "1C (SBSL)"
desc "The 1C:Executor programming language"
tag 'sbsl'
filenames '*.sbsl', '*.xbsl'

def self.detect?(text)
return true if text.shebang? 'executor'
end

keywords = %w(
вконце finally
возврат return
выбор case
выбросить throw
для for
если if
знч val
и and
из in
или or
импорт import
иначе else
исключение exception
исп use
как as
когда when
конст const
конструктор constructor
метод method
не not
неизвестно any
новый new
обз req
область scope
пер var
перечисление enum
по to
поймать catch
пока while
попытка try
прервать break
продолжить continue
структура structure
умолчание default
это is
статический static
)
keywords_constants = %w(
Истина True
Ложь False

)
types = %w(
String Строка
Number Число
Boolean Булево
Неопределено Undefined
Момент
ДатаВремя
Дата
Время
Длительность
ЧасовойПояс
Ууид
неизвестно
Сравнимое
Закрываемое
Обходимое
Форматируемое
Байты
Контекст
)
id = /[[:alpha:]_][[:word:]]*/
string_literal = /(\\\\|\\"|[^"])*/
keyword_declaration = /(?<=[^\wа-яё]|^)/
state :root do
rule %r/\n/, Text
rule %r/[^\S\n]+/, Text
rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
rule %r(//.*$), Comment::Single
rule %r(#!.*$), Comment::Single
rule %r/[\[\]:(),;]/, Punctuation
rule %r/#{keyword_declaration}\&#{id}/, Keyword::Declaration
rule %r/#{keyword_declaration}\#.*$/, Keyword::Declaration
rule %r/(?:#{types.join('|')})\b/, Keyword::Type
rule %r/[-+\/|*%$=<>.:?!&{}]/, Operator
rule %r/(?:#{keywords.join('|')})\b/, Keyword
rule %r/(?:#{keywords_constants.join('|')})\b/, Keyword::Constant
rule %r/@#{id}/, Name::Decorator
rule %r/[\wа-яё][\wа-яё]*/i, Name::Variable
rule %r/\b((\h{8}-(\h{4}-){3}\h{12})|\d+\.?\d*)\b/, Literal::Number
rule %r/"#{string_literal}"/, Literal::String::Single
rule %r/'#{string_literal}'/, Literal::String::Single
end
end
end
end
15 changes: 15 additions & 0 deletions spec/lexers/sbsl_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

describe Rouge::Lexers::Sbsl do
let(:subject) { Rouge::Lexers::Sbsl.new }

describe 'guessing' do
include Support::Guessing

it 'guesses by filename' do
assert_guess :filename => 'foo.sbsl'
assert_guess :filename => 'foo.xbsl'
end
end
end
127 changes: 127 additions & 0 deletions spec/visual/samples/sbsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#!/usr/bin/executor

метод Скрипт()
Консоль.Записать("Привет, мир!")
Консоль.Записать(МойМетод(а, &Квадрат))
// Переменная c — переменная функционального типа (Число)->Число со значением x->x*x
пер c: (Число)->Число = x -> x * x
// 3-й аргумент — значение функционального типа (Число, Число)->Булево
Сравнить(2, 3, (x, y) -> x == y)

// Параметр z — параметр функционального типа
метод Сравнить(x: Число, y: Число, z: (Число, Число)->Булево)
;
;

структура Продажа
обз пер Товар: Строка
обз пер Дата: Дата

// Простой метод
метод ВСтроку(): Строка
пер Версии = новый Массив<Версия>
возврат Байты{4D5A}
;

// Статический метод
статический метод ИзСтроки(СтрокаПродажи: Строка): Продажа
знч Части = СтрокаПродажи.Разделить(" ")
Консоль.Записать("Сейчас %{Время.Сейчас() | ЧЧ:мм}")
возврат новый Продажа(Части[0], новый Дата(Части[1]))
;
;

/* Алгоритм на основании анализа
типа данных заменяет их
на данные, удаляющие информацию
из узла, в котором их
не должно быть. */
метод ЗаписатьВXML()
исп ПотокЗаписи =
новый Файл("C:\\test\\test.xml")
.ОткрытьПотокЗаписи()
пер Запись = новый ЗаписьXml(ПотокЗаписи)
Запись.ЗаписатьНачалоЭлемента("product")
.ЗаписатьАтрибут("code", "138")
.ЗаписатьНачалоЭлемента("description")
.ЗаписатьТекст("Холодильник")
.ЗаписатьКонецЭлемента()
.ЗаписатьНачалоЭлемента("price")
.ЗаписатьТекст("30000")
.ЗаписатьКонецЭлемента()
.ЗаписатьНачалоЭлемента("count")
.ЗаписатьТекст("20")
.ЗаписатьКонецЭлемента()
.ЗаписатьКонецЭлемента()
;

метод МногострочныеСтроки(): Строка
пер МногоСтрочноеЗначение =
1 2
12345678901234567890
" первая подстрока
вторая подстрока
третья подстрока"
пер МногоСтрочноеЗначение = " первая подстрока\нвтораяподстрока\н третья подстрока"
знч СтрокаXml =
"<note>
<heading>Описание объектной модели</heading>
<body>В основании всей иерархии типов лежит тип Объект.</body>
</note>"
возврат СтрокаXml
;

метод ИнтерполяцияСтрок()
знч Длина = 10
знч Ширина = 11
пер Сообщение = "Площадь равна %{Длина * Ширина} м2"

знч Стр_Значение = Истина
знч Стр_Дата = Дата{2020-12-11}
знч Стр_Конкат = "" + Стр_Значение // "true"
знч Стр_Интер1 = "%Стр_Значение" // "true"
знч Стр_Интер2 = "$Стр_Значение" // "Истина"
знч Стр_Интер3 = "%{Стр_Значение}" // "true"
знч Стр_Интер4 = "${Стр_Значение}" // "Истина"
знч Стр_Интер5 = "${Стр_Дата|дд}" // "11"
знч Стр_Интер6 = "${Стр_Дата|дд ММММ гггг, дддд}" // "11 декабря 2020, пятница"
;

метод ПроверитьРегулярныеВыражения()
пер РегВыр = новый Образец("(\\ц{2}-){2}")
пер СтрокаОбразца = РегВыр.ВСтроку() //СтрокаОбразца = (\ц{2}-){2}
пер Данные = "логин!3пароль1*27"
пер РегВыр = '\с+'
пер Совпадения = РегВыр.НайтиСовпадения(Данные)
для ОчередноеСовпадение из Совпадения
ПодСтрока = ОчередноеСовпадение.Значение()
;

метод Квадрат(а: Число): Число
возврат а * а
;

@мояАннотация
метод МойМетод(а: Число, Формула: (Число)->Число): Число
возврат Формула(а)
;

метод ДлинаСтроки(строка: Строка): Число
возврат строка.Длина()
;

метод тест()
знч Длина1 = &ДлинаСтроки // (Строка)->Число
знч Длина2 = &ДлинаСтроки(Строка) // (Строка)->Число
;

метод тестГлобальныйКонтекст()
&ОбщийМодуль1.Метод1(Строка) // (Строка)->Число
;

метод тестЛокальнаяПеременная()
пер Массив1 = <Число>[]
пер добавить = &Массив1.Добавить // (Число)->Булево

добавить(1) // Добавляет в массив
;