Имя: Пароль:
1C
1С v8
v8: Грамматика 1С.
,
0 quest
 
24.06.12
22:32
Ищутся желающие помочь доделать граматику 1С. Находиться здесь https://github.com/wwall/test/blob/master/1C-BNF.grm

на сегодня эта граматика не умеет
1. разбирать код вида х.у(a)[b].c
2. разбирать код препроцессора #если Клиент тогда .... #конецесли
3. Разбирать код препроцессора &НаСервере
4. может еще что-то....

Код базируется на коде скаченом здесь http://itland.ru/forum//index.php?showtopic=16752
1 orefkov
 
24.06.12
22:56
Таки это для 7ки или 8ки?
В 7ке нет Для каждого
В 8ке нет Перем мас[число]
Унарного плюса нет.

Это навскидку только, а так покопаться, еще огрехов найду.
2 orefkov
 
24.06.12
23:00
break, continue - разберутся только непосредственно в теле цикла, а например
Для ...
   Если
      тут уже не допустит "Прервать"
Я break, continue, return делал обычными стэйтментами, отсекал уже на анализе семантики.
3 orefkov
 
24.06.12
23:01
Null где?
4 pumbaEO
 
24.06.12
23:05
новая строка в 1С не только {CR} + {LF} , а еще и просто {CR} : причем, раз на раз не приходится.
5 Ник159
 
24.06.12
23:07
"v8: Граматика 1С"
fail
6 quest
 
24.06.12
23:07
(1) исправлю.
(2) затупил. перепишу. Но вот как у тебя в 77 граматике сделано - не хотелось бы. Пусть лучше на этапе разборки это все отсечется. Чем потом мучаться и выяснть - может тут быть команда или нет.
(3) Добавлю. в принциапе он от undefined ничем не отличается
7 orefkov
 
24.06.12
23:07
Приведенная грамматика допускает последовательность
ИначеЕсли ...
Иначе ...
ИначеЕсли ...
Иначе ...
Иначе ...
8 pumbaEO
 
24.06.12
23:08
(5) БСП:
Если Модифированность Тогда

вот тут fail
9 quest
 
24.06.12
23:09
(5) epic fail. пойду выпью ядy и убьюсь ап стену
(7) поправлю. Спасибо
10 SnarkHunter
 
24.06.12
23:10
Если я скоро кого-то убью, клянусь, я сделаю это для всеобщего блага. Потому что люди, которые пишут "граматика" и "скаченом", должны быть мертвы.

(с)
11 orefkov
 
24.06.12
23:11
(6)
Не отсечешь на классическом разборе грамматики, либо очень сложно.
По сути тебе тогда надо для внутренностей for переписать все остальные вложенные блоки, что они могут break/continue содержать. Да и почем тогда return/return expr так не отлавливаешь - с учетом Процедуры/Функции/ТелаМодуля ?
12 quest
 
24.06.12
23:12
(10) поправь. у меня не прав на это нет

И это - куда бабки пиривести за то что  ВЫ понервничаете? может так искуплю свою вину перед великим и непогрешимым
13 quest
 
24.06.12
23:13
(11) гляну. есть подозрение что можно так сделать. У других же получается :)
14 orefkov
 
24.06.12
23:14
C NotExpt косяк - допускает "Не Не Не выражение" - а 8ка так не может, только
Не(Не(Не выражение).
15 orefkov
 
24.06.12
23:16
Где % ?
16 orefkov
 
24.06.12
23:20
New(параметры) тоже нету.
17 Злопчинский
 
24.06.12
23:25
.. и от мысли что Петру плохо, Семену вдруг стало очень хорошо... ;-)
18 Злопчинский
 
24.06.12
23:26
эх, блин, а в молодости-то я написал конструктор оконных форм и транслятор с языка описания таких форм в исполняемый код.. для больших машин... эх молодосмть..
;-)
19 orefkov
 
24.06.12
23:31
МояПеременная=?(Истина, 0, 0).Тест();
8ка не ругается, твоя грамматика - не пройдет.

Далее, есть еще такой косяк в 8ке

   аа = Тест().Проверка;
   аа = Тест()["Проверка"];
   аа = ИнформацияОбОшибке().ИмяМодуля;
   аа = ИнформацияОбОшибке()["ИмяМодуля"];

На 4ую строку будет ругаться. То есть после встроенных функций нельзя использовать индексную форму обращения к свойствам, а после невстроенных - можно.
20 totparen
 
24.06.12
23:35
Ребята, а для чего это?
21 totparen
 
24.06.12
23:36
Код в методе Выполнить() проверять?
22 orefkov
 
24.06.12
23:39
Еще учти в 8ке косяк

   аа = Не Истина = Ложь; // Работает
   аа = Ложь = Не Истина; // Не компилится
   аа = Ложь = (Не Истина); // Работает

То есть после операции сравнения начинать выражение с Не - нельзя.
23 quest
 
24.06.12
23:40
(22) спасибо. буду все это исправлять.
24 orefkov
 
24.06.12
23:44
В заголвке метода у дефолтных параметров всегда можно поставить +/-
Т.е.
Процедура Тест(Парам1 = +Null, Парам2 = - "ваавраорв")
компилится.
25 orefkov
 
24.06.12
23:48
(24)
Отставить. +|- у дефолтных параметров допустим для чисел, Неопределено, Ложь, Истина, Null. Для строк и дат - нет.
26 quest
 
24.06.12
23:48
(24) и кстати, про дефолт - а почему нельзя написать
функция аа(х=Символы.ПС) ?
ведь тоже же константа?
27 orefkov
 
24.06.12
23:52
Нет ДобавитьОбработчик, УдалитьОбработчик, Выполнить. Это тоже часть языка.
28 orefkov
 
24.06.12
23:55
(26)
Абсолютно неизвестно, что это константа.
Компилятор может знать только про то, что перечислено в разделе "Общее описание встроенного языка". Все остальное - уже уровнем выше компилятора, то есть Символы - это уже свойство глобального контекста, которое подключается при запуске программы.
29 quest
 
24.06.12
23:57
ДобавитьОбработчик, УдалитьОбработчик, Выполнить - они по ветке callstmt вычисляться.
Ведь в структуре AST не произойдет изменений если вместо выполнить в коде будет указано мое_выполнить. Как был вызов метода так и останется. Так что зачем их выделять отдельно?
30 orefkov
 
25.06.12
00:05
Ну и еще небольшой штрих для переменных.
До какой-то версии 8ки "Перем" обязательно должно было заканчиваться ";"
Однако это не соответствует доке, где сказано, что "Между собой операторы обязательно следует разделять символом ";" (точкой с запятой)", т.е. ";" - не часть оператора. И в последних версиях 1С если после Перем нет других операторов, то ; ставить не обязательно. (Как для переменных модуля, так и для локальных переменных)
31 orefkov
 
25.06.12
00:10
(29)
Выполнить - возможно.
А вот у Добавить/УдалитьОбработчик - и синтаксис другой (без скобок), и при компиляции проверяется, что первый параметр может быть объектом, и второй параметр - процедура/функция. То есть просто "выражение" - не прокатит.
32 quest
 
25.06.12
00:15
(31) вот если честно - не скажи ты про ДобавитьОбработчик  я про него и не знал бы...
Поправлю с учетом всех указаных ошибок.
33 orefkov
 
25.06.12
00:45
А, ну и самый главный косяк - символы идентификаторов.
Сначала тебя побьют украинцы, потом казахи, потом дай бог французы, а потом и китайцы с корейцами. Юникод же!

   џЄҐ = 1;

Вполне компилится.
34 rs_trade
 
25.06.12
08:36
(0) зачем это вообще?
35 artbear
 
25.06.12
08:51
(0) что хочешь делать с сабжем?
36 orefkov
 
