LINUX.ORG.RU

Ну ладно, можно смеяться и говорить «ненужно»

 ,


7

6

Ладно, скажу и вам: я начал-таки делать свой язык программирования, о котором я тут периодически писал, наверное, лет с пяток.

Он начался с того, что по работе понадобился транслятор с языка 1С и будет он примерно таким:

  • ключевые слова в кириллице, заточен на русскоязычных пользователей
  • работает через трансляцию в Cl
  • семантика от CL. Пока мало сделано, постепенно буду достраивать мосты до недостающих частей. Но некоторые вещи в семантике CL не годятся и будут заменены (модули, #., на другие пункты будем смотреть)
  • RAII - подобные конструкции
  • опциональная статическая типизация
  • элементы ФП: декларации для контроля мутабельности. Замыкания.
  • eval, REPL
  • опциональные типы примерно как в Rust
  • исключения и отладчик как в лиспе (вызов отладчика до раскрутки стека, во многих случаях возможность выкрутиться из ошибочной ситуации и продолжить выполнение)
  • треды
  • пошаговая отладка отдельных тредов, а также трассировка в лог или на экран
  • лицензия - пока не знаю. Скорее всего MIT, но нужно понять, как всё это соотносится с местным законодательством
  • файлы описания интерфейсов отделены от реализации этих интерфейсов, как в С (спасибо за участие в обсуждении)
  • горячая замена кода, естественно
  • сборка мусора
  • парсер линза, т.е. сразу создаётся фундамент под средства обработки исходников, как в CLang
  • совместное развитие среды, языка и инструментов - для этого я и запилил clcon
  • интерфейс к C (с ограничениями на применение сигналов и тредов в библиотеках)
  • встроенные sql запросы и вообще возможность встраивания других синтаксисов без специального закавычивания - с поддержкой со стороны среды
  • гуй на tcl/tk по технологии клиент-сервер. После версии 1.0 можно обсуждать Qt, но вряд ли будет слой переносимости между разными GUI. Возможно, будет генерация tcl/tk из крупных блоков по метаданным (это для бизнес-приложений скорее).
  • базовая реализация CL - SBCL (из-за лицензии).

На данный момент есть работающий пример вот такого сорта (только заменил пару ключевых слов, которые в реальности пишутся по-другому):

// -*- package :S2TEST ; coding : utf-8 ; encoding : utf-8 ; -*-
/*
(in-package :s2test)
(named-readtables:in-readtable :buddens-readtable-a)

модуль Пример1;
*/

клсс к () ;
  а : строка = "базя" ;
  б ; 
кнцклсс

клсс к2 (к) ;
  в ; 
кнцклсс 

// здесь полные слова, потому что редкое слово
ГлобальнаяПеременная э;

фнкц МояСтраница() : строка ; 
 перем рез;
 ПостгресСОтдельнымПодключениемВДаннойНити();
 ПостгресПодключиться("db1","pguser","uio123","192.168.184.128");
 //ВОтладчик("ура!");
 рез = "<html><body>Поля глоб. перем. э k2</p>";
 рез = рез + ПоляИЗначенияЭкземпляра (э);
 рез = рез + "<p>" + строка(ПостгресЗапрос("select * from ошибка")) + "
 </p>";
 рез = рез + "<br><a href=""/"">Домой</a></body></html>";
 ПостгресОтключиться();
 Возврат рез;
кнцфнкц

ЗапуститьВебСервер(2425);
ВебСерверГлотатьОшибки(1);

СоздатьГенерируемуюВебСтраницу("/ura",смвл("S2TEST::МояСтраница"));

э = СоздатьОбъект(смвл("к2"));
э.б = 2; 
э.в = 3;

Если найду тех, кто будет пилить со мной или, ещё лучше, даст денег на разработку - открою исходники.

★★★★★

Последнее исправление: den73 (всего исправлений: 6)
Ответ на: Склонения и спряжения от Camel

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

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

anonymous
()
Ответ на: комментарий от den73

Кстати, я вот думаю, можно ли вместо «исключающее или» задействовать «либо» или это приведёт к проблемам? И ещё если кто-то знает полезные Древнерусские союзы, частицы и предлоги, которые можно написать на современной кириллице, то пишите.

або иже паки тако ежели вдругорҍдь аще (аще бо)

anonymous
()
Ответ на: комментарий от den73

Язык, видимо, деградировал, слова выпали. Остались пустые места, не занятые словами. В итоге язык стал более многословным.

дело не только в этом. язык сам по себе был образный, многомерный. начиная с азбуки, хотя бы кириллицы, в которой 7x7 матрицу букв можно было образно, многомерно читать и осознавать — по горизонтали, по вертикали, по диагоналям. числа буквами также имели смысл, например, прочитай 1+2=3 через аз + веди=глаголи (если я знаю, то говорю), и так далее.

у каждой буквы было несколько смыслов, многомерных — меняющихся в зависимости от места. то есть это язык рунический. это ещё не говорю о *других* азбуках (глаголица, руница, черты и резы, наузы и т.п.)

далее пошло упрощение — начиная со звуков (ие, и краткое, и, ий), продолжаясь через буквы (когда из 49 буков сделали сначала 43, потом 37, потом 33), а сейчас и ближе к олбанскому надмозг-ориентированному новоязу.

после того как выкинули «ненужные» буквы, стали выкидывать и слова, смыслы, образы. вот например, с буквой «ять» — она чётко показывает, какие слова пишутся через ять и исконно русские, а какие — заимствованные. затем, с и краткое: например, «миръ», «мiръ» — три смысла, которые упростили в одно слово «мир».

а некоторые слова с исконными буквами типа «арь», «одь», «юс малый», «юс большой», «ёта», «оук», «гервь», (!)«инить», «ижеи», «ижа» (не говоря уж о всяких там «фитах» и «ижицах») — прямо тупо выкинули.

ибо азбука образная, в отличие от «плоского» алфавита это кристалл души и родовой памяти. он изначально многомерен, образен — как и слова, и смыслы, и описываемые ими понятия.

где сейчас, к примеру, понятие «невместно» ??? это же мҍра, вҍра, совҍсть и обратная связь в системе управления.

вот кстати, почему писали «аз ЕСМЬ царь», «мы, царь такой-то, повелели ... » : есмь это многомерное, множественное определение, утверждение и декларация интерфейса (в отличие от «есть» — бытиё проявленное, воплощённое инстанса).

«я — последняя буква алфавита» ?? зато аз — первая буква азбуки. «аз» — «я, единое начало».

сначала запретили мужыкам и холопам называть себя «аз», заменив ослиным «иа-иа», оставив только боярам и царям. затем и боярам запретили.

оставили токмо для царей: это мычащее «мы». это «мы» меня всегда умиляло: «у вас что там, шизофрения, ваши величества? сколько вас там внутри всего? и что же это за царь, аще без царя в голове? »

так и происходило одержание народа русского для победы формального синтаксиса над разумом семантики — теряя образность и насаждая бредятину формально логичную, но по сути издевательскую.

пора ужо прекратить этотъ брҍдъ и почать возстанавливать исконно русскiя образы, смыслы, буковы и понятiя.

anonymous
()
Ответ на: комментарий от den73

Выбрасывание гласных не всегда сохраняет смысл, всё же мы не Финикийцы.

кстати, некоторые этрусские тексты прекрасно читаются как старославянские.

anonymous
()
Ответ на: комментарий от peregrine

смсь, т.к. чнь ннжн

фнкц, кнцклсс, кнцфнкц, змн н {}, бдт кмпктн бъвлн нд сдлть тдльн, ндбн срз псл фнкц псвть см фнкц.

спхв тб ТС.

древнеболгарский? тогда твердыхъ знаковъ не хватаетъ.

anonymous
()
Ответ на: комментарий от den73

«есьм» кстати, конкретно полезно. В CL 4 вот сколько предикатов равенства: eq,eql,equal,equalp. И к тому ещё =, char=, string=, string-equal, char-equal.

«есмь» это многомерное, многоплановое существование, определение. то есть, сравнение полное — объектов, как многомерных сущностей во всех аспектах бытия (equal).

а «есть» — по форме (бытию), то есть, инстансов через eql.

anonymous
()
Ответ на: комментарий от anonymous

осталось найти родные аналоги таких слов как:

класс - ясли, дружина?

община, то есть: «инить»

объект - абракодабра? нечто?

азъ (хотя это скорее конструктор, или фабрика-синглътонъ)? онъ (как раз, «нечто»)? како? (система)? или, скорее, енъ (42-я буква, как логотип «аквариума», Ѧ) — «родовитость, естествство, нерукотворный, восходящий вверх образ»

функция - кудесница?

предназначение, дух (функциональный объект). «кудесница» — это волшебница, в состоянии кудес (то есть, ожидании чуда). другой немного смысл — клиента, пользующегося интерфейсом (а вдруг, не засегфолтится?)

«цы», «высшая структура, определяющая цель». или «фита» (единство духа, слияние, взаимопроникновение (см. рекурсию)"

экземпляр - ... вон тот тип, гражданской наружности?

«еръ» — соотворение в процессе действия (это скорее, конструкторъ или лямбда-функция). «ерь» — данное, сотворённое, законченное творение.

это только по буквам так получается, по словам будет ещё интереснее.

В итоге получится полностью замещенное творение в виде народных сказок ...

интернѣтъ суть гiпертѣкстовый вѣщий лѣсъ знанiй: учёные котики и василисы премурные с селфи «свѣт мой зеркальце, скажи».

anonymous
()
Ответ на: комментарий от den73

- семантика работы с числами другая. Кажется, там числа даже не double, а какое-то BCD

см. «денежный тип», про округление копеек.

передача всех параметров по ссылке в том смысле, что присвоение параметру внутри процедуры меняет его в вызывающей процедуре.

«Знач» можно передавать как значение.

Транслятор с 1С возможен (и даже есть у меня такой),

у меня тоже. см. ниже

anonymous
()
Ответ на: комментарий от den73

Я начал эту тему в надежде на чудо.

держи чудо (следующие несколько постов).

anonymous
()

грамматика 1Cv7.7, файл C1c.g

/// -*- coding: windows-1251 -*-

grammar C1c;

options {
    output = AST;
    backtrack = true;
    memoize = true;
    k   = 2;
}

tokens	{
VARDECL;
VARDEF;
VARDEF_SET;
VARDEF_ARRAY;
SETVAR;
CALLPROC;
INDEX;

//// KEYWORDS. 
R_VAR = 'Перем';
E_VAR = 'Var';
R_DIM = 'Разм';
E_DIM = 'Dim';

R_PROCEDURE = 'Процедура';
E_PROCEDURE = 'Procedure'; 
R_ENDPROC  = 'КонецПроцедуры';
E_ENDPROC  = 'EndProcedure'; 
R_FUNCTION  = 'Функция';
E_FUNCTION  = 'Function'; 
R_ENDFUNC  = 'КонецФункции';
E_ENDFUNC  = 'EndFunction'; 

R_RETURN  = 'Возврат';
E_RETURN  =  'Return';

R_NOT = 'НЕ';
E_NOT = 'NOT';
R_AND = 'И';
E_AND = 'AND';
R_OR = 'ИЛИ';
E_OR = 'OR';

R_XOR = 'ХИЛИ';
E_XOR = 'XOR';

MOD   = '%'; 

R_GOTO= 'Перейти';
E_GOTO= 'GoTo'; 

R_BREAK = 'Прервать';  
E_BREAK = 'Break' ;

R_CONTINUE  = 'Продолжить'  ;
E_CONTINUE  = 'Continue' ;

R_RETURN  = 'Возврат' ;
E_RETURN  = 'Return'  ;

R_IF  = 'Если' ;
E_IF  = 'If';
R_THEN  = 'Тогда' ;
E_THEN  = 'Then' ;
R_ELSE  = 'Иначе' ;
E_ELSE  = 'Else' ;
R_ELSEIF  = 'ИначеЕсли';
E_ELSEIF  = 'ElseIf'; 
R_ENDIF   = 'КонецЕсли' ;
E_ENDIF   = 'EndIf'  ;
  
R_FOR   =  'Для';
E_FOR   =  'For';

R_TO    =  'По'; 
E_TO    =  'To';

R_LOOP  = 'Цикл' ;
E_LOOP  =  'Do';
           
R_ENDLOOP = 'КонецЦикла' ;
E_ENDLOOP = 'EndDo';
  
R_WHILE   = 'Пока' ;
E_WHILE   = 'While';


R_RAISE   = 'ВызватьИсключение'  ;
E_RAISE   = 'Raise';

R_TRY     = 'Попытка' ;
E_TRY     = 'Try'   ;

R_EXCEPT  = 'Исключение' ;
E_EXCEPT  = 'Except';

E_ENDTRY  = 'EndTry' ;
R_ENDTRY  = 'КонецПопытки';
R_ENDTRY1 = 'НеПытка';
// Попытка ВызватьИсключение; Исключение ОписаниеОшибки(); НеПытка;
//LOL, not in spec

R_MESSAGE = 'Сообщить';
E_MESSAGE = 'Message';
/// XXX FIXME Убрать MESSAGE. Обрабатывать как обычную функцию в assignmentOrProcCall   

//FIXME TODO: многоязычные ключевые слова без учёта регистра через синтаксические предикаты

} //tokens

anonymous
()
Ответ на: грамматика 1Cv7.7, файл C1c.g от anonymous
//// LEXER GRAMMAR
fragment VAR : R_VAR | E_VAR;
fragment DIM : R_DIM | E_DIM;
fragment PROCEDURE   : R_PROCEDURE | E_PROCEDURE;
fragment ENDPROC     : R_ENDPROC   | E_ENDPROC;
fragment FUNCTION    : R_FUNCTION  | E_FUNCTION;
fragment ENDFUNC     : R_ENDFUNC   | E_ENDFUNC;
fragment RETURN      : R_RETURN    | E_RETURN;
fragment NOT         : R_NOT | E_NOT;
fragment AND         : R_AND | E_AND;
fragment OR          : R_OR | E_OR;
fragment XOR         : R_XOR | E_XOR;
fragment DIV         : '\\' | 'DIV' ; // FIXME : DIV not in spec
fragment GOTO        : R_GOTO | E_GOTO;
fragment BREAK       : R_BREAK | E_BREAK;
fragment CONTINUE    : R_CONTINUE | E_CONTINUE;
fragment IF          : R_IF | E_IF;
fragment THEN        : R_THEN    | E_THEN;
fragment ELSE        : R_ELSE    | E_ELSE;
fragment ELSEIF      : R_ELSEIF  | E_ELSEIF;
fragment ENDIF       : R_ENDIF   | E_ENDIF;
fragment FOR         : R_FOR     | E_FOR;
fragment TO          : R_TO      | E_TO;
fragment LOOP        : R_LOOP    | E_LOOP;
fragment ENDLOOP     : R_ENDLOOP | E_ENDLOOP;
fragment WHILE       : R_WHILE   | E_WHILE;
fragment RAISE       : R_RAISE   | E_RAISE;
fragment TRY         : R_TRY     | E_TRY;
fragment EXCEPT      : R_EXCEPT  | E_EXCEPT;
fragment ENDTRY      : R_ENDTRY  | E_ENDTRY | R_ENDTRY1;
fragment MESSAGE     : R_MESSAGE | E_MESSAGE;
  
 
IDENT  
  : LETTER_RUS (LETTER_RUS|DIGIT)*
  ;

fragment
LETTER_RUS
  :
  'a'..'z'|'A'..'Z'|'а'..'я'|'А'..'Я'|'_'
  ;

fragment
OCTAL_DIGIT :
              '0' .. '7' ;
            

fragment
DIGIT :
        OCTAL_DIGIT | '8' | '9'
        {} // make ANTLRworks display separate branches 
        ;

INT : DIGIT+
// TODO MAYBE | '0o' OCTAL_DIGIT+ | '0x' DIGIT (HEX_DIGIT)*  
    ;

REAL
    :   DIGIT+ '.' DIGIT* EXPONENT?
    |   DIGIT+ EXPONENT?
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;


// TODO FIXME Multiline strings, strings with quotes
STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') | '"' '"')* '"'
    ;

CHARACTER:  '\'' ( ESC_SEQ | ~('\''|'\\') | '\'' '\'' )* '\''
    ;

fragment
EXPONENT : ('e'|'E') ('+'|'-' {})? DIGIT+ ;

fragment
HEX_DIGIT : (DIGIT|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') OCTAL_DIGIT OCTAL_DIGIT
    |   '\\' OCTAL_DIGIT OCTAL_DIGIT
    |   '\\' OCTAL_DIGIT
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;


anonymous
()
Ответ на: комментарий от den73

Название языка должно быть «ё-прст». Дарю!

anonymous
()
Ответ на: комментарий от anonymous


//// PARSER GRAMMAR. 
/// ***** Weird stuff, huh? Why do we need it at all

ident   : IDENT ;         // see lexer
number  : INT | REAL ;
integer : INT ;
real   : REAL ;
exponent  : EXPONENT  ;
hexDigit  : HEX_DIGIT ;
digit     : DIGIT ;
octalDigit: OCTAL_DIGIT ;
string    : STRING  ;
character : CHARACTER ;


/// FIXME TODO: Попробовать токен-правила вида
// fragment VAR: R_VAR|E_VAR;
// fragment R_VAR: 'Перем'; fragment E_VAR: 'Var';


dim_: 'Разм' | 'Dim' ;

var:  'Перем' | 'Var';
// if_: IF;           //??? doesn't work
if_: 'Если'| 'If';   //??? does work
then_: 'Тогда'|'Then';
else_: 'Иначе'|'Else';
elseif_: 'ИначеЕсли'|'ElseIf';
endif_: 'КонецЕсли'|'EndIf';

for_: 'Для'|'For';
to_ : 'По' | 'To';
loop_:'Цикл' | 'Do';
endloop_: 'КонецЦикла'|'EndDo';

while_: 'Пока'| 'While';
break_: 'Прервать'|'Break';
continue_: 'Продолжить'|'Continue';

try_:     'Попытка'|'Try';
except_:  'Исключение'|'Except';
endtry_:  'КонецПопытки' | 'EndTry'
       | 'НеПытка'
       ;
raise_ : 'ВызватьИсключение' | 'Raise'
       ;

goto_  :  'Перейти' | 'GoTo'
       ;
not_   : 'NOT' | 'НЕ' ;      

qualID  :
          ident ( '.' ident )*
          ;

constDecl :
          ident '='^ constExpr
          ;
          

constExpr  : 
			  ternaryConstExpr 
			;

ternaryConstExpr : 
			boolLorConstExpr ('?'^ constExpr ':'! ternaryConstExpr )?
			;

boolLorConstExpr :
			regularConstExpr
			;			


regularConstExpr :
          simpleConstExpr ( relation^ simpleConstExpr )?
          ;

relation  :
          '=' 
          | '==' | '!=' 
          | '<>' | '<' | '<=' | '>' | '>=' 
//        'IN' | 'В'
          {}
           ;
          
simpleConstExpr :
      ( '+'^ | '-'^ {})? constTerm ( addOp constTerm )*
      ;

addOp :
      ( '+' | '-' | OR )^
      {} // make ANTLRworks display separate branches 
      ;


constTerm 	:
		  	constMulTerm (mulOp^ constMulTerm )*
		  	;

constMulTerm	:

          constFactor (  powerOp^ constFactor )*
          ;

powerOp		:
			'**' | 'SQROOT'
            {} // make ANTLRworks display separate branches 
            ;



          
mulOp       :
            '*' | '/' | DIV | MOD | AND  
//          | '&'
            {} // make ANTLRworks display separate branches 
            ;
            
constFactor :
            number  | string | setOrQualID |
            '('! constExpr ')'! | ( not_ {} ) constFactor
            ; 
            
anonymous
()
Ответ на: комментарий от anonymous
setOrQualID : qualID
//NOTES: MAYBE Modula-2/Pascal-like set syntax?
//      set | qualID set? 
      ; 

identList :
          ident ( ',' ident )*
          ;
identInitList :
          identInit ( ',' identInit )*
          ;
identInit :
        identOrArray  ( '=' expression)?
        ;
identOrArray  :
      ident ('['! constExpr ']'!)?
      // TODO check type constExpr = INT number
      ;

varDeclaration  :
          identInitList
          ;

designator  :
            qualID  ( designatorTail )?
            ;
            
designatorTail  :
                ( ( '['! exprList ']'! ) ( '.' ident )* )+
                ;

exprList  :
          expression ( ','! expression )*
          ;

aexprList  :
          ae ( ','! ae )*
          ;

ae 			:
			expression?
			;          

expression  : 
			  ternaryExpr 
			;

ternaryExpr : 
			boolLorExpr ('?'^ expression ':'! ternaryExpr )?
			;

boolLorExpr :
			regularExpr
			;			


regularExpr :
            simpleExpr  ( relation^ simpleExpr )?
            ;

simpleExpr  :
			dim_ ident
			|
			'SQRT' term
			|
            ( '+'^ | '-'^ {})? term ( addOp^ term )*
            ;

term  :
      mulTerm  ( mulOp^ mulTerm )*
      ;

mulTerm  :
      factor  ( powerOp^ factor )*
      ;

          
factor :
        number |
        string |
        character   |
        designatorOrProcCall |
        '('! expression ')'! 
        | (not_ {}) factor
        ;

designatorOrProcCall  :
    qualID
    ( designatorTail? actualParams? )
    ;
    
actualParams  :
       '('! aexprList? ')'!
       ;

commonStatement :
      assignmentOrProcCall 
      | ifStmt 
      | whileStmt 
      | forStmt 
      | gotoStmt 
      | xcptnStmt
// XXX FIXME       
      | messageStmt
      ;




messageStmt :
    // XXX FIXME Shouldn't require any, but ATM stub 
    /// Message(FOO) should be handled not by 'messageStmt' rule, but with common assignmentOrProcCall  rule
    ('Сообщить'|'Message')^ actualParams
    ;

loopStatement :
              forStmt | whileStmt 
              ;

loopInsideStatement :
            commonStatement |
            breakStatement  |
            continueStatement
            ;

// MAYBE break label/ continue label ?
breakStatement  :
                break_
                ;

continueStatement :
                  continue_
                  ;
                  

xcptnInsideStatement :
            commonStatement |
            raiseStatement
            ;

raiseStatement  :
                raise_
                ;

funcOrProcInsideStatement :
            commonStatement |
            RETURN expression?
            ;            
            
       
statement :
          label?
          ( commonStatement 
          )?
          ;

loopBodyStmt :
          label?
          ( loopInsideStatement )?
          ;
          
xcptnBodyStmt :
          label?
          ( xcptnInsideStatement )?
          ;
//  Доступно только в xcptBody:
//    ОписаниеОшибки();
//    GetErrorDescription();
// в других местах возвращает пустую строку

          
funcOrProcBodyStmt  :
          label?
          ( funcOrProcInsideStatement )?
          ;


assignmentOrProcCall  :
      designator
      ( '=' expression 
      -> ^(SETVAR designator expression )
      | actualParams? 
      -> ^(CALLPROC designator actualParams )
      )
      ;

statementList :
        ( statement ';'!)*
           ;

loopStatementList :
           ( loopBodyStmt ';'! )*
           ;

xcptnStatementList :
           ( xcptnBodyStmt ';'! )*
           ;

funcOrProcStatementList :
           ( funcOrProcBodyStmt ';'! )*
           ;



anonymous
()
Ответ на: комментарий от anonymous
ifStmt  :
        if_ ifExpr=condExpr then_ thenClause+=statementList
        ( options {k=1; backtrack=false;}: 
        elseif_ elsifExpr=condExpr then_ elseifClause+=statementList )* 
        ( options {k=1; backtrack=false;}: 
        else_ elseClause+=statementList )?
        endif_
        ;

condExpr  :
    expression
        /// TODO FIXME check semantic, that expression is boolean
    ;

      
whileStmt :
          while_ whileLoopExpr=condExpr  loop_ whileLoopBody+=loopStatementList endloop_
          ;

forStmt :
        for_   forLoopVar=ident '=' forLoopInit=expression to_ forLoopUntil=expression
// Loop step:
//      ( BY constExpr )?         
        loop_ forLoopBody+=loopStatementList 
        endloop_
        ; 

labelID :
        IDENT | INT
        ;

label   :
        '~'! labelID ':'!
        ;

gotoStmt  :
          goto_ labelID
          ;
          
xcptnStmt  :
           try_ tryBody+=xcptnStatementList
           ( except_ xcptBody+=xcptnStatementList )?
           endtry_
           ;
           

procedureDeclaration  :
        procedureHeading blockFuncOrProc endProcedureHeading
        ;

procedureHeading  :
        PROCEDURE ident formalParams?
        ;
endProcedureHeading :
        ENDPROC
        ;
        

functionDeclaration  :
        functionHeading blockFuncOrProc endFunctionHeading
        ;
        
functionHeading  :
        FUNCTION ident formalParams?
        ;
endFunctionHeading :
        ENDFUNC
        ;

block :
          variableDeclaration*
          statementList
          ;

variableDeclaration :
      variable
      ;

variableDeclarations:
      variableDeclaration+
      ;
      
variable  :      
      var  varDeclaration 
      ';'
       -> ^(VARDEF varDeclaration)+
      ;  

blockFuncOrProc :
          variableDeclaration*
          funcOrProcStatementList
          ;

          
formalParams  :
              '('! ( fpSection ( ','! fpSection )* )? ')'! 
              ;

fpSection :
          var? ident ('='! defaultFormalParameterValue )?
          ;

defaultFormalParameterValue  :
    expression
    ;          
          
           
program : 
     variableDeclaration*
     functionOrProcedureDeclaration*
     statementList
    ;

functionOrProcedureDeclaration :
    functionDeclaration | procedureDeclaration
    ;
anonymous
()
Ответ на: комментарий от anonymous

файл Main.java

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class Main {
	public static void main(String[] args) throws Exception {

		if (1 != args.length) {
			System.err.println("Usage: java Main input.1s "+
								"\n"+
								"	Print out source input.1s as Sexprs list	");
				return;
		}
		// TODO: more options, pretty printing more beautifully indent, other output formars, error handling, ignore case keywords

		String sourceFilename = args[0];

		CharStream input = new ANTLRFileStream(sourceFilename);
		C1cLexer lex = new C1cLexer(input);
		CommonTokenStream tokens = new CommonTokenStream(lex);
		C1cParser parser = new C1cParser(tokens);

		C1cParser.program_return r = parser.program(); // main rule
		System.out.println("\n;tree("+sourceFilename+")=");
		System.out.println( ((Tree)r.tree).toStringTree() ); //FIXME
		System.out.println(";EOF("+sourceFilename+")");

		if ( parser.getNumberOfSyntaxErrors()>0 ) {
			// don't tree parse if has errors
			System.err.println(" Syntax error in parsing "+sourceFilename );
			// FIXME: error where in file?
			// TODO : error handling
			return;
		}
/*  TODO: more beautiful pretty printing with indent -- via codewalker
    
		CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);
		nodes.setTokenStream(tokens);
		SimpleCWalker walker = new SimpleCWalker(nodes);
		walker.program();
*/
	}
}

anonymous
()
Ответ на: файл Main.java от anonymous

файл input.1s, кодировка — 1251

Перем А;     //так работает
//пЕРЕМ Д; //так не работает
//Обработки ошибок пока нет.  Ignorecase для ключевых слов -- тоже пока нет. 
//Контроля семантики, типов -- тоже пока нет.

Б=123*А+564-30/(40-50);
Сообщить("Мы тут посчитали, что Б="+Б);
anonymous
()
Ответ на: структура каталогов от anonymous

cat setup-antlr3.sh

export PROJ_JDK_PATH=/dev/java/jdk1.7.0_02
export PROJ_ANTLR_PATH=/dev/src/parsers/ANTLR/antlr-3.4-complete.jar
export PROJ_MAVEN_PATH=/dev/src/parsers/ANTLR/apache-maven-3.0.4-bin/apache-maven-3.0.4
export CLASSPATH=${PROJ_ANTLR_PATH}:${PROJ_JDK_PATH}/lib:.:${CLASSPATH}
export PATH=${PROJ_JDK_PATH}/bin:${PROJ_MAVEN_PATH}/bin:${PATH}
export JAVA_HOME=${PROJ_JDK_PATH}
export M2_HOME=${PROJ_MAVEN_PATH}
anonymous
()
Ответ на: cat r.sh от anonymous

cat out.txt #кодировка 1251


;tree(../input.1s)=
(VARDEF А) (SETVAR Б (- (+ (* 123 А) 564) (/ 30 (- 40 50)))) (Сообщить (+ "Мы тут посчитали, что Б=" Б))
;EOF(../input.1s)

anonymous
()
Ответ на: комментарий от den73

2. Славлю проект сей на просторах сетей.

пользуйся на здоровье, «one ass — one future» :-)))

как видишь по out.txt, вот это

;tree(../input.1s)=
(VARDEF А) (SETVAR Б (- (+ (* 123 А) 564) (/ 30 (- 40 50)))) (Сообщить (+ "Мы тут посчитали, что Б=" Б))
;EOF(../input.1s)

уже фактически лисп (правда, pretty printing можно и покрасивее дописать, не через Tree.toStringTree. ну пока можно и indent-ом пользоваться).

осталось только дописать макросы для этих токенов: VARDEF, SETVAR, Сообщить и т.п. — и у тебя уже полноценный компилятор в лисп.

проверки семантики и типов, там правда, пока нет.

для твоего языка можно грамматику доработать, да и парсер надо бы с жабы на clojure переписать, хотя бы :-)

но уже есть что допилить, по крайней мере :)

пользуйся на здоровье.

чудеса — свершаются ! :)))

anonymous
()
Ответ на: комментарий от anonymous

den73 с другого компа

Чудеса бывают постоянно, но такого чуда не заказывал я. Транслятор с языка 7-ки (без запросов) в CL у меня уже давно есть и даже немалые куски рантайм-среды. Зачем мне второй такой же - я не знаю, да и первый зачем без реализации остальных частей платформы - тоже не знаю, зачем. Кроме того, есть проект 1Script, который гораздо далее продвинулся в этом направлении. Да и вообще, 1С не так плохо делает своё дело, чтобы стоило идти по её следам.

