# bsl для 1С

> Шаблон внешней компоненты 1С AddinTemplate, парсер BSL с использованием ANTLR4 для анализа синтаксиса и формирования дерева значений.

- GitHub: https://github.com/aleksp99/bsl
- Gitsell page: https://gitsell.ru/aleksp99/bsl
- Visibility: public/free
- GitHub stars: 1
- Gitsell views: 66
- Gitsell downloads: 1

## 1C Configurations

Not specified.

## Pricing

Free or price is not specified.

## README

# AddIn.Parser

## AddinTemplate - шаблон внешней компоненты 1С:
https://github.com/Infactum/addin-template  
https://github.com/lintest/AddinTemplate  

## BSL:
https://github.com/1c-syntax/bsl-parser


## ANTLR4:  
java -jar antlr-4.9.12-complete.jar -Dlanguage=Cpp BSLLexer.g4

## 1С:  
```
УстановитьВнешнююКомпоненту("ОбщийМакет.Parser"); // только для клиента
ПодключитьВнешнююКомпоненту("ОбщийМакет.Parser", "Parser");

Анализатор = Новый("AddIn.Parser.BSL");

Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная)));
Дерево.Колонки.Добавить("Текст", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)));
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(32, 0, ДопустимыйЗнак.Неотрицательный));
Дерево.Колонки.Добавить("НомерСтроки", ТипЧисло);
Дерево.Колонки.Добавить("НомерСимвола", ТипЧисло);

КоличествоСинтаксическихОшибок = Анализатор.Выполнить(Текст);
Если КоличествоОшибок Тогда 
	ВызватьИсключение "ERROR_SYNTAX";
КонецЕсли;
СформироватьДерево(Анализатор, Дерево);

Процедура СформироватьДерево(Анализатор, Строка)
	
	Строки = Строка.Строки;
	Пока Анализатор.Следующий() Цикл 
		
		НоваяСтрока = Строки.Добавить();
		НоваяСтрока.Тип = Анализатор.Тип;
		НоваяСтрока.Текст = Анализатор.Текст;
		НоваяСтрока.НомерСтроки = Анализатор.НомерСтроки;
		НоваяСтрока.НомерСимвола = Анализатор.НомерСимвола;

		Если Анализатор.ЭтоЛексема Тогда 
			Продолжить;

		ИначеЕсли Анализатор.ПолучитьЭлементы() Тогда 
			СформироватьДерево(Анализатор, НоваяСтрока);
		Иначе 
			ВызватьИсключение Неопределено;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
```