Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Zdravím,
do čeho je nejlepší kompilovat, dělám-li vlastní kompiler? Jako první mě napadá C. Což mi ale nepřijde moc originální. Dále se nabízí object file, ASM atp. Kde bude nejharmoničtější rovina mezi schopnostmi výsledku, náročností na vytvoření zdrojů (v ASM bych si hodně věcí musel udělat sám, i když bych mohl využívat C/... knihovny atd.), přenositelností výsledku a složitostí kompileru?
Děkuji.

 
Odpovědět 12.10.2013 18:21
Avatar
vitamin
Člen
Avatar
vitamin:

Kompiler sa vecsinou sklada z 2 cast: Frontend a Backend.

Frontend sa sklada vecsinou z:
1. Lexikalnej analyzy - stavovy automat co rozlozi text na tokeny.
2. Syntaktickej analyzy - z tokenov vytvori abstraktny syntakticky strom(AST), najjednoduhsie je pouzit rekruivny zostupny parser
3. Sematickej analyzy - tu sa hlavne kontroluju symboly, testuju typy, deklaracie funkcii a premennych pripadne aj dake transformacie a optimalizacie.

Z ast mozes potom generovat kod v inom jazyku ako napr C, mozes kod spustit(treba si naprogramovat interpreter). Alebo ho prelozit do bytecodu. Ja som zatial naprogramoval len frontendy a jednoduchy neoptimalizovany interpreter, takze v backendoch sa nevyznam. Momentlne mam rozrobeny jeden scriptovaci jazyk ktory prekladam do llvm bytecodu. Je to skvely projekt a tiez ti ho doporucujem, robi sa s nim skvelo. Vyuziva ho napr nvidia na preladac shaderov, je na nom postaveny Clang co preklada c, c++, Obj-C. Pouziva ho LDC pre D...
Samozrejme mozes pouzit aj napr Java bytecod alebo CLI...

Interpretery su pomale.
Compilery do hygh level jazykov sa blbo linkuju z inymi jazykmi a preklad je pomaly.
Najlepsie je pouit Daky bytecod: llvm ir, c--, cli, java bc, ...

Editováno 12.10.2013 19:15
 
Nahoru Odpovědět 12.10.2013 19:10
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Záleží na účelu. Pokud by to měl být univerzální jazyk, tak bych se do toho asi vůbec nepouštěl a vybral bych si některý ze stovek jazyků. Pokud bych chtěl něco speciálního k nějakému účelu, tak bych si z nějakého hotového jazyka vytvořil interpretr svého jazyka. Vytvářením kompilátoru bych se v dnešní době nezatěžoval.

Nahoru Odpovědět 12.10.2013 19:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Díky - ale na to jsem se neptal. Já nejsem začátečník. Parser mám. Mám už prostě vše v polích atd. Teď už to jen potřebuji uložit. Nemá to být přímo vlastní jazyk. Chtěl jsem jen udělat nadstabu C. Tedy přidat do základního setu typ string, dynamické pole a další drobnosti, co dnes a denně lidi otravují. Navíc jsem ten syntaqx udělal dosti volný. Když nebude lepší návrh, tak půjdu buď do C, anebo do object file...

 
Nahoru Odpovědět 12.10.2013 19:34
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Na tyto záležitosti by mohl být dobrý Python. Pokud by se jednalo o drcení čísel a záleželo na výkonu, tak Fortran. Na operaci s maticemi Matlab, resp. Octave.

Nahoru Odpovědět 12.10.2013 19:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Ten tvůj sáhodlouhý výpis jsem sfouknul bez regexu a vůbec - jen 3x projedu soubor znak po znaku. (Má to 324 řádků.) Syntax není hotov, ale ukázka:

define ``
+main wet - = 0 -. ki; . op;
. ot = 25 . a256 = 256
. ahh = ":)"
+- oop = ''Ahoj! :D'' . iikl = '''' . dhc;
. dfd = '':D
OoO...''
``

block main

        print 'end'Toto je testovací program.
        Díky '' můžu psát cokoliv, dokud nebude nalezen protipól...''
        Atd...'end'

        into dhc

        call some, 0x2AH, 32 ~ (2 * PI)

<

block start

        call main

        sub a256, 6

        mult a256, 4

        div a256, 10

        print a256

block some

        set op, wet + ot

        add wet, op

        into ki

        call next, a256/3*9

return ki

block next

        define ``uh = 5``

        branch ahh

return uh

<

Mezi ` a ' lze dát cokoliv bez whitespaců - uzavírací část musí být stejná. Mezi `` je definice proměnných, mezi '' stringy a mezi "" komentáře. Čím více " je komentář uveden, tím více " v něm lze použít... """ "" """... < ukončuje blok. Pokud pod blokem bez < je otevřen další blok, stává se podblokem... (OOP) set je =, add, +=, div /= atd. Jinak to podporuje operátory &, |, +, -, *, /, ^ a odmocninu - ~...

 
Nahoru Odpovědět 12.10.2013 19:41
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

Ale to pak ta nadstavba ztratí smysl. Interpretovaný jazyk se nikdy nedorovná Cčku...

 
Nahoru Odpovědět 12.10.2013 19:43
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Ak ta nezaujima rychlost prekladu tak to kludne prekladaj do C.
Das sem zopar prikladov tych vylepseni?

 
Nahoru Odpovědět 12.10.2013 19:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

A co třeba D? Ten jazyk umí všechno co C a je objektový.

Nahoru Odpovědět 12.10.2013 19:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:
  • a - v ` bloku značí viditelnost - + od současného/uve­deného bloku, anebo -. +- je pak public a -- je internal...
 
Nahoru Odpovědět 12.10.2013 19:44
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

V D dělám. Já vím - jen si hraji. Kdo si hraje nezlobí... :D Ale i D má své mouchy. Proč si někdo dá takovou práci s nadstavbou C++ a neudělá dynamický linker? Ale jo - já D miluji...

 
Nahoru Odpovědět 12.10.2013 19:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Zkusil jsem si v Octave násobit matice. Bylo to výrazně rychlejší, než v C, protože tam byl použit lepší algoritmus. Přitom Octave je interpretr.

Nahoru Odpovědět 12.10.2013 19:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Ten, kdo potřebuje dynamický linker, použije Javu nebo C#.

Nahoru Odpovědět 12.10.2013 19:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Dynamicky linker ma byt v dmd 2.064 +- za mesiac.

 
Nahoru Odpovědět 12.10.2013 19:48
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

Ale D je už vpodstatě C#... K vylepšením - jak jsem psal - díky podblokům z toho lze udělat krásně OOP. Má to totiž i příkaz namespace:

namespace ddd

block ddd

block subblock

<

Dále pak automatická správa paměti => dynamická pole bez alokace paměti atd.

 
Nahoru Odpovědět 12.10.2013 19:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na vitamin
Kit:

To jsi neměl psát. Teď budou všichni chtít programovat v D :)

Nahoru Odpovědět 12.10.2013 19:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

A proč ne? Je to dokonalý jazyk. Jen mě štve, že tam kde chtějí C++ mi jej většinou nedovolí... :D

 
Nahoru Odpovědět 12.10.2013 19:54
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Na D mě zaujalo víc věcí:

  • má přímou podporu pro odlišné zpracování programu pro různé architektury a operační systémy
  • má vestavěnu podporu TDD. Jiné jazyky ji nemají a dohánějí to frameworky. Je to unikátní vlastnost
  • má přímou podporu pro contract programming. Další unikátní vlastnost vhodná pro TDD
  • předchozí dvě vlastnosti se pro release dají vypnout parametrem při kompilaci a tím se produkční kód zrychlí
  • umí automaticky zavřít otevřený soubor ihned po opuštění bloku, kde byl soubor otevřen
  • hojně se v něm využívají immutable objekty, což zvyšuje spolehlivost programu
  • má fungující destruktory
  • má přetěžování operátorů
  • je cool :)
Nahoru Odpovědět 12.10.2013 19:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:

Tak ja dufam ze D casom nahradi c++. Z pohladu navrhu jazyka je to genialny jazyk.

 
Nahoru Odpovědět 12.10.2013 19:55
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Jak jsem psal... :D Hlavně je geniální, že má přímý kontakt s vyššími i nižšími úrovněmi. Hrabat se v pointerech a mít přitom automatickou správu atd... Tak si říkám - měl by se vydat směrem virtuálního stroje?

K mému problému - nemám já jít do virtuálního stroje? :D Že bych sice interpretoval, ale už zkompilovaný kód...

 
Nahoru Odpovědět 12.10.2013 19:59
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:

Mna najviac zaujali tranzitivne kvalifikatory immutable, const.
Potom implementacia pure funkcii ktora ma volnejsie pravidla oproti funkcionalnym jazykom a vdaka tomu sa skvele kombinuje funkcionalne a impreativne programovanie.
Velmi zaujimave su moduly a to ze neexistuje globalny namespace a sposob ako funguju importy. Vdaka tomu ze v D neexistuju namespace sa dobre pouziva UFCS...

 
Nahoru Odpovědět 12.10.2013 20:01
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Ak pozies LLVM, tak tvoj kod prelozis do bytecodu ktory mozes interpretovat, mozes pouzit vstavany JIT compiler, mozes ho prelozit do .o suborov alebo rovno do binarky...

 
Nahoru Odpovědět 12.10.2013 20:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Určitě bych šel do toho virtuálního stroje. Pomalé to nebude.

Nahoru Odpovědět 12.10.2013 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

CIL bude asi uzavřený - co?

 
Nahoru Odpovědět 12.10.2013 20:06
Avatar
vitamin
Člen
Avatar
vitamin:

Existuje mono takze je asi otvoreny. Z bezneho pohladu na tvoj jazyk sa ale bojim ze CLI je Vyzsi jazyk ako ten tvoj :D

Editováno 12.10.2013 20:11
 
Nahoru Odpovědět 12.10.2013 20:11
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Je to takový nízko-vysoký jazyk... :D Prozatím jej interpretuji právě v D...

 
Nahoru Odpovědět 12.10.2013 20:13
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Praktičtější kód:

namespace System.Console

define ``Start+ volume = 25`` "Vytvoří proměnnou v bloku Start, která bude viditelná i pro jeho potomky..."

block Start

define `definice`string = '':D''`definice` ". v definicích hoře říká, ať se použije minulý blok, pro který je proměnná definována a viditelnost - tu lze upravit"

call WriteLine, string + "..." + volume

into volume "into nastaví pointer budoucího return na tuto proměnnou"

call PromennaSVystupem, param1,2, 3, 4,...

< "ukončení bloku..."
 
Nahoru Odpovědět 12.10.2013 20:21
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Pod nadstavbou C som si predstavoval nieco ine :)

 
Nahoru Odpovědět 12.10.2013 20:22
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Jo dědění:

inherit ExistujícíBlok, NovýBlok

Vše co jsem zde poslal zkratkovitě má i plnou verzi - aby si nikdo nestěžoval na obtížnost orientace a zapamatování si...

 
Nahoru Odpovědět 12.10.2013 20:23
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Je to hodně špatné? :D

 
Nahoru Odpovědět 12.10.2013 20:24
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Ano :), uz chapem ako si mohol spravyt kompilator na necelych 400 riadkov. (U mna ma len obycajny lexer cez 2K )

Editováno 12.10.2013 20:27
 
Nahoru Odpovědět 12.10.2013 20:27
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

A tak - co se ti nezdá? Mezi ' a ` můžeš dát cokoliv - i nic. Můžeš používat zkratky i plné příkazy,... Pošlu normální kód ještě:

define ``
string = ''Dobrý den...''
``

block Start

    ...

Nezáleží na whitespacech - na ničem...

 
Nahoru Odpovědět 12.10.2013 20:30
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Ako deklarujes premenne a funkcie?
Ako vytvaras podmienky?
Ako zapises a + b * c; ?

 
Nahoru Odpovědět 12.10.2013 20:33
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Funkce to nemá. Jen bloky příkazů. S libovolnými parametry - jsou chtány za běhu - stejné nevýhody jako u interpretovaného jazyka.

definice proměnných:

define cokolivmajitel viditelnost název = hodnota (anebo ; a bez hodnoty)

. opakuje majitele a viditelnost

Bez zadání majitele se použije místo, kde je definováno

viditelnost je +, - a -- - +- je public... majitel+ - viditelnost i pro potomky

definice bloku:

block název

block vnořenýBlok

< "ukončení"

block Blok

<

block NevnořenýBlok

<

Dědění:

inherit ExistujícíBlok, NovýBlok

A s operátory mám normálně +, -, *, /, |, &, ^ a odmocnina je ~.

define ``ddd = 25 Start- eee = 258 . iii = 416 + 256 . k;``

block Start

set k, ddd ~ (eee / iii)

<

Takže?

 
Nahoru Odpovědět 12.10.2013 20:40
Avatar

Neregistrovaný
Avatar
:

To divné cokoliv má být mezi `... Mezi ` a ' lze dát jakýkoliv demiliter. U ` je to pak pro funkčnost structu - lze to používat jako struct - pojmenovaný blok definic proměnných... U stringu je to na demiliter... (oddělovač)

 
Nahoru Odpovědět 12.10.2013 20:42
Avatar

Neregistrovaný
Avatar
:

Přehlednost zajistí nové řádky... Jak jsem psal - bílé znaky musí být jen mezi slovy...

define ``

ddd = 25
Start- eee = 258
. iii = 416 + 256
. k;
       ``
 
Nahoru Odpovědět 12.10.2013 20:45
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Mohl bych se zeptat na účel toho jazyka? Pokud potřebuji jen zpracovat nějaká vstupní data, tak na to si dělám jednořádkové filtry, které jsou schopny zpracovat data rychleji, než jakou rychlostí je schopen disk dodávat.

Nahoru Odpovědět 12.10.2013 20:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

Je to nadstavba C - to je účel. Má to funkčnost C + dynamyckou správu paměti, automatické typování atd...

 
Nahoru Odpovědět 12.10.2013 20:50
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Mam taky dojem ze nevies ako vytvarat vnorene bloky preto mas vsetko na jednej urovni (premenne deklarujes na globalnej urovni a nastavujes viditelnost pre konkretne bloky). Dalej mas zrejme problem vytvorit priority operatorov a asi nemas implementovane podmienky, cykly...
Miesto ` ... `
mozes pouzit { ... } alebo ( ... )

 
Nahoru Odpovědět 12.10.2013 20:53
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Doprucujem ti precitat si toto:
http://www.amazon.com/…=as_li_ss_tl?…
(Je aj pdf na TPB)

 
Nahoru Odpovědět 12.10.2013 20:57
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Ale houby - je to jen možnost - můžeš je deklarovat přímo v daném bloku. Takto může vypadat deklarace: `a=6`

Slavné úrovně tedy:

namespace ddd

    block eee

        block iii

    <

Lepší? Cykly a větvení vedu.

bloky...

switch promenna

    case value, blok, možný break - ne nutný
...

Cykly vše mám. Tvl. Já programuji už nějaký ten pátek - a dobře...

 
Nahoru Odpovědět 12.10.2013 21:00
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Ty ` musí být 2 na začátku a nakonci - ale zde je mi to schramsnuto...

Jsou tam i podmíněné skoky atd.

block ddd

<

block eee

set iii, ooo
add ooo, 25 + 6 "ooo += 25 + 6"

    block ggg

    ...

<
 
Nahoru Odpovědět 12.10.2013 21:03
Avatar

Neregistrovaný
Avatar
:
``- a = 6``

A je to pro současný blok + potomky... -- by bylo internal...

 
Nahoru Odpovědět 12.10.2013 21:04
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Nemohu se zbavit dojmu, že vynalézáš ještě lepší kolo, nežli já :)

Nahoru Odpovědět 12.10.2013 21:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar

Neregistrovaný
Avatar
:

Lokální proměnná:

block ddd

define ``- index = 0``

<

tady už ji neuvidím

inherit ddd, new

set index, 6 "v potomkovi ji vidím díky -..."
 
Nahoru Odpovědět 12.10.2013 21:07
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Mozes napisat neco taketo?

block A
    define ``a = 1``
    block B
        define ``b = 2``

        set b, b+a*2      //operator * ma vecsiu prioritu ako +
    <
    set a, b+2     //chyba, b nie je deklarovane v bloku A
<
 
Nahoru Odpovědět 12.10.2013 21:08
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Však tak to je... Ale místo set b použiješ add b, ...

 
Nahoru Odpovědět 12.10.2013 21:12
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Komenty jsou v ""...

set b, b+a*2

Lze, ale lepší je:

add b, a * 2

 
Nahoru Odpovědět 12.10.2013 21:13
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Daj sem zdrojak ak mozes :)

 
Nahoru Odpovědět 12.10.2013 21:14
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

+- viditelnost to pak ještě upraví - třeba pro nižší bloky, anebo vyšší, anebo externí...

 
Nahoru Odpovědět 12.10.2013 21:14
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Dyť je ho tu tuny... :D Je to jak jsi psal...

  • mohu deklarovat všechny proměnné na jednom místě - i lokální - jen určím, že budou existovat pouze pro ten a ten blok...
``blokA+ název = 'demiliter'cokoliv'demiliter'``

Anebo tu proměnnou definuji až v bloku A - jak se mi to líbí.

`name`
a;
b;
c;
d;
`name`

Vytvoří struct name...

"struct name, jméno, hodnoty - první je a, pak b, pak c jednotlivé hodnoty tedy:"

``eee;``

struct name, eee, 25, 26, 38, 40 "zbytek bude null"

into ki

call BlokA, eee "předal jsem strukturu..."


block BlokA


return @param1 "lze i @1 - vycucne první parametr - lze i použít příkaz validate @1, dataType"
 
Nahoru Odpovědět 12.10.2013 21:21
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Myslel som zdrojak k tvojmu kompilatoru.

 
Nahoru Odpovědět 12.10.2013 21:25
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:
import std.conv;
import std.file;

struct Variable
{
        string parent, visibility, name, value;
}

struct CMD
{
        string name;

        string[] parameters;
}

void main(string[] args)
{
        string[]

                strings,
                variables;

        CMD[] commands = ParseCMDs(ParseQuote(RemoveComments(ParseQuote(readText(args[1]), &strings, '\'', '$')), &variables, '`', '&'));

        Variable[][] variableAreas;

        foreach(variable; variables)
        {
                int count = variableAreas.length;

                ++variableAreas.length;

                variableAreas[count] = ParseVars(variable);
        }

        write("model.tu", "");

        foreach(vars; variableAreas)
                foreach(var; vars)
                        append("model.tu", var.name ~ "\n");
}

string ParseQuote(string source, string[]* specifics, int mark, char literal)
{
        string

                result = "",
                specific = "",
                demiliter = "",
                potDemiliter = "";

        string* target = &result;

        foreach(letter; source)
                switch(letter)
                {
                        case mark:

                                if(target == &demiliter)
                                {
                                        target = &specific;
                                        break;
                                }
                                else if(target == &specific)
                                        target = &potDemiliter;
                                else if(target == &potDemiliter)
                                {
                                        if(demiliter == potDemiliter)
                                        {
                                                int count = (*specifics).length;

                                                ++(*specifics).length;

                                                target = &result;
                                                (*specifics)[count] = specific;

                                                potDemiliter = demiliter = specific = "";

                                                result ~= literal ~ to!string(count);

                                                break;
                                        }
                                        else
                                        {
                                                target = &specific;
                                                specific ~= potDemiliter;

                                                potDemiliter = "";
                                        }
                                }
                                else
                                        target = &demiliter;

                        goto default;

                        case 10:

                                if(target == &specific)
                                        specific ~= "\\n";
                                else
                                        result ~= ' ';

                        break;

                        case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31:

                                if(target == &specific)
                                        specific ~= letter;

                        break;

                        default:

                                *target ~= letter;

                        break;
                }

        return result;
}

string RemoveComments(string source)
{
        int

                quote = 0,
                potQuote = 0;

        string result = "";

        bool close = true;

        foreach(letter; source)
                if(close)
                {
                        if(letter == '"')
                                quote++;
                        else if(quote > 0)
                                close = false;
                        else
                                result ~= letter;
                }
                else if(letter == '"')
                        potQuote++;
                else if(quote == potQuote)
                {
                        close = true;
                        quote = potQuote = 0;
                }
                else
                        potQuote = 0;

        return result;
}

Variable[] ParseVars(string source)
{
        string

                visibility = "",
                lastParent = "",
                lastVisibility = "";

        string[] target = [ "", "", "" ];

        Variable[] result;

        short whitespace = 0;

        source ~= 32;

        foreach(letter; source)
                switch(letter)
                {
                        case '=':

                                whitespace = 2;

                        break;

                        case '+', '-':

                                visibility ~= letter;

                        break;

                        case ';':

                                target[2] = "none";

                        case 32:

                                if(whitespace == 0 && target[0] != "")
                                        whitespace = 1;

                                if(target[2] != "")
                                {
                                        int count = result.length;

                                        if(target[0] == ".")
                                        {
                                                target[0] = lastParent;
                                                visibility ~= lastVisibility;
                                        }
                                        else if(target[1] == "")
                                        {
                                                target[1] = target[0];
                                                target[0] = "";
                                        }

                                        ++result.length;

                                        lastParent = target[0];
                                        lastVisibility = visibility;

                                        result[count] = Variable(lastParent, visibility, target[1], target[2]);

                                        target[] = visibility = "";
                                        whitespace = 0;
                                }

                        break;

                        default:

                                target[whitespace] ~= letter;

                        break;
                }

        return result;
}

CMD[] ParseCMDs(string source)
{
        string

                value = "",
                name = "";

        string[] values;

        string* target = &name;

        bool

                stay = false,
                noSplit = true,
                noIgnor = true;

        CMD[] result;

        foreach(letter; source)
                switch(letter)
                {
                        case '<':

                                int count = result.length;

                                ++result.length;

                                result[count] = CMD("<", null);

                        break;

                        case '+', '-', '*', '/', '^', '~', '(', ')':

                                noSplit = false;
                                *target ~= letter;

                        break;

                        case ',':

                                stay = true;

                        case 32:

                                noIgnor = true;

                        break;

                        default:

                                if(noIgnor && noSplit)
                                {
                                        if(value != "" || stay)
                                        {
                                                int count = values.length;

                                                ++values.length;

                                                values[count] = value;

                                                value = "";

                                                if(stay)
                                                        stay = false;
                                                else
                                                {
                                                        count = result.length;

                                                        ++result.length;

                                                        result[count] = CMD(name, values);

                                                        name = "";
                                                        values = [];
                                                        target = &name;
                                                }
                                        }
                                        else if(name != "")
                                                target = &value;
                                }

                                *target ~= letter;
                                noIgnor = false;
                                noSplit = true;

                        break;
                }

        return result;
}

Trochu prasekódu nikdy neuškodí... :D Dalším objektem je pak interpreter...

Co tedy říkáte na syntax?

 
Nahoru Odpovědět 12.10.2013 21:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Vypadá to hrozně. Nechápu, proč máš každý druhý řádek prázdný a proč nepíšeš složené závorky u podmíněných příkazů. A také nikde nevidím slovo unittest. Jak to testuješ?

Nahoru Odpovědět 12.10.2013 21:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

V debuggeru? Jako ono není co testovat - výsledek vidím v souboru, do kterého jej ukládám - a vidím, že to jede jak má... Neboť už v tom 3 dny programuji... (V tom svém jazyce.)

 
Nahoru Odpovědět 12.10.2013 22:03
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

K čemu je dobrý debugger?

Nahoru Odpovědět 12.10.2013 22:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

K debuggingu? K sledování programu v reálném čase? Jestli takto nepoznám, že program funguje, tak asi nijak... :D

 
Nahoru Odpovědět 12.10.2013 22:19
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

A to jako děláš ten debugging ručně? Koukáš na výsledky a podle toho odhaduješ, zda program funguje?

Nahoru Odpovědět 12.10.2013 22:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Ježiš - copak neznáš dbx?

 
Nahoru Odpovědět 12.10.2013 22:29
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

dbx neznám. K čemu je to dobré?

Nahoru Odpovědět 12.10.2013 22:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Vidím v nabídce e-shopu OpenDBX, ale to je databáze.

Nahoru Odpovědět 12.10.2013 22:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
 
Nahoru Odpovědět 12.10.2013 22:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

To jsem také našel. Podle popisu je to zbytečnost. Testy toho umí víc.

Nahoru Odpovědět 12.10.2013 23:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Ucelenější kód:

define
``
        +main wet - = 0 -. ki; . op;
        . ot = 25 . a256 = 256
        . ahh = ":)"
        +- oop = ''Ahoj! :D''
        . iikl = ''''
        . dhc;
        . dfd = '':D
        OoO...''