anonymous
()

Так или иначе, но на работу я в ближайшее время устроюсь. Посему проект разморожен. Буду делать его вечером после работы. Прошу отозваться ещё раз тех, кто готов участвовать в разработке.

den73 ★★★★★
() автор топика

выложил исполняемые файлы

И довольно много исходников. Но исходников транслятора не выкладываю пока что, во избежание преждевременных форков.

https://bitbucket.org/budden/l2

К сожалению, бинарный релиз только под офтопик. Зато его очень просто установить - достаточно скачать два архива и раскрыть их, а потом запустить один батник.

Транслятор никак не продвинулся за прошедшее время и вряд ли продвинется до конца каникул. Я всерьёз занялся проектированием языка, учу матчасть, читаю книжки, думаю. Трудности встречаются на каждом шагу. Но спешить тут нельзя, потому что ошибки, сделанные в начале разработки языка, потом исправить будет уже невозможно.

Если мой код покажется плохо организованным - я сразу это признаю. Я работал над упорядочиванием кода, но надо работать ещё и ещё. Это займёт время.

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ура, лингво-фрики на моём ЛОРе!

anonymous
()
Ответ на: комментарий от anonymous

язык сам по себе был образный, многомерный

Где можно узреть сии дiвные построения? Есть книги?

anonymous
()
Ответ на: комментарий от anonymous

Где можно узреть сии дiвные построения? Есть книги?

Американцы украли...

anonymous
()

Идея интересная.

Но пока не поздно, сделай полные ключевые слова «функция», «символ», «класс». Это очень важно.

Далее, напрягись и сделай завершение блока одним ключевым словом «конец». Все эти «кнцфунк», «кнццкл», «кнцесл» - это признак того, что автор языка перекладывает на плечи программера контроль за типом текущего блока. Но нафига это нужно программеру когда с этим справится компилер?

Ну и сразу заложи в лексический анализатор поддержку англоязычных алиасов.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

С ключевыми словами придумал другой способ сокращения:

1. Слова в 4 и менее букв не сокращаются

2. Если слово начинается с гласной, то гласная пишется.

3. Ударная гласная пишется.

4. Двойная согласная превращается в одинарную.

клас, функц, кнец, кнецфункц, сылк, частн, пбличн, прамтр, чист, для, цикл, пока, абслютн, отнситлн, сбщит, прйти, если, инач, прмен, стрка.

Мне это всё тоже не нравится, поэтому все соответствующие несокращённые слова будут пока что зарезервированы.

Все эти «кнцфунк», «кнццкл», «кнцесл» - это признак того, что автор языка перекладывает на плечи программера контроль за типом текущего блока.

А также это признак того, что компилятор легко объяснит ошибку структуры и что не будут нужны комментарии типа кнец //для . Другое дело, что кнецфункц - это слишком длинно.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Спасибо, друг, за добрые напутствия тебе. Прощай. Пока обнаружилась такая проблема с данным методом сокращений: модуль и модель. Я и раньше такие пары слов встречал. Кто ещё придумает? Пишите сюда.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Не сокращай мать твою за ногу слова, иначе никто нихера не поймёт ничего кроме тебя. Это уже даже не ругань это практически мальба.

Пусть язык будет многословен, НО это даст то что нужно энтуазиастам (иных не жди), а именно ясность написанного, отсуцтвие заучивания ебанутых на всю голову слов.

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

Чем это плохо

функция->число умножение(число a, число б)
{
   если(а > МАКСИМАЛЬНОЕ_ЦЕЛОЕ_ЧИСЛО ||
       б > МАКСИМАЛЬНОЕ_ЦЕЛОЕ_ЧИСЛО )
   { 
       печать("число слишком большое");
   };


 переменнея->число результат = 0;
 результат = а + б;
 вернуть результат;

}

юмор-моде Пусть он язык будет вундервафлей и будет полон тся ться жи ши и парашют обязательно

anonymous
()
Ответ на: комментарий от anonymous

