Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 21:21

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"
 
Odpovědět
12.10.2013 21:21
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 21:25

Myslel som zdrojak k tvojmu kompilatoru.

 
Nahoru Odpovědět
12.10.2013 21:25
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 21:30
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
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 21:47

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:12.10.2013 22:03

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
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 22:11

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:12.10.2013 22:19

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
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 22:21

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:12.10.2013 22:29

Ježiš - copak neznáš dbx?

 
Nahoru Odpovědět
12.10.2013 22:29
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 22:39

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
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 22:43

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
Kdosi:12.10.2013 22:55

http://en.wikipedia.org/…bx_(debugger)

 
Nahoru Odpovědět
12.10.2013 22:55
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 23:16

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:14.10.2013 14:03

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:14.10.2013 14:06

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:14.10.2013 14:08

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
Tvůrce
Avatar
Odpovídá na
Kit:14.10.2013 14:22

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:14.10.2013 15:14

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:14.10.2013 15:15

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

 
Nahoru Odpovědět
14.10.2013 15:15
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:14.10.2013 15:31

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
vitamin:14.10.2013 15:36

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:14.10.2013 15:41

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 22 zpráv z 72.