From 1ccc95517f49098987cf69eff546742ec8d71fc3 Mon Sep 17 00:00:00 2001 From: afonya Date: Wed, 18 Jun 2025 17:01:55 +0200 Subject: [PATCH] made everything deployable, added license, added readme --- LICENSE | 7 + README.md | 26 ++ docs/versioned_docs/version-1.0.0/asx.md | 110 +++++++ .../version-1.0.0/enviroment.md | 185 +++++++++++ docs/versioned_docs/version-1.0.0/intro.md | 23 ++ .../version-1.0.0/langfunctions.md | 301 ++++++++++++++++++ docs/versioned_docs/version-1.0.0/syntax.md | 49 +++ .../version-1.0.0-sidebars.json | 8 + docs/versions.json | 1 + extension/asl.png | Bin 0 -> 14226 bytes extension/astrolang-extension-1.0.0.vsix | Bin 0 -> 17625 bytes extension/package.json | 7 +- 12 files changed, 715 insertions(+), 2 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/versioned_docs/version-1.0.0/asx.md create mode 100644 docs/versioned_docs/version-1.0.0/enviroment.md create mode 100644 docs/versioned_docs/version-1.0.0/intro.md create mode 100644 docs/versioned_docs/version-1.0.0/langfunctions.md create mode 100644 docs/versioned_docs/version-1.0.0/syntax.md create mode 100644 docs/versioned_sidebars/version-1.0.0-sidebars.json create mode 100644 extension/asl.png create mode 100644 extension/astrolang-extension-1.0.0.vsix diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e66f844 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2025 Afonya + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c215016 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# Astro Lang +Egy magyar + GenZ programozási nyelv + +--- + +## Miben jobb: +- többszavas változók +- magyar kulcsszavak +- teljes értékű dokumentáció +- Rustban írt + +--- + +## Példa: +```asl +gethelj a = 10 +ugass(a) +``` + +--- + +Weboldal és dokumentáció: [itt](https://astrolang.afonyanet.hu) + +Kiadások: [itt](https://git.afonyanet.hu/afonya/AstroLang/releases) + +Licensz: MIT \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/asx.md b/docs/versioned_docs/version-1.0.0/asx.md new file mode 100644 index 0000000..7062399 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/asx.md @@ -0,0 +1,110 @@ +--- +sidebar_position: 5 +description: Az ASX fájl leírása +--- + +# ASX (Astro Lang Executable) fájl + +--- + +:::info + +ASX Verzió: `0.2.0` + +::: + +:::info + +Ezt megtudod nézni a `ASL viewx ` parancs használatával. + +::: + +## Fájl felépítése: +|Név|Leírás|Méret| +|---|---|---| +|Doctype: ASX|Elmondja a fájlról, hogy tényleg ASX.|3 bytes| +|Verzió|Elmondja a fájl ASX verzióját. (byte.byte.byte)|3 bytes| +|Funkciók száma|Elmondja, hogy mennyi funkció van a fájlban.|4 bytes| +|Funkciók|Lásd: [Funkciók](#funkciók)|| + +## Funkciók: +|Név|Leírás|Méret| +|---|---|---| +|Változók száma|Elmondja, hogy a funkcióban mennyi változó van.|4 bytes| +|Változók|Lásd: [Változók](#változók)|| +|Szövegek száma|Elmondja, hogy a funkcióban mennyi szöveg van.|4 bytes| +|Szövegek|Lásd: [Szövegek](#szövegek)|| +|Funkciók száma|Elmondja, hogy a funkcióban mennyi funkció meghívás van.|4 bytes| +|Funkciók|Lásd: [Funkció meghívások](#funkció-meghívások)|| +|Catch pos|Megmutatja a catch funkció helyzetét, csak try-ban. Normál funkciók esetén 0|4 bytes| +|Instrukciók száma|Elmondja, hogy a funkcióban mennyi instrukció van.|4 bytes| +|Instukciók|Lásd: [Instrukciók](#instrukciók)|| + +## Változók: +|Név|Méret| +|---|---| +|Változó nevének hossza|4 bytes| +|Változó neve|| +|Változó ID-je|3 bytes| +|Változó kezdő ponja|4 bytes| +|Változó végpontja|4 bytes| + +## Szövegek: +|Név|Méret| +|---|---| +|Szöveg ID-je|3 bytes| +|A szöveg hossza|4 bytes| +|A szöveg|| + +## Funkció meghívások: +|Név|Méret| +|---|---| +|A meghívás ID-je|3 bytes| +|A meghívott funkció pozíciója|4 bytes| + +## Instrukciók: +:::info + +Minden instrukció végére hozzáadunk még 3 bit-et, így összesen 10 byte-ba belefér minden instrukció. + +::: +|OP Code - 5 bits|Rövid név|Leírás|Arg1 - 4 bits|Arg2 - 64 bits|Arg3 - 4 bits| +|---|---|---|---|---|---| +|0|HLT|Befejezi a program futtatását|||| +|1|LDS|Betölt egy szöveget a regiszterbe|R(A)|Szöveg ID|| +|2|LDM|Betölti a változót a memóriából|R(A)|Változó ID|| +|3|LDI|Betölt egy számot a regiszterbe|R(A)|Szám|| +|4|LDB|Betölt egy logikai értéket a regiszterbe|R(A)|Logikai érték|| +|5|LDF|Betölt egy funkciót a regiszterbe|R(A)|Funkció ID|| +|6|LDN|Betölt egy null-t/táblát a regiszterbe|R(A)|Ez egy tábla?|| +|7|ASS|Hozzáad egy változó ID-t a regiszerhez|R(A)|Változó ID|| +|8|UNB|Leválaszja a regiszterről a változót|R(A)||| +|9|MOV|Átmásolja R(A) pointerjét R(B)-be|R(A)|R(B)|| +|10|ADD|`R(C) = R(A) + R(B)`|R(A)|R(B)|R(C)| +|11|SUB|`R(C) = R(A) - R(B)`|R(A)|R(B)|R(C)| +|12|MUL|`R(C) = R(A) * R(B)`|R(A)|R(B)|R(C)| +|13|DIV|`R(C) = R(A) / R(B)`|R(A)|R(B)|R(C)| +|14|POW|`R(C) = R(A) ^ R(B)`|R(A)|R(B)|R(C)| +|15|MOD|`R(C) = R(A) % R(B)`|R(A)|R(B)|R(C)| +|16|AND|`R(C) = R(A) && R(B)`|R(A)|R(B)|R(C)| +|17|OR|`R(C) = R(A) \|\| R(B)`|R(A)|R(B)|R(C)| +|18|EQ|`R(C) = R(A) == R(B)`|R(A)|R(B)|R(C)| +|19|NEQ|`R(C) = R(A) != R(B)`|R(A)|R(B)|R(C)| +|20|GRE|`R(C) = R(A) > R(B)`|R(A)|R(B)|R(C)| +|21|GRQ|`R(C) = R(A) >= R(B)`|R(A)|R(B)|R(C)| +|22|LES|`R(C) = R(A) < R(B)`|R(A)|R(B)|R(C)| +|23|LEQ|`R(C) = R(A) <= R(B)`|R(A)|R(B)|R(C)| +|24|NOT|`R(B) = !R(A)`|R(A)|R(B)|| +|25|JMP|Oda ugrik a kódban||Hely|| +|26|CJP|Oda ugrik a kódban, ha a regiszter igaz|R(A)|Hely|| +|27|CAL|Meghív egy funkciót, majd a kimenetet elmenti R(B)-be|R(A)|R(B)|| +|28|PSH|Egy értéket belerak a következő funkció bemeneteihez|R(A)||| +|29|RET|Visszad egy értéket|R(A)||| +|30|GET|Lekér egy értéket a táblából `R(C) = R(A)[R(B)]`|R(A)|R(B)|R(C)| +|31|SET|Beállít egy értéket a táblának `R(A)[R(B)] = R(C)`|R(A)|R(B)|R(C)| + +:::tip + +Ha az ENV-ből szeretnénk lekérni valamit akkor a `GET`-et kell használni, úgy, hogy `R(A) = 0`! + +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/enviroment.md b/docs/versioned_docs/version-1.0.0/enviroment.md new file mode 100644 index 0000000..54e6b31 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/enviroment.md @@ -0,0 +1,185 @@ +--- +sidebar_position: 4 +description: Az Astro Lang környezete +--- + +# Környezet + +--- + +## Alapfunkciók +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|ugass|Kíírja a megadott értékeket.|`ugass(...)`|`ugass(6,7,szaft"test"szaft)`| +|bimba|Várakozik adott ideig (miliszekundum-ban).|`ugass(ms: number)`|`bimba(1000)`| +|csömör|Hibával befejezi a programot.|`csömör(error: string)`|`csömör(szaft"Sikertelen: Sikeresen befejezve!"szaft)`| +|tarh|Kíírja, hogy a megadott érték milyen típusú.|`tarh(object: any): string`|`tarh(82)`| +|bimbabemb|Átalakítja a megadott érétk típusát, ha lehetséges.|`bimbabemb(object: any, target: string): any`|`bimbabemb(7,szaft"string"szaft)`| +|mennyi az idő|Visszaadja a pillanatnyi UNIX időt milisec-ben.|`mennyi az idő(): number`|`mennyi az idő()`| +|joink|Bekér egy szöveget a terminálból.|`joink(): string`|`joink()`| + +--- + +## Nerd (Math) +Matematikai funkciók +:::tip + +A példák elé kell írni a kulcsszót: `nerd` + +Példa: `nerd.abs` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|abs|Visszaadja a megadott érték abszolút értékét.|`abs(n: number): number`|`abs(-2)`| +|kerek|Visszaadja a megadott érték kerekített értékét. Irányok: `fel, le, közel`|`kerek(n: number, direction: string): number`|`kerek(1.2, szaft"fel"szaft)`| +|sin|Visszaadja a megadott érték szinusz értékét.|`sin(n: number): number`|`sin(0)`| +|cos|Visszaadja a megadott érték koszinusz értékét.|`cos(n: number): number`|`cos(90)`| +|tan|Visszaadja a megadott érték tangens értékét.|`tan(n: number): number`|`tan(0)`| +|sqrt|Visszaadja a megadott érték gyökét.|`sqrt(n: number): number`|`sqrt(-2)`| +|legnagyobb|Visszaadja a megadott értékek közül a legnagyobbat.|`legnagyobb(...: number): number`|`legnagyobb(1,2,3)`| +|legkisebb|Visszaadja a megadott értékek közül a legkisebbet.|`legkisebb(...: number): number`|`legkisebb(1,2,3)`| +|pi|A pi értékét tárolja.|`pi: number`|`pi`| + +--- + +## Szaft (String) +Szöveggel lévő funkciók +:::tip + +A példák elé kell írni a kulcsszót: `szaft` + +Példa: `szaft.csemerd fel` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|csemerd fel|Visszaadja a megadott szöveget végig nagy betűkkel.|`csemerd fel(s: string): string`|`csemerd fel(szaft"TeSt"szaft)`| +|csemerd le|Visszaadja a megadott szöveget végig kis betűkkel.|`csemerd le(s: string): string`|`csemerd le(szaft"TeSt"szaft)`| +|hossz|Visszaadja a megadott szöveg hosszát.|`hossz(s: string): number`|`hossz(szaft"test"szaft)`| +|ismételd|A megadott szöveget `n` szer ismételve adja vissza.|`ismételd(s: string, n: number): string`|`ismételd(szaft"test"szaft, 3)`| +|uno reverse|A megadott szöveget fordítva adja vissza.|`uno reverse(s: string): string`|`uno reverse(szaft"test"szaft)`| +|darabos|Visszaadja a megadott szöveg egy darabját.|`darabos(s: string, start: number, end: number): string`|`darabos(szaft"test"szaft, 0, 1)`| +|keres|Megnézi, hogy a megadott szövegben megtalálható-e a másik szöveg.|`keres(s: string, find: string): boolean`|`keres(szaft"test"szaft,szaft"st"szaft)`| +|átrak|A megadott szövegben kicseréli a másik szöveget egy harmadikkal.|`átrak(s: string, from: string, to: string): string`|`átrak(szaft"test"szaft,szaft"st"szaft,szaft"bemb"szaft)`| +|számmá|A megadott szövegben az `n`-edik karakter szám megfelelőjét adja vissza.|`számmá(s: string, n: number): number`|`számmá(szaft"test"szaft,0)`| +|betűvé|A megadott szám betű megfelelőjét adja vissza.|`átrak(n: number): string`|`átrak(65)`| + +--- + +## Tábla (Table) +Táblákkal lévő funkciók +:::tip + +A példák elé kell írni a kulcsszót: `tábla` + +Példa: `tábla.hozzáad` + +::: +:::warning + +A funkciók végeredményét ajánlott beleírni a táblába, mert ez nem történik meg alapból. + +Példa: `a = tábla.hozzáad(a, 7)` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|hozzáad|Hozzáad egy értéket egy táblához.|`hozzáad(t: table, value: any): table`|`hozzáad({1,2,3}, 7)`| +|töröl|Töröl egy értéket a táblából.|`töröl(t: table, n: number): table`|`töröl({1,2,3}, 0)`| +|kulcsok|Visszaadja a tábla kulcsait egy másik táblában.|`kulcsok(t: table): table`|`kulcsok({1,2,3})`| +|hossz|Visszaadja a tábla hosszát.|`hossz(t: table): number`|`hozzáad({1,2,3})`| + +--- + +## Szenvedés (Process) +A feladattal kapcsolatos funkciók +:::tip + +A példák elé kell írni a kulcsszót: `szenvedés` + +Példa: `szenvedés.vége` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|vége|Befejezi a programot egy kilépő kóddal.|`vége(n: number)`|`vége(0)`| + +--- + +## Kábel (Net) +A nettel kapcsolatos funkciót +:::tip + +A példák elé kell írni a kulcsszót: `kábel` + +Példa: `kábel.halgass` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|halgass|Hallgat egy porton.|`halgass(host: string, port: number): halgató`|`halgass(szaft"0.0.0.0"szaft,1010)`| + +:::warning + +Ezek a funkciók kérik, hogy az első értékük a szülő táblájuk legyen + +::: + +### Halgató: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|kérés|Várakozik egy kérésre, majd visszaadja azt.|`kérés(listener: halgató): kapcsolat`|`kérés(listener)`| + +### Kapcsolat: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|olvass|Beleolvas a kapcsolatba.|`olvass(stream: kapcsolat, len: number): string`|`olvass(stream, 1024)`| +|írj|Beleír a kapcsolatba.|`írj(stream: kapcsolat, data: string)`|`írj(stream, szaft"Hello from ASL!"szaft)`| +|zár|Bezárja a kapcsolatot.|`zár(stream: kapcsolat)`|`zár(stream)`| + +--- + +## Intéző (Filesystem) +Fájlokkal lévő funkciók +:::tip + +A példák elé kell írni a kulcsszót: `intéző` + +Példa: `intéző.létezik` + +::: +:::warning + +A fájlok, helyét bárhogy megadhatod, viszont a törlésnél légy óvatos! + +A fájl írása felülírja a már fájlban lévő adatokat! + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|létezik|Megnézi, hogy létezik-e az elérési út.|`létezik(path: string): boolean`|`létezik(szaft"test.asl"szaft)`| +|infó|Lekéri a metaadatokat az adott elérési útból.|`infó(path: string): table`|`infó(szaft"test.asl"szaft)`| +|mappít|Létrehozza a mappákat, hogy elérje az elérési útat.|`mappít(path: string)`|`mappít(szaft"test1/test2/"szaft)`| +|mappát töröl|Kitöröl egy mappát.|`mappát töröl(path: string)`|`mappát töröl(szaft"test1/"szaft)`| +|fájlt töröl|Kitöröl egy fájlt.|`fájlt töröl(path: string)`|`fájlt töröl(szaft"compiled.asx"szaft)`| +|olvass|Beolvas egy fájlt.|`olvass(path: string): string`|`olvass(szaft"test.asl"szaft)`| +|írj|Beleírja egy fájlba a kapott adatokat.|`írj(path: string, data: string)`|`írj(szaft"test.txt"szaft, szaft"Hello from ASL!"szaft)`| + +--- + +## Krumpli (Coroutine) +Multi-tasking funkciók +:::tip + +A példák elé kell írni a kulcsszót: `krumpli` + +Példa: `krumpli.várj` + +::: +|Név|Leírás|Használat|Példa| +|---|---|---|---| +|várj|Visszaadja a futást az előző thread-nak.|`várj()`|`várj()`| +|létrehoz|Létrehoz egy új thread-et.|`létrehoz(f: function): coroutine`|`létrehoz(lőcsve() { ugass(7) })`| +|folytat|Folytatja a thread-et.|`folytat(c: coroutine)`|`folytat(c)`| +|státusz|Visszaadja a thread státuszát.|`folytat(c: coroutine)`|`folytat(c)`| \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/intro.md b/docs/versioned_docs/version-1.0.0/intro.md new file mode 100644 index 0000000..90445fd --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/intro.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +description: Az Astro Lang bemutatása +--- + +# Astro Lang +Egy magyar + GenZ programozási nyelv + +--- + +Miben jobb: +- többszavas változók +- magyar kulcsszavak +- teljes értékű dokumentáció +- Rustban írt + +--- + +Példa: +```asl title="example.asl" +gethelj a = 10 +ugass(a) +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/langfunctions.md b/docs/versioned_docs/version-1.0.0/langfunctions.md new file mode 100644 index 0000000..72244b1 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/langfunctions.md @@ -0,0 +1,301 @@ +--- +sidebar_position: 3 +description: Az Astro Lang fukciói +--- + +# Nyelvi funkciók + +--- + +## Assignment (Változó beállítás) +Kucsszó: `gethelj` + +Használat: `gethelj változó = érték` + +Példa: +```asl title="example.asl" +gethelj test = 17 +``` + +--- + +## Var read (Változó olvasás) +Kucsszó: `-` + +Használat: `változó` + +Példa: +```asl title="example.asl" +gethelj test = 17 +ugass(test) +``` + +--- + +## Var update (Változó frissítés) +Kucsszó: `-` + +Használat: `változó = érték` + +Példa: +```asl title="example.asl" +gethelj test = 17 +ugass(test) +test = 18 +ugass(test) +``` + +--- + +## Function (Funkció) +Kucsszó: `lőcsve` + +Használat: `lőcsve változó(változók) {lefutatott kód}` + +Példa: +```asl title="example.asl" +lőcsve test(a) { + //Ez akkor fut le mikor meghívod a funkciót +} +test(8) //így tudsz meghívni egy funkciót, ebben az esetben az "a" 8 lesz +``` + +--- + +## If (Ha) +Kulcsszó: `ha geny` + +Használat: `ha geny(feltétel) {ha igaz}` + +Példa: +```asl title="example.asl" +ha geny(piszv) { + //Ez akkor fut le, ha a feltétel igaz + //Ebben az esetben mindig +} +``` + +--- + +## Else (Különben) +Kulcsszó: `ha nem geny` + +Használat: `ha nem geny {ha hamis}` + +Példa: +```asl title="example.asl" +ha geny(nem piszv) { + //Ez akkor fut le, ha a feltétel igaz + //Ebben az esetben soha +} ha nem geny { + //Ez akkor fut le, ha a feltétel hamis + //Ebben az esetben mindig +} +``` + +:::tip + +Nem kötelező egyből a ha után rakni, a kódban bárhol elfogadható és az előzőleg lefutott if-t veszi figyelembe. + +::: + +--- + +## Else if (Különben-Ha) +Kulcsszó: `ha nem geny akkor geny` + +Használat: `ha nem geny akkor geny(feltétel) {ha igaz}` + +Példa: +```asl title="example.asl" +ha geny(nem piszv) { + //Ez akkor fut le, ha a feltétel igaz + //Ebben az esetben soha +} ha nem geny akkor geny(piszv) { + //Ez akkor fut le, ha az előző if feltétele hamis és a feltétel igaz + //Ebben az esetben mindig +} +``` + +:::tip + +Nem kötelező egyből a ha után rakni, a kódban bárhol elfogadható és az előzőleg lefutott if-t veszi figyelembe. + +::: + +--- + +## While (Amíg) +Kulcsszó: `amíg geny` + +Használat: `amíg geny(feltétel) {amíg igaz}` + +Példa: +```asl title="example.asl" +amíg geny(piszv) { + //Ez addig fut le, amíg a feltétel igaz + //Ebben az esetben örökké fog futni +} +``` + +--- + +## For (Változós amíg) +Kulcsszó: `kopva` + +Használat: `kopva(beállítás;feltétel;frissítés) {amíg igaz}` + +:::info + +A beállítás első futás előtt fut le, csak 1 utasítást tartalmazhat. + +A frissítés minden futás után fut le, csak 1 utasítást tartalmazhat. + +::: + +Példa: +```asl title="example.asl" +kopva(gethelj i = 0; i < 10; i = i + 1) { + //Ez addig fut le, amíg a feltétel igaz +} +``` + +--- + +## Break (Törés) +Kulcsszó: `kraf` + +Használat: `kraf` + +Példa: +```asl title="example.asl" +kopva(gethelj i = 0; i < 10; i = i + 1) { + kraf //Ez az első futásnál be fogja fejezni az amíg-ot +} +``` + +--- + +## Continue (Folytasd) +Kulcsszó: `szard le` + +Használat: `szard le` + +Példa: +```asl title="example.asl" +kopva(gethelj i = 0; i < 10; i = i + 1) { + ugass(i) + szard le + ugass(78) //Ez soha nem fog lefutni, mert át lesz ugorva +} +``` + +--- + +## Return (Funkció visszadása) +Kulcsszó: `reti` + +Használat: `reti [változó]` + +Példa: +```asl title="example.asl" +lőcsve test(a) { + reti a +} +gethelj a = test(8) //Az "a" értéke "8" lesz, mert azt adja vissza. +``` + +--- + +## Import (Betöltés) +Kulcsszó: `hámozd, be/ba` + +Használat: `hámozd változó be/ba` + +:::tip + +Ez egyből létrehoz egy változót. +Pontos fájlnevet tudsz megadni! + +::: + +Példa: +```asl title="example.asl" +hámozd test be szaft"test.asl"szaft +``` + +--- + +## Table (Tábla) + +:::tip + +A kulcs bármilyen érték típus lehet, kivéve: funkció, tábla. + +::: + +### Létrehozás +Használat: `{érték,érték}, {[kulcs]=érték}` + +Példa: +```asl title="example.asl" +gethelj a = {1,2,3} +``` + +### Lekérés +Használat: `tábla[kulcs]` + +Példa: +```asl title="example.asl" +gethelj a = {1,2,3} +ugass(a[0]) // 1 +``` + +### Gyors lekérés +Használat: `tábla.kulcs` + +:::warning + +Csak a szöveges kulcsokkal működik, viszont több szót is támogat! + +::: + +Példa: +```asl title="example.asl" +gethelj a = {1,2,3,[szaft"test"szaft]=73} +ugass(a.test) // 73 +``` + +### Beállítás +Használat: `tábla[kulcs] = érték` + +Példa: +```asl title="example.asl" +gethelj a = {1,2,3} +ugass(a[0]) // 1 +a[0] = 12 +ugass(a[0]) // 12 +``` + +--- + +## Try/Catch (Próbáld ki) +Kulcsszó: `piszolj, csecs` + +Használat: `piszolj {amit ki kell próbálni} csecs (error) {ha hiba}` + +:::warning + +A catch rész itt nem rakható bárhova, nem úgy mint az if-nél! + +::: + +Példa: +```asl title="example.asl" +piszolj { + gethelj test = szaft"a"szaft+1 +} csecs (e) { + //Ez akkor fog lefutni, mikor hiba van + ugass(e) +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-1.0.0/syntax.md b/docs/versioned_docs/version-1.0.0/syntax.md new file mode 100644 index 0000000..794b9b3 --- /dev/null +++ b/docs/versioned_docs/version-1.0.0/syntax.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 2 +description: Az Astro Lang synatx bemutatása +--- + +# Syntax + +--- + +## Típusok: +|Típus neve|Magyar neve|Leírása|Példa| +|---|---|---|---| +|String|Szöveg|Minden ami szöveg.|`szaft"test"szaft`| +|Number|Szám|Minden ami szám.|`2, 3.14, -5`| +|Identifier|Azonosító|A változók, dolgok neve/azonosítója, több szót is támogat. Fontos: szám nem lehet a szavak elején, mert az már számnak számít!|`teszt, több szót is támogat, ez is jo72`| +|Operator|Művelet|Minden ami művelet.|`+, -, *`| +|Keyword|Kulcsszó|Azok az azonosítók amelyek valamilyen funkciót látnak el a programnyelben.|`gethelj, lőcsve, ha geny`| +|Separator|Elválasztó|Olyan karakterek, melyek elválaszják a többi típust egymástól.|`=, (, {`| + +Példa: +```asl +gethelj a = 15 + 2 +^ ^ ^ ^ ^ ^ Number +| | | | | Operator +| | | | Number +| | | Separator +| | Identifier +| Keyword +``` + +## Egyéb: +### Komment: +Ezek nem befolyásolják a kód futását, csak leírást adnak arról, hogy mi mit csinál. +- Egysoros kommentet így tudsz létrehozni: `//komment` +- Többsoros kommentet pedig így: `/*komment*/` +### Logikai érték: +:::info + +A nyelv ezeket kulcsszóként kezeli! + +::: +Igaz (piszv) vagy hamis (nem piszv) +### Semmi: +:::info + +A nyelv ezt is kulcsszóként kezeli! + +::: +Null (nincs hám) \ No newline at end of file diff --git a/docs/versioned_sidebars/version-1.0.0-sidebars.json b/docs/versioned_sidebars/version-1.0.0-sidebars.json new file mode 100644 index 0000000..2782dc0 --- /dev/null +++ b/docs/versioned_sidebars/version-1.0.0-sidebars.json @@ -0,0 +1,8 @@ +{ + "sidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/docs/versions.json b/docs/versions.json index 3145067..25a2ff2 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,3 +1,4 @@ [ + "1.0.0", "0.2.0" ] diff --git a/extension/asl.png b/extension/asl.png new file mode 100644 index 0000000000000000000000000000000000000000..cbed5a6ad4297e3a16e7ea39f353dc23380ad45b GIT binary patch literal 14226 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 e5^B55UTQjIXZSTo(>-M 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 vWQS}daygA`2B