Фигурные скобки требуют постоянного переключения раскладки - не годятся, я уже писал об этом.

В языке часто применяемые слова должны быть короткими. Это аксиома. Недаром союзы, артикли и местоимения в любом языке коротки. Все создатели языков пытаются сократить слова. В расте fn, в лиспе defun, в clojure def, в С вообще слово function отсутствует. В языке xbase были 4-буквенные сокращения: sele,brow и т.п. В Русском языке слова гораздо длиннее, чем в Английском, поэтому для нас это важнее.

goto - перейти
end - конец
begin - начало
let - пусть
void - пустая
mode - режим

Идея убрать гласные вообще оказалась неудачной. Без безударных гласных чуть лучше, но тоже пока неудовлетворительно. Желательно, чтобы система сокращений была удобной и не требовала зубрёжки. Но на худой конец можно, сделать таблицу сокращений, в которой не будет никакого закона - её нужно будет просто выучить. В конце концов, каждый из нас раньше учил таблицу умножения (порядка 36 правил) и Русский язык с огромной кучей особых случаев и исключений. И ничего, освоили как-то.

Пока что решения этого вопроса нет. Видимо, будет много зарезервированных и неиспользованных слов, из которых лишние потом перестанут быть зарезервированными. Но сначала нужно составить полный список ключевых слов, а для этого нужен стандарт.

