Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 18:21

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

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

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

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

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

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

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

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

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:12.10.2013 19:44
  • 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:12.10.2013 19:46

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

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

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

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

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

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

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

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

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

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:12.10.2013 20:01

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:12.10.2013 20:02

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

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:12.10.2013 20:06

CIL bude asi uzavřený - co?

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

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:12.10.2013 20:13

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:12.10.2013 20:21

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

Pod nadstavbou C som si predstavoval nieco ine :)

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

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:12.10.2013 20:24

Je to hodně špatné? :D

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

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:12.10.2013 20:30

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:12.10.2013 20:33

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:12.10.2013 20:40

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
:12.10.2013 20:42

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
:12.10.2013 20:45

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:12.10.2013 20:46

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:12.10.2013 20:50

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:12.10.2013 20:53

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:12.10.2013 20:57

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:12.10.2013 21:00

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

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
:12.10.2013 21:04
``- 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:12.10.2013 21:06

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
:12.10.2013 21:07

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:12.10.2013 21:08

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:12.10.2013 21:12

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:12.10.2013 21:13

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:12.10.2013 21:14

Daj sem zdrojak ak mozes :)

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

+- 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: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"
 
Nahoru Odpovědět 12.10.2013 21:21
Avatar
vitamin
Člen
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
Redaktor
Avatar
Odpovídá na Kdosi
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
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
Redaktor
Avatar
Odpovídá na Kdosi
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 Kdosi
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 72 zpráv z 72.