Programmiersprache in Blitz
Übersicht Sonstiges Projekte
VertexBetreff: Programmiersprache in Blitz |
Fr, Okt 29, 2004 17:49 Antworten mit Zitat |
|
---|---|---|
Hi!
Arbeite z. Z. an einer Programmiersprache genannt Adagio Mini. Es ist die einzigste Hochsprache für die Pokemon Mini Konsole. Sie soll die Spieleentwicklung mit der Konsole wesentlich erleichtern. So sieht das kleine Ding aus: Beim erzeugen einer ausführbaren Datei werden folgende Schritte durchgeführt: Analyse / Frontend Lexikalische Analyse Zerteilt den Quellcode in zusammenhängende Token und gibt dann ein Tokenstream zurück. Dies geschieht über ein Lexer. Syntaktische Analyse Prüft den Tokenstream auf syntaktische Korrektheit. Dies geschieht über ein Parser. Semantische Analyse Prüft auf statische Semantik(erkennt z. B. ob eine Variable nicht deklariert wurden ist). Synthese / Backend Optimierung Hier wird der Code optimiert(z. B. nicht benutzte Variablen werden gelöscht). Codegenerierung Der syntaktisch sowie statisch semantisch korrekte und optimierte Tokenstream wird in eine Zielsprache(bei mir Machinensprache) übersetzt. Bis jetzt läuft der Lexer schon ganz gut, habe bisher noch keine Fehler gehabt. Er wandelt schon automatisch Hexadezimal- und Binärwerte in Dezimalwerte um, erkennt einzelne Symbole, kann "<=", "=<", ">=", "=>", "<>" und "><" zusammenfassen und ignoriert Kommentare. Token sind so aufgebaut: - tokenType: Typ des Tokens, z. B. TOK_MATHADD für Plus - tokenContent$: hier steht der Quellcode des Tokens drin z. B. "+" - tokenValue: bei Hexadezimal- und Binärwerten steht hier der Dezimalwert drin - tokenRow: Zeile im Quellcode des Token - tokenBeginCol: Spalte im Quellcode wo Token anfängt - tokenEndCol: Spalte im Quellcode wo Token aufhört Über tokenRow, tokenBeginCol und tokenEndCol kann man dann später direkt die Stelle im Quellcode markieren, die Fehlerhaft ist. Den Compiler mit oder ohne Optimierung(mal schauen) werden ich vieleicht für 10 Euro verkaufen. Lexer und Parser bleiben jedoch Open Source, damit man die Sprache auch auf andere Platformen portieren kann. Somit wäre auch eine Scriptsprache für Blitz einfach zu realisieren. Hier ein Beispielcode test.am: Code: [AUSKLAPPEN] ; Adagio Mini by Vertex
; arithmetische Operatoren: ; + Addition ; - Subtraktion ; * Multplikation ; / Division ; ^ Potenzieren ; mod Modulo ; logische Operatoren: ; and UND ; or inklusives ODER ; xor exklusives ODER ; not NICHT ; Vergleichsoperatoren ; == gleich ; <> ungleich ; < kleiner als ; <= kleiner gleich ; > größer als ; => größer gleich ; bitweise Operatoren: ; & UND ; | inklusiv ODER ; ! exklusiv ODER ; ~ NICHT ; Präfixe für Zahlensysteme: ; $ Hexadezimalsystem ; % Binärsystem ; Typecasting: ; int val(string var) String -> Integer ; string str(int var) Integer -> String ; Compilerdirektiven: ; #include Einbindung von anderen verwirrst ; #title Titel des Programms max. 12 Zeichen lang ; #code Code des Programmes konst 4 Zeichen lang ; : Trennung zwischen 2 Anweisung auf einer Zeile #title "Name" #code "xxxx" ; Kommentar ; Konstanten const KEYPAD = $2052 const LCD_CONTROL0 = $2080 const LCD_CONTROL1 = $2081 const ENABLE_MAP = %0000010 const ENABLE_SPRITES = %00000100 ; Struktur struct sTest { byte abc short def int ghi } ; statsiche Variablen static byte a = 10 static short b = 20 static int c = 30 static string d = "test" static sTest e = 1, 2, 3 ; dynamische Variablen byte f = 10 short g = 20 int h = 30 string i = "test" sTest j j.abc = 4 : j.def = 5 : j.ghi = 6 ; pointer static byte *pa = @a; short *pb = @b; ; Arrays static byte k[3][3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}} byte l[10][10][10] ; dynamisches, 3 dimensionales Array ; zählgeprüfte Schleife for a = 1 to 8 step 2 { ; ... } ; anfangsgeprüfte Schleife while(a <> 1) { a = a-1 ; ... } ; endgeprüfte Schleife repeat { a = a+1 ; ... } until(a > 10) ; bedingungslose Schleife repeat { a = a+1 if(a == 100) exit } forever ; einzeilige Wenn-Anweisung if(a == 10) ; ... ; mehrzeilige Wenn-Anweisung if(a == 10) { ; ... } elseif(b == 10) { ; ... } else { ; ... } ; merhseitige Auswahl select(a) { case 1: ; ... case 2: ; ... case 3: ; ... else: ; ... } ; Sprünge Gosub label1 Goto label2 ; Sprungmarke label1: ; ... Return ; Sprungmarke label2: ; ... label3: static #incbin "test.bin" ; einbinden einer binären Datei Die Syntax soll eine Verbindung aus BASIC und C sein/werden. Der Lexer: Code: [AUSKLAPPEN] ; Type für alle Zeilen im Quellcode
Type sLine_t Field content$ Field row End Type ; Datei in Type auslesen stream = ReadFile("test.am") While Not Eof(stream) count = count+1 sLine.sLine_t = New sLine_t sLine\content$ = ReadLine(stream) sLine\row = count Wend CloseFile stream ; Type für Token Type sToken_t Field tokenType Field tokenContent$ Field tokenValue Field tokenRow Field tokenBeginCol Field tokenEndCol End Type ; Tokentyp-Konstanten Const TOK_DIRECTIVE = $01 ; Kompilerdirektive Const TOK_STRING = $02 ; Zeichenkette Const TOK_NUMBER = $03 ; Zahlenwert Const TOK_HEXADEC = $04 ; Hexadezimalwert Const TOK_BINARY = $05 ; Binärwert Const TOK_MATHEQL = $06 ; = Const TOK_MATHLOW = $07 ; < Const TOK_MATHLWEQL = $08 ; <= Const TOK_MATHGREAT = $09 ; > Const TOK_MATHGREQL = $0A ; => Const TOK_MATHADD = $0B ; + Const TOK_MATHSUB = $0C ; - Const TOK_MATHMUL = $0D ; * Const TOK_MATHDIV = $0E ; / Const TOK_MATHPOW = $0F ; ^ Const TOK_MATHNTEQL = $10 ; <> Const TOK_MATH2EQL = $11 ; == Const TOK_MATHAND = $12 ; & Const TOK_MATHOR = $13 ; | Const TOK_MATHXOR = $14 ; ! Const TOK_MATHNOT = $15 ; ~ Const TOK_MATHBRKOP = $16 ; ( Const TOK_MATHBRKCL = $17 ; ) Const TOK_SYMCOLON = $18 ; : Const TOK_SYMCOMMA = $19 ; , Const TOK_SYMQUOTE = $1A ; " Const TOK_SYMADDR = $1B ; @ Const TOK_SYMARROP = $1C ; [ Const TOK_SYMARRCL = $1D ; ] Const TOK_SYMBEGIN = $1E ; { Const TOK_SYMEND = $1F ; } ; Globale Variablen für den Lexer Global lineContent$, lineRow, lineLength Global lexCharPos, lexChar$, lexBeginToken, lexEndToken, lexToken$, lexQuote Global lexTokenCount, lexError$ ; Alle Zeilen durchgehen For sLine = Each sLine_t lineContent$ = sLine\content$ lineRow = sLine\row lineLength = Len(lineContent$) lexCharPos = 1 ; Solange bis Zeilenende erreicht ist While lexCharPos<lineLength+1 sToken.sToken_t = New sToken_t sToken\tokenRow = lineRow lexToken$ = "" lexChar$ = Mid$(lineContent$, lexCharPos, 1) ; Leerraum If lexChar$ = " " Or lexChar$ = " " Then Delete sToken sToken = Null lexCharPos = lexCharPos+1 ; Kompilerdirektive ElseIf lexChar$ = "#" Then getToken() sToken\tokenType = TOK_DIRECTIVE sToken\tokenContent$ = lexToken$ sToken\tokenBeginCol = lexBeginToken sToken\tokenEndCol = lexEndToken ; Zeichenkette ElseIf Asc(Lower$(lexChar$))>96 And Asc(Lower$(lexChar$))<122 Then getToken() sToken\tokenType = TOK_STRING sToken\tokenContent$ = lexToken$ sToken\tokenBeginCol = lexBeginToken sToken\tokenEndCol = lexEndToken ; Zahl ElseIf Asc(Lower$(lexChar$))>47 And Asc(Lower$(lexChar$))<58 Then getToken() sToken\tokenType = TOK_NUMBER sToken\tokenContent$ = lexToken$ sToken\tokenBeginCol = lexBeginToken sToken\tokenEndCol = lexEndToken ; Hexadezimalwert ElseIf lexChar$ = "$" Then getToken() sToken\tokenType = TOK_HEXADEC sToken\tokenContent$ = lexToken$ sToken\tokenBeginCol = lexBeginToken sToken\tokenEndCol = lexEndToken ; Binärwert ElseIf lexChar$ = "%" Then getToken() sToken\tokenType = TOK_BINARY sToken\tokenContent$ = lexToken$ sToken\tokenBeginCol = lexBeginToken sToken\tokenEndCol = lexEndToken ; Gleichheitszeichen ElseIf lexChar$ = "=" Then sToken\tokenType = TOK_MATHEQL sToken\tokenContent$ = "=" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; kleiner als ElseIf lexChar$ = "<" Then sToken\tokenType = TOK_MATHLOW sToken\tokenContent$ = "<" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; größer als ElseIf lexChar$ = ">" Then sToken\tokenType = TOK_MATHGREAT sToken\tokenContent$ = ">" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Plus ElseIf lexChar$ = "+" Then sToken\tokenType = TOK_MATHADD sToken\tokenContent$ = "+" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Minus ElseIf lexChar$ = "-" Then sToken\tokenType = TOK_MATHSUB sToken\tokenContent$ = "-" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Mal ElseIf lexChar$ = "*" Then sToken\tokenType = TOK_MATHMUL sToken\tokenContent$ = "*" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Durch ElseIf lexChar$ = "/" Then sToken\tokenType = TOK_MATHDIV sToken\tokenContent$ = "/" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Hoch ElseIf lexChar$ = "^" Then sToken\tokenType = TOK_MATHPOW sToken\tokenContent$ = "^" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; bitweise UND ElseIf lexChar$ = "&" Then sToken\tokenType = TOK_MATHAND sToken\tokenContent$ = "&" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; bitweise inklusiv ODER ElseIf lexChar$ = "|" Then sToken\tokenType = TOK_MATHWOR sToken\tokenContent$ = "|" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; bitweise exklusiv ODER ElseIf lexChar$ = "!" Then sToken\tokenType = TOK_MATHXOR sToken\tokenContent$ = "!" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; bitweise NICHT ElseIf lexChar$ = "~" Then sToken\tokenType = TOK_MATHNOT sToken\tokenContent$ = "~" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; runde Klammer auf ElseIf lexChar$ = "(" Then sToken\tokenType = TOK_MATHBRKOP sToken\tokenContent$ = "(" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; runde Klammer zu ElseIf lexChar$ = ")" Then sToken\tokenType = TOK_MATHBRKCL sToken\tokenContent$ = ")" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Doppelpunkt ElseIf lexChar$ = ":" Then sToken\tokenType = TOK_SYMCOLON sToken\tokenContent$ = ":" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Komma ElseIf lexChar$ = "," Then sToken\tokenType = TOK_SYMCOMMA sToken\tokenContent$ = "," sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Anführungszeichen ElseIf lexChar$ = Chr$(34) Then lexQuote = Not lexQuote sToken\tokenType = TOK_SYMQUOTE sToken\tokenContent$ = Chr$(34) sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Adressoperator ElseIf lexChar$ = "@" Then sToken\tokenType = TOK_SYMADDR sToken\tokenContent$ = "@" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; eckige Klammer auf ElseIf lexChar$ = "[" Then sToken\tokenType = TOK_SYMARROP sToken\tokenContent$ = "[" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; eckige Klammer zu ElseIf lexChar$ = "]" Then sToken\tokenType = TOK_SYMARRCL sToken\tokenContent$ = "]" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; geschweifte Klammer auf ElseIf lexChar$ = "{" Then sToken\tokenType = TOK_SYMBEGIN sToken\tokenContent$ = "{" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; geschweifte Klammer zu ElseIf lexChar$ = "}" Then sToken\tokenType = TOK_SYMEND sToken\tokenContent$ = "}" sToken\tokenBeginCol = lexCharPos sToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Kommentar ElseIf lexChar$ = ";" Then Delete sToken sToken = Null lexCharPos = lineLength+1 ; Fehler Else lexError$ = "Fehler in Zeile "+sToken\tokenRow+", Zeichen "+lexCharPos+" :" lexError$ = lexError$+Chr$(13)+Chr$(10)+" unerlaubtes Zeichen" RuntimeError lexError$ EndIf If sToken <> Null Then lexTokenCount = lexTokenCount+1 EndIf Wend Next ; Auf hexadezimale und binäre Werte durchsuchen For sToken = Each sToken_t ; Hexadezimalzahl in Dezimalzahl umwandeln If sToken\tokenType = TOK_HEXADEC Then sToken\tokenValue = hex2dec(sToken\tokenContent$) If sToken\tokenValue = -1 Then lexError$ = "Fehler in Zeile "+sToken\tokenRow+", Zeichen "+sToken\tokenBeginCol+" :" lexError$ = lexError$+Chr$(13)+Chr$(10)+" unerlaubtes Zeichen" RuntimeError lexError$ EndIf EndIf ; Binärzahl in Dezimalzahl umwandeln If sToken\tokenType = TOK_BINARY Then sToken\tokenValue = bin2dec(sToken\tokenContent$) If sToken\tokenValue = -1 Then lexError$ = "Fehler in Zeile "+sToken\tokenRow+", Zeichen "+sToken\tokenBeginCol+" :" lexError$ = lexError$+Chr$(13)+Chr$(10)+" unerlaubtes Zeichen" RuntimeError lexError$ EndIf EndIf Next ; <=, =<, >=, =>, <>, ><, und == heraussuchen und ersetzen For sToken = Each sToken_t nextToken.sToken_t = After sToken If nextToken <> Null Then If sToken\tokenType = TOK_MATHLOW And nextToken\tokenType = TOK_MATHEQL Then Delete nextToken sToken\tokenType = TOK_MATHLWEQL sToken\tokenContent$ = "<=" ElseIf sToken\tokenType = TOK_MATHEQL And nextToken\tokenType = TOK_MATHLOW Then Delete nextToken sToken\tokenType = TOK_MATHLWEQL sToken\tokenContent$ = "=<" ElseIf sToken\tokenType = TOK_MATHGREAT And nextToken\tokenType = TOK_MATHEQL Then Delete nextToken sToken\tokenType = TOK_MATHGREQL sToken\tokenContent$ = ">=" ElseIf sToken\tokenType = TOK_MATHEQL And nextToken\tokenType = TOK_MATHGREAT Then Delete nextToken sToken\tokenType = TOK_MATHLWEQL sToken\tokenContent$ = "=>" ElseIf sToken\tokenType = TOK_MATHLOW And nextToken\tokenType = TOK_MATHGREAT Then Delete nextToken sToken\tokenType = TOK_MATHNEQL sToken\tokenContent$ = "<>" ElseIf sToken\tokenType = TOK_MATHGREAT And nextToken\tokenType = TOK_MATHLOW Then Delete nextToken sToken\tokenType = TOK_MATHNEQL sToken\tokenContent$ = "><" ElseIf sToken\tokenType = TOK_MATHEQL And nextToken\tokenType = TOK_MATHEQL Then Delete nextToken sToken\tokenType = TOK_MATH2EQL sToken\tokenContent$ = "==" EndIf EndIf Next For sToken = Each sToken_t DebugLog sToken\tokenContent$ Next ; Funktion zum filtern von Tokens Function getToken() Local lexQuit = False lexToken$ = Mid$(lineContent$, lexCharPos, 1) lexBeginToken = lexCharPos lexCharPos = lexCharPos+1 ; Steht die Zeichenkette in Anführungszeichen? If lexQuote = True Then While lexCharPos<lineLength+1 And lexQuit = False lexChar$ = Mid$(lineContent$, lexCharPos, 1) If lexChar$ = Chr$(34) Then lexQuit = True lexEndToken = lexCharPos+1 Else lexToken$ = lexToken$+lexChar$ lexCharPos = lexCharPos+1 EndIf Wend Else While lexCharPos<lineLength+1 And lexQuit = False lexChar$ = Mid$(lineContent$, lexCharPos, 1) ; Endzeichen erkennen Select lexChar$ Case " " lexQuit = True lexEndToken = lexCharPos lexCharPos = lexCharPos+1 Case Chr$(9) lexQuit = True lexEndToken = lexCharPos lexCharPos = lexCharPos+1 Case "$" : lexQuit = True : lexEndToken = lexCharPos Case "%" : lexQuit = True : lexEndToken = lexCharPos Case "=" : lexQuit = True : lexEndToken = lexCharPos Case "<" : lexQuit = True : lexEndToken = lexCharPos Case ">" : lexQuit = True : lexEndToken = lexCharPos Case "+" : lexQuit = True : lexEndToken = lexCharPos Case "-" : lexQuit = True : lexEndToken = lexCharPos Case "*" : lexQuit = True : lexEndToken = lexCharPos Case "/" : lexQuit = True : lexEndToken = lexCharPos Case "^" : lexQuit = True : lexEndToken = lexCharPos Case "&" : lexQuit = True : lexEndToken = lexCharPos Case "|" : lexQuit = True : lexEndToken = lexCharPos Case "!" : lexQuit = True : lexEndToken = lexCharPos Case "~" : lexQuit = True : lexEndToken = lexCharPos Case "(" : lexQuit = True : lexEndToken = lexCharPos Case ")" : lexQuit = True : lexEndToken = lexCharPos Case ":" : lexQuit = True : lexEndToken = lexCharPos Case "," : lexQuit = True : lexEndToken = lexCharPos Case Chr$(34) : lexQuit = True : lexEndToken = lexCharPos Case "@" : lexQuit = True : lexEndToken = lexCharPos Case "[" : lexQuit = True : lexEndToken = lexCharPos Case "]" : lexQuit = True : lexEndToken = lexCharPos Case "{" : lexQuit = True : lexEndToken = lexCharPos Case "}" : lexQuit = True : lexEndToken = lexCharPos ; Bei Buchstaben oder Zahlen Default lexToken$ = lexToken$+lexChar$ lexCharPos = lexCharPos+1 End Select Wend EndIf End Function ; Funktion zum umwandeln von Hexadezimalwerten in Dezimalwerte Function hex2dec(hexvalue$) Local decvalue, length, i, tetrad length = Len(hexvalue$) For i = length To 2 Step -1 tetrad = Asc(Upper$(Mid$(hexvalue$, i, 1))) ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 If tetrad>47 And tetrad<58 Then tetrad = tetrad-48 decvalue = decvalue+tetrad*16^(length-i) ; A, B, C, D, E, F ElseIf tetrad>64 And tetrad<71 tetrad = tetrad-55 decvalue = decvalue+tetrad*16^(length-i) ; Unerlaubtes Zeichen Else Return -1 EndIf Next Return decvalue End Function ; Funktion zum umwandeln von Binärwerten in Dezimalwerte Function bin2dec(binvalue$) Local decvalue, length, i, bit length = Len(binvalue$) For i = length To 2 Step -1 bit = Asc(Mid$(binvalue$, i, 1)) ; 0, 1 If bit = 48 Or bit = 49 Then bit = bit-48 decvalue = decvalue+bit*2^(length-i) ; Unerlaubtes Zeichen Else Return -1 EndIf Next Return decvalue End Function Der obrige Quellcode als Tokenstream: Zitat: #title
" Name " #code " xxxx " const KEYPAD = $2052 const LCD_CONTROL0 = $2080 const LCD_CONTROL1 = $2081 const ENABLE_MAP = %0000010 const ENABLE_SPRITES = %00000100 struct sTest { byte abc short def int ghi } static byte a = 10 static short b = 20 static int c = 30 static string d = " test " static sTest e = 1 , 2 , 3 byte f = 10 short g = 20 int h = 30 string i = " test " sTest j j.abc = 4 : j.def = 5 : j.ghi = 6 static byte * pa = @ a; short * pb = @ b; static byte k [ 3 ] [ 3 ] [ 3 ] = { { 0 , 1 , 2 } , { 3 , 4 , 5 } , { 6 , 7 , 8 } } byte l [ 10 ] [ 10 ] [ 10 ] for a = 1 to 8 step 2 { } while ( a <> 1 ) { a = a - 1 } repeat { a = a + 1 } until ( a > 10 ) repeat { a = a + 1 if ( a == 100 ) exit } forever if ( a == 10 ) if ( a == 10 ) { } elseif ( b == 10 ) { } else { } select ( a ) { case 1 : case 2 : case 3 : else : } Gosub label1 Goto label2 label1 : Return label2 : label3 : static #incbin " test.bin " mfg olli |
||
vertex.dreamfall.at | GitHub |
- Zuletzt bearbeitet von Vertex am Fr, Okt 29, 2004 20:28, insgesamt einmal bearbeitet
Plasma(alt)Betreff: @vertex |
Fr, Okt 29, 2004 18:02 Antworten mit Zitat |
|
---|---|---|
junge junge du machst ja ernst !
respekt! |
||
DIV is dead ! |
Paul |
Fr, Okt 29, 2004 18:55 Antworten mit Zitat |
|
---|---|---|
Paul |
||
Stratocaster black - Roland MicroCube
User posted image Girgl-World, wer's nich kennt, is' blöd! |
Blitzkrieg Bop |
Fr, Okt 29, 2004 19:10 Antworten mit Zitat |
|
---|---|---|
Du machst mir Angst | ||
~ Hey Ho Let's Go ~ |
Kekskiller |
Fr, Okt 29, 2004 19:36 Antworten mit Zitat |
|
---|---|---|
Klasse Vertex, du bist wirklich ein echter Tausendsasser ^_^ .
Fand schon die Sache mit dem Pokemon Mini Tutorial klasse, aber das hier ist noch viel toller. Nur werde ich wohl damit nicht viel anfangen können, da ich 1. kaum Emus laufen bekomme und 2. erstmal die PC- Programmierung meistern muss. Aber gebookmarked habe ich den anderen Kram schon, jetzt muss Keks nur noch anfangen zu lernen ^^ . Sehr klasse Sache, Meister. |
||
joachim_neu |
Fr, Okt 29, 2004 20:22 Antworten mit Zitat |
|
---|---|---|
ich habe mal mit BB eine Sprache geschrieben (oder besser gesagt, ich bin noch halb dabei), mit der man ein Betriebssystem leichter programmieren kann. Ist so eine Mischung aus C, Pascal, Basic und ASM. das ganze wird in ASM umgewandelt und kann dann kompiliert werden. wers nicht glauben will/kann soll mal hier gucken: www.boscl.de.vu Ich weiß, jetzt kommen wieder welche, die mir sagen, das funktioniert net, usw. denen sage ich nur: ich benutze sie, und bei mir geht es, und ich habe schon mein OS!!! probiert es doch erstmal aus, bevor ihr kommentare abgebt, die nicht stimmen! ich wette, die, die meckern, haben sich noch nie wirklich mit OS-Coding abgegeben!!! | ||
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de |
Plasma(alt)Betreff: ja ja |
Fr, Okt 29, 2004 22:00 Antworten mit Zitat |
|
---|---|---|
os coden wollen aber falsch verlinken (file not found ) | ||
DIV is dead ! |
joachim_neu |
Fr, Okt 29, 2004 23:36 Antworten mit Zitat |
|
---|---|---|
stimmt! muss ich nochmal hochladen! müsst bis morgen warten! | ||
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de |
Vertex |
Sa, Okt 30, 2004 0:57 Antworten mit Zitat |
|
---|---|---|
Hmm für OS Dev eine Sprache ich weiss nicht, normalerweise schreibt man sich Sachen wie Bootloader in Asm und den Rest in C. Bin mal gespannt wenn ich herunterladen kann. Mit 14 eine Sprache zum entwickeln von Betriebsystemen zu schreiben, ist jedoch viel Respekt wert.
Ich habe jetzt den Lexer abgekapselt, für spätere Includes, er erzeugt jetzt Tokendateien, und es ist ein Bug behoben wo früher Code: [AUSKLAPPEN] string blub = "}" nicht ging.
Main.bb(später mal für IDE): Code: [AUSKLAPPEN] Include "Lexer.bb"
; Fehlernachricht-Konstanten Const ERR_SELECTLINE = $0 Const ERR_SELECTCUTOUT = $1 Const ERR_UNSELECT = $2 ; globale Fehlervariablen Global errorType, errorMessage$, errorRow, errorBeginCol, errorEndCol ; Funktion zur Ausgabe eines Fehlers Function displayError() Select errorType Case ERR_SELECTLINE Print "Fehler in Zeile "+errorRow+":" Print errorMessage$ Case ERR_SELECTCUTOUT Print "Fehler in Zeile "+errorRow+", Spalte "+errorBeginCol+":" Print errorMessage$ Case ERR_UNSELECT Print "Fehler:" Print errorMessage$ End Select End Function If lexFile("test.am", "test.token") = False Then displayError() Else Print "Fertig" EndIf und der neue Lexer: Code: [AUSKLAPPEN] ; Type für alle Zeilen im Quellcode
Type lexLine_t Field content$ Field row End Type ; Type für Token Type lexToken_t Field tokenType Field tokenContent$ Field tokenValue Field tokenRow Field tokenBeginCol Field tokenEndCol End Type ; Tokentyp-Konstanten Const TOK_NEWLINE = $00 ; Neue Zeile Const TOK_DIRECTIVE = $01 ; Kompilerdirektive Const TOK_STRING = $02 ; Zeichenkette Const TOK_NUMBER = $03 ; Zahlenwert Const TOK_HEXADEC = $04 ; Hexadezimalwert Const TOK_BINARY = $05 ; Binärwert Const TOK_MATHEQL = $06 ; = Const TOK_MATHLW = $07 ; < Const TOK_MATHLWEQL = $08 ; <= Const TOK_MATHGR = $09 ; > Const TOK_MATHGREQL = $0A ; => Const TOK_MATHADD = $0B ; + Const TOK_MATHSUB = $0C ; - Const TOK_MATHMUL = $0D ; * Const TOK_MATHDIV = $0E ; / Const TOK_MATHPOW = $0F ; ^ Const TOK_MATHNTEQL = $10 ; <> Const TOK_MATH2EQL = $11 ; == Const TOK_MATHAND = $12 ; & Const TOK_MATHOR = $13 ; | Const TOK_MATHXOR = $14 ; ! Const TOK_MATHNOT = $15 ; ~ Const TOK_MATHBRKOP = $16 ; ( Const TOK_MATHBRKCL = $17 ; ) Const TOK_SYMCOLON = $18 ; : Const TOK_SYMCOMMA = $19 ; , Const TOK_SYMQUOTE = $1A ; " Const TOK_SYMADDR = $1B ; @ Const TOK_SYMARROP = $1C ; [ Const TOK_SYMARRCL = $1D ; ] Const TOK_SYMBEGIN = $1E ; { Const TOK_SYMEND = $1F ; } ; gloable Lexervariablen Global lexLineLength, lexCharPos, lexRow, lexBeginToken, lexEndToken Global lexTmpToken$, lexQuote ; Funktion zum lexen eines Quellcodes in eine Datei Function lexFile(codeFile$, tokenFile$) Local fStream, lexLine.lexLine_t, fLineCount, lexToken.lexToken_t Local lexChar$, lexSymbol, nextToken.lexToken_t, lexCount ; Datei auslesen fStream = ReadFile(codeFile$) If fStream = 0 Then errorType = ERR_UNSELECT errorMessage$ = "Datei konnte nicht geöffnet werden" Return False EndIf While Not Eof(fStream) fLineCount = fLineCount+1 lexLine = New lexLine_t lexLine\content$ = ReadLine$(fStream) lexLine\row = fLineCount Wend CloseFile fStream ; Code analysieren For lexLine = Each lexLine_t lexRow = lexLine\row lexLineLength = Len(lexLine\content$) lexCharPos = 1 ; bis Zeilenende erreicht ist/gesetzt wurde While lexCharPos < lexLineLength+1 lexTmpToken$ = "" lexToken = New lexToken_t lexToken\tokenRow = lexRow lexChar = Mid$(lexLine\content$, lexCharPos, 1) lexSymbol = False ; Kommentar If lexChar$ = ";" Then Delete lexToken lexToken = Null lexCharPos = lexLineLength+1 ; Leerraum ElseIf lexChar$ = " " Or lexChar$ = " " Then Delete lexToken lexToken = Null lexCharPos = lexCharPos+1 ; Kompilerdirektive ElseIf lexChar$ = "#" Then getToken(lexLine\content$) lexToken\tokenType = TOK_DIRECTIVE ; Zeichenkette ElseIf Asc(Lower$(lexChar$))>96 And Asc(Lower$(lexChar$))<122 Then getToken(lexLine\content$) lexToken\tokenType = TOK_STRING ; Zahl ElseIf Asc(Lower$(lexChar$))>47 And Asc(Lower$(lexChar$))<58 Then getToken(lexLine\content$) lexToken\tokenType = TOK_NUMBER ; Hexadezimalzahl ElseIf lexChar$ = "$" Then getToken(lexLine\content$) lexToken\tokenType = TOK_HEXADEC ; Binärzahl ElseIf lexChar$ = "%" Then getToken(lexLine\content$) lexToken\tokenType = TOK_BINARY ; Symbol ElseIf lexChar$ = "=" Then lexSymbol = True lexToken\tokenType = TOK_MATHEQL ; Symbol ElseIf lexChar$ = "<" Then lexSymbol = True lexToken\tokenType = TOK_MATHLW ; Symbol ElseIf lexChar$ = ">" Then lexSymbol = True lexToken\tokenType = TOK_MATHGR ; Symbol ElseIf lexChar$ = "+" Then lexSymbol = True lexToken\tokenType = TOK_MATHADD ; Symbol ElseIf lexChar$ = "-" Then lexSymbol = True lexToken\tokenType = TOK_MATHSUB ; Symbol ElseIf lexChar$ = "*" Then lexSymbol = True lexToken\tokenType = TOK_MATHMUL ; Symbol ElseIf lexChar$ = "/" Then lexSymbol = True lexToken\tokenType = TOK_MATHDIV ; Symbol ElseIf lexChar$ = "^" Then lexSymbol = True lexToken\tokenType = TOK_MATHPOW ; Symbol ElseIf lexChar$ = "&" Then lexSymbol = True lexToken\tokenType = TOK_MATHAND ; Symbol ElseIf lexChar$ = "|" Then lexSymbol = True lexToken\tokenType = TOK_MATHOR ; Symbol ElseIf lexChar$ = "!" Then lexSymbol = True lexToken\tokenType = TOK_MATHXOR ; Symbol ElseIf lexChar$ = "~" Then lexSymbol = True lexToken\tokenType = TOK_MATHNOT ; Symbol ElseIf lexChar$ = "(" Then lexSymbol = True lexToken\tokenType = TOK_MATHBRKOP ; Symbol ElseIf lexChar$ = ")" Then lexSymbol = True lexToken\tokenType = TOK_MATHBRKCL ; Symbol ElseIf lexChar$ = ":" Then lexSymbol = True lexToken\tokenType = TOK_SYMCOLON ; Symbol ElseIf lexChar$ = "," Then lexSymbol = True lexToken\tokenType = TOK_SYMCOMMA ; Symbol " ElseIf lexChar$ = Chr$(34) Then lexQuote = Not lexQuote lexSymbol = True lexToken\tokenType = TOK_SYMQUOTE ; Symbol ElseIf lexChar$ = "@" Then lexSymbol = True lexToken\tokenType = TOK_SYMADDR ; Symbol ElseIf lexChar$ = "[" Then lexSymbol = True lexToken\tokenType = TOK_SYMARROP ; Symbol ElseIf lexChar$ = "]" Then lexSymbol = True lexToken\tokenType = TOK_SYMARRCL ; Symbol ElseIf lexChar$ = "{" Then lexSymbol = True lexToken\tokenType = TOK_SYMBEGIN ; Symbol ElseIf lexChar$ = "}" Then lexSymbol = True lexToken\tokenType = TOK_SYMEND ; Fehler Else errorType = ERR_SELECTCUTOUT errorRow = lexRow errorBeginCol = lexCharPos-1 errorEndCol = lexCharPos errorMessage$ = "unerlaubtes Zeichen" Return False EndIf If lexToken <> Null Then If lexSymbol = True Then ; Symbol If lexChar$ = Chr$(34) And lexQuote = True Then ; Wenn es ein " ist, und eine Zeichenkette folgt lexToken\tokenContent$ = lexChar$ lexToken\tokenBeginCol = lexCharPos lexToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 ; Zeichenkette seperat als Token speichern lexToken = New lexToken_t getToken(lexLine\content$) lexToken\tokenType = TOK_STRING lexToken\tokenContent$ = lexTmpToken$ lexToken\tokenRow = lexRow lexToken\tokenBeginCol = lexBeginToken lexToken\tokenEndCol = lexEndToken Else lexToken\tokenContent$ = lexChar$ lexToken\tokenBeginCol = lexCharPos lexToken\tokenEndCol = lexCharPos lexCharPos = lexCharPos+1 EndIf Else ; normales Token If lexQuote = True Then errorType = ERR_SELECTCUTOUT errorRow = lexRow errorBeginCol = lexBeginToken errorEndCol = lexLineLength errorMessage$ = "fehlendes "+Chr$(34) Return False EndIf lexToken\tokenContent$ = lexTmpToken$ lexToken\tokenBeginCol = lexBeginToken lexToken\tokenEndCol = lexEndToken EndIf EndIf Wend ; Token für eine neue Zeile lexToken = New lexToken_t lexToken\tokenType = TOK_NEWLINE lexToken\tokenContent$ = "\n" lexToken\tokenRow = lexRow ; Zeile aus dem Speicher nehmen Delete lexLine Next For lexToken = Each lexToken_t ; Textzahl in Wert umwandeln If lexToken\tokenType = TOK_NUMBER Then lexToken\tokenValue = str2dec(lexToken\tokenContent$) If lexToken\tokenValue = -1 Then errorType = ERR_SELECTCUTOUT errorRow = lexToken\tokenRow errorBeginCol = lexToken\tokenBeginCol-1 errorEndCol = lexToken\tokenEndCol errorMessage$ = "unerlaubtes Zeichen" Return False EndIf EndIf ; Hexadezimalwerte in Dezimalwerte umwandeln If lexToken\tokenType = TOK_HEXADEC Then lexToken\tokenValue = hex2dec(lexToken\tokenContent$) If lexToken\tokenValue = -1 Then errorType = ERR_SELECTCUTOUT errorRow = lexToken\tokenRow errorBeginCol = lexToken\tokenBeginCol-1 errorEndCol = lexToken\tokenEndCol errorMessage$ = "unerlaubtes Zeichen" Return False EndIf EndIf ; Binärwerte in Dezimalwerte umwandeln If lexToken\tokenType = TOK_BINARY Then lexToken\tokenValue = bin2dec(lexToken\tokenContent$) If lexToken\tokenValue = -1 Then errorType = ERR_SELECTCUTOUT errorRow = lexToken\tokenRow errorBeginCol = lexToken\tokenBeginCol-1 errorEndCol = lexToken\tokenEndCol errorMessage$ = "unerlaubtes Zeichen" Return False EndIf EndIf Next For lexToken = Each lexToken_t nextToken = After lexToken If nextToken <> Null Then If lexToken\tokenContent$ = "<" And nextToken\tokenContent$ = "=" Then Delete nextToken lexToken\tokenType = TOK_MATHLWEQL lexToken\tokenContent$ = "<=" ElseIf lexToken\tokenContent$ = "=" And nextToken\tokenContent$ = "<" Then Delete nextToken lexToken\tokenType = TOK_MATHLWEQL lexToken\tokenContent$ = "=<" ElseIf lexToken\tokenContent$ = "=" And nextToken\tokenContent$ = ">" Then Delete nextToken lexToken\tokenType = TOK_MATHGREQL lexToken\tokenContent$ = "=>" ElseIf lexToken\tokenContent$ = ">" And nextToken\tokenContent$ = "=" Then Delete nextToken lexToken\tokenType = TOK_MATHLWEQL lexToken\tokenContent$ = ">=" ElseIf lexToken\tokenContent$ = "<" And nextToken\tokenContent$ = ">" Then Delete nextToken lexToken\tokenType = TOK_MATHNEQL lexToken\tokenContent$ = "<>" ElseIf lexToken\tokenContent$ = ">" And nextToken\tokenContent$ = "<" Then Delete nextToken lexToken\tokenType = TOK_MATHNEQL lexToken\tokenContent$ = "><" ElseIf lexToken\tokenContent$ = "=" And nextToken\tokenContent$ = "=" Then Delete nextToken lexToken\tokenType = TOK_MATH2EQL lexToken\tokenContent$ = "==" EndIf EndIf Next fStream = WriteFile(tokenFile$) If fStream = 0 Then errorType = ERR_UNSELECTABLE errorMessage$ = "Datei konnte nicht geöffnet werden" Return False EndIf For lexToken = Each lexToken_t lexCount = lexCount+1 WriteInt fStream, lexToken\tokenType WriteString fStream, lexToken\tokenContent$ WriteInt fStream, lexToken\tokenValue WriteInt fStream, lexToken\tokenRow WriteInt fStream, lexToken\tokenBeginCol WriteInt fStream, lexToken\tokenEndCol Delete lexToken Next SeekFile fStream, 0 WriteInt fStream, lexCount CloseFile fStream Return True End Function ; Funktion zum filtern von Tokens Function getToken(content$) Local quit = False, char$ lexTmpToken$ = Mid$(content$, lexCharPos, 1) lexBeginToken = lexCharPos lexCharPos = lexCharPos+1 If lexQuote = True Then ; Wenn Zeichenkette in Anführungszeichen steht While lexCharPos < lexLineLength+1 And quit = False char$ = Mid$(content$, lexCharPos, 1) If char$ = Chr$(34) Then quit = True lexEndToken = lexCharPos+1 Else lexTmpToken$ = lexTmpToken$+char$ lexCharPos = lexCharPos+1 EndIf Wend Else ; Wenn nicht While lexCharPos < lexLineLength+1 And quit = False char$ = Mid$(content$, lexCharPos, 1) Select char$ Case " " quit = True lexEndToken = lexCharPos lexCharPos = lexCharPos+1 Case Chr$(9) quit = True lexEndToken = lexCharPos lexCharPos = lexCharPos+1 Case ";" : quit = True : lexEndToken = lexCharPos Case "$" : quit = True : lexEndToken = lexCharPos Case "%" : quit = True : lexEndToken = lexCharPos Case "=" : quit = True : lexEndToken = lexCharPos Case "<" : quit = True : lexEndToken = lexCharPos Case ">" : quit = True : lexEndToken = lexCharPos Case "+" : quit = True : lexEndToken = lexCharPos Case "-" : quit = True : lexEndToken = lexCharPos Case "*" : quit = True : lexEndToken = lexCharPos Case "/" : quit = True : lexEndToken = lexCharPos Case "^" : quit = True : lexEndToken = lexCharPos Case "&" : quit = True : lexEndToken = lexCharPos Case "|" : quit = True : lexEndToken = lexCharPos Case "!" : quit = True : lexEndToken = lexCharPos Case "~" : quit = True : lexEndToken = lexCharPos Case "(" : quit = True : lexEndToken = lexCharPos Case ")" : quit = True : lexEndToken = lexCharPos Case ":" : quit = True : lexEndToken = lexCharPos Case "," : quit = True : lexEndToken = lexCharPos Case Chr$(34) : quit = True : lexEndToken = lexCharPos Case "@" : quit = True : lexEndToken = lexCharPos Case "[" : quit = True : lexEndToken = lexCharPos Case "]" : quit = True : lexEndToken = lexCharPos Case "{" : quit = True : lexEndToken = lexCharPos Case "}" : quit = True : lexEndToken = lexCharPos Default lexTmpToken$ = lexTmpToken$+char$ lexCharPos = lexCharPos+1 End Select Wend EndIf End Function ; Funktion zum umwandeln von Textzahl in Dezimalwerte Function str2dec(strvalue$) Local decvalue, length, i, digit length = Len(strvalue$) For i = length To 1 Step -1 digit = Asc(Upper$(Mid$(strvalue$, i, 1))) ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 If digit>47 And digit<58 Then digit = digit-48 decvalue = decvalue+digit*10^(length-i) ; Unerlaubtes Zeichen Else Return -1 EndIf Next Return decvalue End Function ; Funktion zum umwandeln von Hexadezimalwerten in Dezimalwerte Function hex2dec(hexvalue$) Local decvalue, length, i, tetrad length = Len(hexvalue$) For i = length To 2 Step -1 tetrad = Asc(Upper$(Mid$(hexvalue$, i, 1))) ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 If tetrad>47 And tetrad<58 Then tetrad = tetrad-48 decvalue = decvalue+tetrad*16^(length-i) ; A, B, C, D, E, F ElseIf tetrad>64 And tetrad<71 tetrad = tetrad-55 decvalue = decvalue+tetrad*16^(length-i) ; Unerlaubtes Zeichen Else Return -1 EndIf Next Return decvalue End Function ; Funktion zum umwandeln von Binärwerten in Dezimalwerte Function bin2dec(binvalue$) Local decvalue, length, i, bit length = Len(binvalue$) For i = length To 2 Step -1 bit = Asc(Mid$(binvalue$, i, 1)) ; 0, 1 If bit = 48 Or bit = 49 Then bit = bit-48 decvalue = decvalue+bit*2^(length-i) ; Unerlaubtes Zeichen Else Return -1 EndIf Next Return decvalue End Function mfg olli |
||
vertex.dreamfall.at | GitHub |
ChristianH |
Sa, Okt 30, 2004 1:17 Antworten mit Zitat |
|
---|---|---|
Hi Vertex,
sehr schön, aber könntest du das ganze bitte auch in Dateien zum Download anbieten? MFG Chris. |
||
Vertex |
Sa, Okt 30, 2004 1:43 Antworten mit Zitat |
|
---|---|---|
unter http://vertex.art-fx.org/AdagioMini.zip 5 KB ist alles zusammengefasst.
mfg olli |
||
vertex.dreamfall.at | GitHub |
konstantin |
Sa, Okt 30, 2004 9:11 Antworten mit Zitat |
|
---|---|---|
vertex übertrumpht wieder mal alle. respekt, echt hübsche sache
@joachim_neu: das ist vertex' thread, wenn du so stolz auf deine "sprache" bist, dann mach einen neuen thread auf oder lass es -_-. |
||
joachim_neu |
Sa, Okt 30, 2004 9:39 Antworten mit Zitat |
|
---|---|---|
Alu hat Folgendes geschrieben: @joachim_neu: das ist vertex' thread, wenn du so stolz auf deine "sprache" bist, dann mach einen neuen thread auf oder lass es -_-. ich weiß! wollte es nurmal erwähnen. @vertex: nicht schlecht! sauber! EDIT: für alle, die es interessiert: BOSCL kann man wieder downloaden! |
||
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de |
Vertex |
So, Okt 31, 2004 15:16 Antworten mit Zitat |
|
---|---|---|
joachim_neu: Ich schau mir das mal an, wenn ich dann nach Hause komme.
http://vertex.art-fx.org/AdagioMini.zip Neue Version. Kann nun Includes mit lexex, und speichert diese sepperat als .token.tmpx ab. Kleinigkeit am Error System hinzugefügt, und ein paar Bugs auskoriert. Ihr wisst nicht, was das jetzt für eine Arbei war, die Includedirektive rekursiv einzubinden. mfg olli |
||
vertex.dreamfall.at | GitHub |
konstantin |
So, Okt 31, 2004 15:29 Antworten mit Zitat |
|
---|---|---|
[quote="joachim_neu"]Alu hat Folgendes geschrieben: EDIT:
für alle, die es interessiert: BOSCL kann man wieder downloaden! sry wenn ich hier jetzt arg off topic gehe, aber ich muss schon sagen das das zeug von joachim da ganz nett aussieht. funktioniert sogar unter linux mit wine prächtig. allerdings wäre eine dokumentation sinnvoll. @vertex: schaut sehr nett aus. |
||
Vertex |
So, Okt 31, 2004 20:18 Antworten mit Zitat |
|
---|---|---|
So ich denke mal der Lexer ist jetzt fertig. Er erkennt automatisch, ob nicht eine Datei doppelt eingebunden wurde(das kann selbst Blitz nicht) und es werden nun Unterstriche unterstützt:
Code: [AUSKLAPPEN] static byte k[3][3][3] = {{0, 1, 2}, _
{3, 4, 5}, _ {6, 7, 8}} Das ist z. B. jetzt möglich. Dabei wird erkannt, ob es sich nicht um z. B. eine Variable mit Unterstrich im Namen handelt, oder ob ein Zeilenende kommen muss. Code: [AUSKLAPPEN] static byte k[3][3][3] = {{0, 1, 2}, _
{3, 4, 5}, abc_def {6, 7, 8}} wäre somit ein lexikalisch korrekter Ausdruck, der Parser muss dann diesen syntaktischen Fehler erkennen. Ein Proble gibt es noch. Der Lexer kann nicht zwischen relativen und direkten Pfaden untrescheiden. Code: [AUSKLAPPEN] #include "test.am"
#include "..\AdagioMini\test.am" Würde keinen Fehler verursachen, obwohl es die selben Dateien sind. Ich bräuchte also irgendeine Funktion die mir den relativen Pfad in einen direkten Pfad umwandelt. Muss mal in der WinAPI rumblättern. mfg olli |
||
vertex.dreamfall.at | GitHub |
Nemesis |
So, Okt 31, 2004 21:01 Antworten mit Zitat |
|
---|---|---|
hmm. du includest die files im lexer?
wäre das nicht eher ne aufgabe für nen precompiler? |
||
Kekskiller |
So, Okt 31, 2004 21:19 Antworten mit Zitat |
|
---|---|---|
Wollte gerade sagen,da man die Datei ersmal
komplett zusammenfassen müsste. |
||
Vertex |
Mo, Nov 01, 2004 0:02 Antworten mit Zitat |
|
---|---|---|
Ist die einzigste Direktive, die ich direkt vom Lexer auswerten lasse. Dann kann ich mich beim Parser in Level 2 vollständig auf Syntaxbäume konzentrieren. Jedoch fällt mir gerade auf, das ich im Haupttokenstream vergessen habe, die Include-Dateinamen abzuspeichern, würde sich blöd machen beim parsen
mfg olli Edit: Alles behoben, der Includename wird nun als seperater Token dem TOK_INCFILE abgespeichert. |
||
vertex.dreamfall.at | GitHub |
regaa |
Mo, Nov 01, 2004 2:08 Antworten mit Zitat |
|
---|---|---|
Mal ganz dumm dahergefragt:
Wird der Prozessor den diese Konsole verwendet in irgendeiner Weise weiterentwickelt bzw. hat der Prozessortyp an sich ne Zukunft, so das auch die OP-Codes von den nächsten Generationen dieser Prozessoren verstanden werden? Weil wenn du ne Hochsprache für nen Handheld entwickelst der sowieso von seiner Beschaffenheit nur die nächsten 3 jahre aktuell ist, wäre es doch ziemlich schade, ansonsten Respekt, aber das hab ich dir schonmal gesagt. |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
Übersicht Sonstiges Projekte
Powered by phpBB © 2001 - 2006, phpBB Group