Имя: Пароль:
IT
 
РБНФ языка 1С для ANTLR никто случаем не ваял уже?
0 Garykom
 
гуру
26.05.15
21:37
Собственно сабж для лисапеда нужен...

Вдруг кто может поделиться опытом
1 Волшебник
 
модератор
26.05.15
21:39
чего?
2 ДенисЧ
 
26.05.15
21:40
WTF?
3 Garykom
 
гуру
26.05.15
21:44
(1)(2) гугл, яндекс и вики в помощь ))

ЗЫ формальное описание языка 1с для штуки генерирующей парсер на java
4 ДенисЧ
 
26.05.15
21:45
(3) Иди ты сам... На гугель...
5 Garykom
 
гуру
26.05.15
21:51
(4) так уже сходил... сюда послали... :)
6 ДенисЧ
 
26.05.15
21:53
(5) Хочешь, я тебя ещё дальше пошлю? И нехай меня забанят...
7 Волшебник
 
модератор
26.05.15
21:56
(3) Я делал отчёт "Структура модуля", который парсил любой модуль. Нормально получилось. http://catalog.mista.ru/public/13999/
8 Злопчинский
 
26.05.15
21:58
Парсинг это нифига не формальное  описание
я вообще сомневаюсь что для 1С формальное описание есть
9 Garykom
 
гуру
26.05.15
22:00
(8) путем банального гугления можно убедиться что есть... в самой 1С... у разрабов платформы ))
10 orefkov
 
26.05.15
23:12
(9)
Учитывая, как в 1С реализован компилятор их языка, сомневаюсь, что и у них оно есть.
11 ifso
 
26.05.15
23:30
(10) типа, оно многое объясняет, не ?)
12 Кирпич
 
27.05.15
08:35
(0) вот писал когда то для YACC. Но лучше сам напиши. Убьешь день два, зато будешь в своей писанине ориентироваться.

%{
unit parserc;

interface

uses SysUtils, Tree, Variants;

type YYSType = TAST;

%}

%token
CONST_INT
CONST_REAL
CONST_STRING
CONST_DATE
CONST_BOOL
CONST_UNDEFINED
CONST_NULL
TK_MODULE
TK_ID
TK_DOT_ID
TK_DOT_LIST
TK_VARINIT
TK_VARDEF_LIST
TK_STAT_LIST
TK_PROC_LIST
TK_PROCBODY
TK_ARRAY_VALUE
TK_ARRAY_INDEX
TK_BOOL_OPER
TK_PARAM_DEFS
TK_EXPR
TK_OPER
TK_ASSIGN
TK_CALL
TK_OBJECT_CALL
TK_OBJECT_PROP
TK_ELSE_IF
TK_IIF
TK_VARDEF_LISTS
TK_PARAMS
TK_PROCEDURE_FORWARD
TK_FUNCTION_FORWARD
T_SKQ
T_SK
Z_VAR
Z_VAL
Z_OR
Z_AND
Z_NOT
Z_PROCEDURE
Z_END_PROCEDURE
Z_FUNCTION
Z_END_FUNCTION
Z_EXPORT
Z_IMPORT
Z_TRUE
Z_FALSE
Z_NULL
Z_FOR
Z_WHILE
Z_TO
Z_DO
Z_END_DO
Z_TRY
Z_EXCEPT
Z_END_TRY
Z_IF
Z_ELSE
Z_THEN
Z_END_IF
Z_ELSE_IF
Z_NEW
Z_NEW_CLASS
Z_EACH
Z_BREAK
Z_CONTINUE
Z_RETURN
/*Z_FORWARD*/
Z_RAISE
Z_IN
Z_FOR_EACH
Z_EXECUTE
Z_GOTO
Z_UNDEFINED
TK_EMPTY
T_VARDEF
T_ARRAY_DEF
T_MINUS
T_PLUS
T_STR_START
T_STR_NEXT
T_STR_END
T_ILLEGAL     /* illegal token */

%union

%%

input
        :module
        ;

module
    : VarDefs Procedures Statements
    | VarDefs Statements Procedures
    ;
    
Procedures
    :ProcedureList
    |
    ;
    
ProcedureList
    :ProcedureDef
    |ProcedureList ProcedureDef
    ;
    
    /*не забудь про процедуры. проверка*/
    
ProcedureDef
    : ProcedureH VarName '(' InParams ')' Z_EXPORT ProcBody Z_END_PROCEDURE
    | ProcedureH VarName '(' InParams ')' ProcBody Z_END_PROCEDURE
    | FunctionH VarName '(' InParams ')' Z_EXPORT ProcBody Z_END_FUNCTION
    | FunctionH VarName '(' InParams ')' ProcBody Z_END_FUNCTION
    ;

ProcedureH
    :Z_PROCEDURE
    ;
    
FunctionH
    :Z_FUNCTION
    ;    
    
InParams
    :ParamDefList
    |
    ;
    
ParamDefList
    :ParamDef
    |ParamDefList ',' ParamDef
    ;
    
ParamDef
    :ParamVarDef
    |Z_VAL ParamVarDef
    ;
                            
ParamVarDef
    :VarName
    |VarName '=' Expression
    ;

ProcBody
    :VarDefs Statements
    ;
    
Statements
    :StatementList
    ;

StatementList
    :Statement
    |StatementList ';' Statement
    ;

Statement
    :AssignStatement
    |CallStatement
    |WhileStatement
    |ForEachStatement         
    |ForStatement
    |TryStatement
    |IfThenStatement
    |IfThenElseStatement
    |IfThenElseIfStatement
    |Z_BREAK
    |Z_CONTINUE
    |ReturnStatement
    |RaiseStatement
    |ExecuteStatement
    |
    ;
    
ExecuteStatement
    :Z_EXECUTE Expression
    ;
    
RaiseStatement
        : Z_RAISE
        | Z_RAISE Expression
        ;

ReturnStatement
    :Z_RETURN
    |Z_RETURN Expression
    ;

IfThenStatement
    :Z_IF Expression Z_THEN Statements Z_END_IF
    ;

IfThenElseStatement
        :Z_IF Expression Z_THEN Statements Z_ELSE Statements Z_END_IF
        ;

IfThenElseIfStatement
        :Z_IF Expression Z_THEN Statements ElseIfBlockList Z_END_IF
        |Z_IF Expression Z_THEN Statements ElseIfBlockList Z_ELSE Statements Z_END_IF
        ;

ElseIfBlockList
        :ElseIfBlock
        |ElseIfBlockList ElseIfBlock
        ;

ElseIfBlock
        :Z_ELSE_IF Expression Z_THEN Statements
        ;

TryStatement
        :Z_TRY Statements Z_EXCEPT Statements Z_END_TRY
        ;

ForStatement
        :Z_FOR VarName '=' Expression Z_TO Expression Z_DO Statements Z_END_DO
        ;
        
ForEachStatement
        :Z_FOR Z_EACH VarName Z_IN Expression Z_DO Statements Z_END_DO
        ;        

WhileStatement
        :Z_WHILE Expression Z_DO Statements Z_END_DO
        ;

AssignStatement
    :Variable '=' Expression
    ;
    
VarDefs
    :VarDefList1
    |
    ;

VarDefList1
    :VarListDef
    |VarDefList1 VarListDef
    ;

VarListDef
    :Z_VAR VarDefList Z_EXPORT ';'
    |Z_VAR VarDefList ';'
    ;

VarDefList
    :VarDef
    |VarDefList ',' VarDef
    ;

VarDef
    :VarName
    |VarName '=' Expression
    ;
    
Expression
    : Expression1         
    | Expression Z_AND Expression1
    | Expression Z_OR  Expression1
    ;
    
    
Expression1
    :SimpleExpression
    |Z_NOT Expression1      
    |SimpleExpression '=' SimpleExpression
    |SimpleExpression '<' '>' SimpleExpression
    |SimpleExpression '<' SimpleExpression
    |SimpleExpression '>' SimpleExpression
    |SimpleExpression '>' '=' SimpleExpression
    |SimpleExpression '<' '=' SimpleExpression
    ;    
    
SimpleExpression
    : Term                                
    | SimpleExpression '+' Term    
    | SimpleExpression '-' Term    
    ;

Term
    : Factor                            
    |Term '*' Factor          
    |Term '/' Factor  
    |Term '%' Factor  
    ;

    
Factor
    : '(' Expression ')'     
    | '-' Factor     
    | '+' Factor     
    | ConstantValue    
    | Variable        
    | ArrayValue  
    |'?' '(' Expression ',' Expression ',' Expression ')'
    ;
    
CallStatement
        :VarOrCallDotList  
        ;

ConstantValue
    : BasicConstant    
    | SimpleConst
    ;
    
SimpleConst    
    : BoolConst
    |NullConst
    |Undefined
    ;    

Variable
    : VarOrCallDotList  
    ;

VarOrCallDotList
    :VarOrCall
    |VarOrCallDotList '.' VarOrCall
    |VarOrCallDotList ArrayValue     
    ;

VarOrCall
        :VarName
        |VarName '(' Params ')'
        |ConstructorCall
        ;
        
ConstructorCall
    :Z_NEW VarDotList '(' Params ')'
    |Z_NEW VarDotList  
    |Z_NEW '(' Params ')'
    ;
    
Params
        :Param
        |Params ',' Param
        ;
Param
        :Expression
        |
        ;    
    
VarDotList
        : VarName
        |VarDotList '.' VarName
        ;    
        
ArrayValue
        : '[' Expression ']'  
        |ArrayValue '[' Expression ']'  
        ;
        
VarName
    :TK_ID
    ;
    
BasicConstant
    :NumConstant  
    |StringConstantList
    |CONST_DATE  
    ;

StringConstantList
    :StringConstantList1
    |StringConstantList2
    ;
    
StringConstantList1
    :CONST_STRING
    |StringConstantList1 CONST_STRING
    ;

StringConstantList2
    : StringConstantList3 T_STR_END
    ;    
    
StringConstantList3
    : StringStart
    |StringConstantList3 T_STR_NEXT
    ;
    
StringStart
    :T_STR_START
    ;        
    
BoolConst
    :Z_TRUE
    |Z_FALSE
    ;
    
NullConst
    :Z_NULL
    ;
    
Undefined
    :Z_UNDEFINED
    ;
    
NumConstant
    :IntConstant
    |CONST_REAL
    ;
IntConstant
        :CONST_INT
        ;
13 Ненавижу 1С
 
гуру
27.05.15
09:02
какова цель?
14 Кирпич
 
27.05.15
09:10
(13) видимо автор решил написать какой нибудь транслятор c 1с в Java и в ближайшие полгода мы его здесь не увидим.
15 Ненавижу 1С
 
гуру
27.05.15
09:13
(14) боюсь не взлетит

Функция Чтото(Х)
  Х.Записать();
КонецФункции

"ручками" оттранслируйте мне в джаву/си или еще чего нить
преопределенные классы считаем что есть
16 ДенисЧ
 
27.05.15
09:13
(15) на уровне с++
void WriteObject(object* obj){
   obj->Write()
}
17 Ненавижу 1С
 
гуру
27.05.15
09:15
(16) то есть все object должны иметь такой метод?
и даже объект Запрос?
18 ДенисЧ
 
27.05.15
09:16
(17) А что, у запроса есть метод Записать() ?
О вообще - используй SmallTalk - там всё объект, даже числа )
19 Кирпич
 
27.05.15
09:19
(17) ну можно и так

void WriteObject(object* obj){
   obj->ExecuteMethod("ЗАПИСАТЬ")
}

вариантов много
20 Ненавижу 1С
 
гуру
27.05.15
09:19
(18) а откуда ты знаешь, что туда передали?
даже если потребуем корректности, то нужно под каждый метод писать свой интерфейс
ибо записать есть как у ДокументОбъект так и у FTPСоединение
что между ними общего я хз, кроме этого метода

void WriteObject(IWrite* obj){
   obj->Write()
}
21 Ненавижу 1С
 
гуру
27.05.15
09:20
(19) тогда лучше оставить как есть
22 ДенисЧ
 
27.05.15
09:21
(20) Я знаю, что туда передали ссылку на объект, который поддерживает метод Write(). Этого достаточно
23 Кирпич
 
27.05.15
09:22
(20) 1C в рантайме тоже не знает "что туда передали"
24 orefkov
 
27.05.15
09:22
(12)
Для начала и для простеньких парсеров пойдет, а так, конечно, не полностью соответствует языку 1С.
(15)

void ChtoTo(Value X, Value retVal)
{
    IContextPtr context = X.getContext();
    if (context) {
        int nFunc = context.findMethod("Записать");
        if (nFunc >= 0) {
            conext.call(nFunc, nullptr);
        }
    }
}
25 Кирпич
 
27.05.15
09:24
(24) ну да. помню я пару тройку больших модулей прогонял через эту фигню. вроде сильно не глючило я и успокоился на этом.
26 orefkov
 
27.05.15
09:24
(15)
Не совсем С++, но для понимания, как это работает, вот например кусок из нового снегопата:

bool readTextFile(v8string& result, const string& path, const string& encoding = "")
{
    IContext&& textDoc;
    currentProcess().createByClsid(CLSID_TxtEdtDoc, IID_IContext, textDoc);
    if (textDoc is null)
        return false;
    IContextDef&& pCtxDef = textDoc;
    int methPos = pCtxDef.findMethod("Read");
    if (methPos < 0)
        return false;
    ValueParamsVector params(3);
    params.values[0] = path;
    
    if (encoding.isEmpty())
        pCtxDef.getParamDefValue(methPos, 1, params.values[1]);
    else
        params.values[1] = encoding;
    pCtxDef.getParamDefValue(methPos, 2, params.values[2]);
  
    Value retVal;
    textDoc.callMeth(methPos, params.retVal, params.args);
    
    ITextManager&& itm = textDoc.unk;
    itm.getTextManager().save(result);
    return true;
}
27 Ненавижу 1С
 
гуру
27.05.15
09:25
(26) ну согласитесь это ад
28 orefkov
 
27.05.15
09:26
+(26)
Метод читает текстовый файл с помощью 1Сного объекта "ТекстовыйДокумент"
29 orefkov
 
27.05.15
09:26
(27)
Ручками - да. А если сделать автотранслятор - никакого ада. Нехай компутер трудится.
30 Кирпич
 
27.05.15
09:27
(26) ну ты то точно имеешь правильную грамматику. подари пацанам для общего развития ;)
31 Кирпич
 
27.05.15
09:28
(27) ну потому всё в 1С так медленно и работает, потому что АД
32 orefkov
 
27.05.15
09:28
(25)
Да я не говорю, что глючно. Правильные модули пройдут. Другое дело, что неправильные тоже могут пройти.
33 Ненавижу 1С
 
гуру
27.05.15
09:29
(29) так это понятно, а для чего?
дальше как это сопровождать если не ручками?
34 Кирпич
 
27.05.15
09:30
(32) да и хрен с ними
35 orefkov
 
27.05.15
09:31
(33)
Зачем? Ну, я не знаю. Можно для предкомпиляции. Можно автоматом код 1С преобразовывать во внешнюю компоненту. Только зачем это в таком виде сопровождать? Ты же не сопровождаешь экзешники в бинарном виде.
36 Кирпич
 
27.05.15
09:53
(24) вот ты так прям слёту определил, что моя грамматика не полностью соответствует языку 1с. давай пример, который, по твоему, не прокатит. если не трудно конечно.  откопал свой древний проект. давай проверим.
37 spock
 
27.05.15
10:49
(26) Ты смог добраться до классов платформы без грязных хаков чтоли?
38 Кирпич
 
27.05.15
10:54
(37) никаких грязных хаков. просто реверс-инжиниринг
39 spock
 
27.05.15
10:57
(38) я это и имел ввиду :)
40 Garykom
 
гуру
27.05.15
12:15
(12) огромное спасибо, изучу
41 Serginio1
 
27.05.15
12:20
(15) В С# есть динамики, для COM есть IDispatch.
Все это утинная типизация https://ru.wikipedia.org/wiki/%D3%F2%E8%ED%E0%FF_%F2%E8%EF%E8%E7%E0%F6%E8%FF
42 orefkov
 
01.06.15
08:26
(36)
А = Не Не Истина;
Твой парсер сжует, а 1С - нет.

Функция Тест(парам = 1 + 2)
Твой парсер сжует, а 1С - нет.

А = 1 + +2;
1С - сжует, твой парсер - нет.
43 Кирпич
 
01.06.15
08:41
(42) щас проверим
44 Кирпич
 
01.06.15
08:45
(42) точно! всё сжевал. только и последнее А = 1 + +2 тоже сжевал.
но я всё равно так и оставлю. думаю, так правильнее.
2 + 2 = 3.9999999999999999999999999999999...