Skip to content

aleksp99/bsl

Repository files navigation

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";
КонецЕсли;
СформироватьДерево(Анализатор, Дерево);

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

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

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