``

jump Start

namespace Program

block Test

        print 'end'Toto je testovací program.
        Díky '' můžu psát cokoliv, dokud nebude nalezen protipól...''
        Atd...'end'

        into dhc

        call Some, 0x2AF, 32 ~ (2 * PI)

<

block Main "Všechny příkazy mezy 2ma otevřeními bloků jsou brány jako obsah konstruktoru..."

        call main

        sub a256, @1

        mult a256, @2

        div a256, @3

        print a256

        block Some "Vše po Some se zavolá při vytvoření instance..."

                set op, wet + ot

                add wet, @1 / @2

                into ki

                call Next, a256/3*9

        return ki

        block Next

                define ``uh = 5``

        return uh

<

into Start "Do start se vloží instance Main..."

new Main, 6, 4, 10

call Start.Some, 5, 6

inherit Main, NewMain

        if @1 == {null, 25, ":D"} "Výčet hodnot je vždy mezi {}..."
                print '':O'' "Inline if - jinak lze vzít jako blok a ukončovat tedy <..."

        while ...
        "Zde je vše bráno jako tělo bloku"
        <
<

call NewMain

A protože nezáleží na whitespacech, lze to naformátovat jakkoliv - celé to může být na jednom řádku atd...

 
Nahoru Odpovědět 14.10.2013 14:03
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

