Witam, robię tłumacz własnego języka na język skryptowy Batch. Ale największy problem sprawia mi rozkład języka na "części pierwsze". Może mi ktoś podpowiedzieć w jak sposób najlepiej rozkładać kod?
Postanowiłem że w języku będą zawarte Metody oraz Słowa Kluczowe. Metody będą zawierały wszystkie funkcje języka batch, np. czyszczenie ekranu, wypisywanie czegoś na ekranie itp. Skład polecenia będzie prosty: Metoda{ARG1, ARG2, etc}
np: Print{'Tekst'}
Natomiast słowa kluczowe to będą bardziej złożone funkcje, np: instrukcja warunkowa, pętla, zmienne. Sposób byłby troszkę inny: If {WARUNEK operator WARUNEK}
lub Var Nazwa_zmiennej = Wartość
.
Wydaje mi się że rozkład języka na części jest najtrudniejszy, dlatego zwracam się tutaj o pomoc.
Na razie zrobiłem coś takiego:
unit Parser;
interface
uses
Classes,
System.SysUtils,
API_Lvl_1;
function Parse(SL : TStringList) : TStringList;
function Method(SL : TStringList) : String;
function Keyword(SL : TStringList) : String;
implementation
function Parse(SL : TStringList) : TStringList;
var
Code_Line : TStringList;
I : Integer;
begin
Result := TStringList.Create;
Code_Line := TStringList.Create;
for I := 0 to SL.Count-1 do
begin
if not SL.Strings[I].IsEmpty then
begin
if SL.Strings[I].Contains('{') then if SL.Strings[I].Contains('}') then
begin
ExtractStrings(['{', ',', '}'], [' '], PWideChar(SL.Strings[I]), Code_Line);
Method(Code_Line);
Code_Line.Clear;
end;
if not SL.Strings[I].Contains('{') then if not SL.Strings[I].Contains('}') then
begin
ExtractStrings([' '], [' '], PWideChar(SL.Strings[I]), Code_Line);
Keyword(Code_Line);
Code_Line.Clear;
end;
end;
end;
end;
function Method(SL : TStringList) : String;
begin
if SL.Strings[0].ToLower = 'print' then Result := API_Lvl_1.Method_Print(SL);
end;
function Keyword(SL : TStringList) : String;
begin
if SL.Strings[0].ToLower = 'var' then Result := API_Lvl_1.Keyword_Var(SL);
end;
end.
Powyższy kod analizuje wczytany wcześniej do zmiennej plik tekstowy, oraz zwraca już przetłumaczony tekst głównej części programu, gdzie zostanie zapisany do pliku.