Может быть, стоит на этот случай зарезервировать все слова, написанные маленькими буквами?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73
goto  - перейти - скок|прыг[нуть]
end   - конец   - всё
begin - начало  - так|вот
let   - пусть   - при|здесь|на|в|тут
void  - пустая  - ничё|без|это слово вообще можно не писать
mode  - режим   - мода
Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Это тоже сокращения, притом не вполне очевидные. Полный список ключевых слов - где-нибудь порядка 50 штук. Наверняка не для всех удастся подобрать. Хотя за «прыг» «скок» и «ничё» - спасибо, занесу в свой спец.файлик для таких слов.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Это тоже сокращения, притом не вполне очевидные

ну так тут терминология ещё не устоялась в русском языке. Твой язык будет диктовать моду и заложит основы основ.

Bad_ptr ★★★★★
()
Ответ на: комментарий от den73

Фигурные скобки требуют постоянного переключения раскладки - не годятся, я уже писал об этом.

Переключить раскладку быстрее, чем набирать несколько букв. И да, удобство набора - не главная характеристика синтаксис языка.

tailgunner ★★★★★
()
Ответ на: комментарий от elagagarina

Завёл страничку по ключевым словам. Шлите пулл реквесты. Или можно сюда. Я попозже постараюсь в теме найти ещё интересные слова, к-рые сюда постили.

https://bitbucket.org/budden/l2/src/default/doc/клчвые-слва.md?at=default&amp...

Страничку из вики удаляю, т.к. там плохо будет при одновременном редактировании.

den73 ★★★★★
() автор топика
Ответ на: комментарий от FRWHate

При подсчёте нажатий нужно еще положить наценку на постоянную загрузку мизинцев. А также на ошибки переключения.

С другой стороны, есть мнение, что удобочитаемость важнее «удобонаписаемости». Так что тут нет однозначно наилучшего решения. Но я много лет спокойно писал программы на Паскале и на разных диалектах SQL, где нет фигурных скобок. И ничего.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.