Ano - jump do Start by nešlo - prostě kamkoliv... :D A call main má být velkým a je to rekurze...

 
Nahoru Odpovědět 14.10.2013 14:06
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:

A ještě jse zapoměl, že mezi () lze napsat subblok - call Main, (call Ooo, (call Eee, (call Ddd)))...

 
Nahoru Odpovědět 14.10.2013 14:08
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Ten tvůj poslední zápis mi silně připomíná Lisp. Jen ty čárky jsou tam nějak navíc :)

Nahoru Odpovědět 14.10.2013 14:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:

Neznám jazyk, kde si demilitery můžeš navrhnout... Dále, které by demiliter vzali jako název structu... A dále, které by umožňovali brát jen část názvu klíčového slova. Totiž plánuji a už skoro mám systém takový, že se nehledá klíčové slovo podle přesně daného pole znaků, ale můžeš zkracovat, dokud je daný tvar dostatečně jedinečný... Z addition můžeš tímpádem udělat jak add, tak i jen ad - protože na ad nic jiného nezačíná... Z block klidně jen b atd... Kompiler ti kdyžtak napíše, ať přidáš znak, jelikož by mohlo docházet ke kolizím... A takovýchto věciček tam přibývá extrémním tempem...

 
Nahoru Odpovědět 14.10.2013 15:14
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kdosi
Kdosi:

Sorry - PHP umožňuje udělat vlastní demiliter - tak fail no... :D

 
Nahoru Odpovědět 14.10.2013 15:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kdosi
Kit:

Ze zkracování slov mě vyléčil editor Vim. Doplňuje za mne klíčová slova i identifikátory proměnných. Co víc si přát?

Nahoru Odpovědět 14.10.2013 15:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
vitamin:

Napr v c++ si u stringov mozes vytvorit vlastny delimiter:

R"XYZ(
   moze obsahovat
   viac riadkov a kludne aj znaky ako "
   ...
)XYZ"

Umoznit pouzivat skratene nazvy indentifikatorov a klucovych slov bude vo vecsom projekte peklo...
Zaroven bude kompilacia pomala.

 
Nahoru Odpovědět 14.10.2013 15:36
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:

Není. Jede to naopak rychleji... :D (Stejně kontroluji jen tu nutnou část - ne celá slova.) Rozhodl jsem se navíc pro vlastní bytecode. Jeho interpret má zatím jen 80 řádků - takže ho asi budu přikládat přímo do souboru...

 
Nahoru Odpovědět 14.10.2013 15:41
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 72 zpráv z 72.