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