|
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
|
||||
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]
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |