![]() |
![]() |
![]() |
|
РБНФ языка 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 тоже сжевал.
но я всё равно так и оставлю. думаю, так правильнее. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |