Diskuze: Do čeho kompilovat?
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í... Dalším objektem je pak interpreter...
Co tedy říkáte na syntax?
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š?
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.)
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...
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?
Kit:12.10.2013 23:16
To jsem také našel. Podle popisu je to zbytečnost. Testy toho umí víc.
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...
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
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...
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?
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.
Kdosi:14.10.2013 15:41
Není. Jede to naopak rychleji... (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...
Zobrazeno 22 zpráv z 72.