25.06.12
09:26
Ну и еще не знаю, как себя ведет goldenparser, но на LALR(1) анализаторах, типа yacc, bison и т.п. правила вида

<Expr>          ::= <AndExpr> OR <Expr>
                   |   <AndExpr>

<Statements>        ::= <Statement> ';' <Statements>
           |   <Statement>

работают неэффективно и приводят к раздуванию стека разбора, ибо сначала перед сверткой нужно разобрать вторую часть правила.
И свертки будут идти от последнего оператора к первому. Так что там обычно пишут наоборот:

<Expr>          ::= <Expr> OR <AndExpr>
                   |   <AndExpr>

<Statements>        ::= <Statements> ';' <Statement>
           |   <Statement>
37 quest
 
25.06.12
09:36
(36) Проверю. и если выгоднее сделать как ты сказал - то сделаю
38 quest
 
25.06.12
09:36
(35) пока просто заставить разобрать код
39 quest
 
25.06.12
09:37
(34) просто ради удовольствия и получения опыта
40 orefkov
 
25.06.12
10:03
(34)
Применений так-то множество - создание инструментов рефакторинга, интеллектуальной подсказки по коду, трансляция в другие языки программирования и т.д. и т.п.
41 DitriX
 
26.06.12
13:58
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(29545)}: Значение не является значением объектного типа (ReductionRule)

Что делаю не так?
42 quest
 
26.06.12
19:10
(41) уберу. не тестированиую версию вчера умудрился выложить. И граматика там сейчас косячная, то же не смотри
43 ice777
 
26.06.12
19:26
(0) без обид. нафиг костыли ходячему?
и так хватает не понимающих смысла собственного кода. пусть да 1с-ного :)
44 quest
 
28.06.12
01:42
(36) обновил. Сейчас не поддерживает метки, не поддерживает препроцесор, не поддерживает пока не начиональные языки в именах переменных. по поводу "не не ..." решил не заморачиваться. И с выводом в отдельную ветку прервать и продолжить - тоже.

Посмотри и скажи - что еще поправить?
45 quest
 
28.06.12
10:35
апну, может еще кто что подскажет
46 quest
 
28.06.12
22:47
обновление. Не разбирает 8.2 не поддерживает #ИначеЕсли
Добавлени обработка чтения кода 1С.
желающие потестить - приветствуются
47 Steelvan
 
28.06.12
23:30
http://stal76.ru/ak/module.html

А как здесь парсят код ?
48 quest
 
28.06.12
23:32
там не парсинг а паттерн-маттчинг. более выгодная при больших объемах штука, но никогда не определит что ЭтоМодуль.МояФункция(Параметр) - вызов. Просто потому что не вписывается такое в паттерн
49 Steelvan
 
28.06.12
23:40
Я не спорю, просто интересуюсь.

У них ведь вроде работает ?
50 Steelvan
 
28.06.12
23:46
Интересуюсь темой, так как скоро доберусь до графов.

Заказал программисту, что бы он коды wingraphwiz переделал на возврат таблицы, удобной для анализа в 1С.

wingraphwiz ведь сначала DOT разбирает в какую-то таблицу, потом по ней делает картинку (svg).

По этой таблице можно делать интерактивные графы, если Visio как ActiveX прикрутить.
51 quest
 
29.06.12
09:52
(50) Закажи мне. И граф тебе верну и дерево и черта в ступе :)
52 mikecool
 
29.06.12
09:56
(22) аа = Ложь = Не Истина; // Не компилится - и это правильно, кмк
53 izekia
 
29.06.12
09:58
(52) почему?
54 Ненавижу 1С
 
гуру
29.06.12
09:58
(52) обоснуй
55 quest
 
29.06.12
10:08
(54) потому что такое читать неудобно 1сникам.
56 Steelvan
 
29.06.12
10:58
(51) Отписался в аське.
57 quest
 
29.06.12
13:03
почта [email protected]