| compiler of Simulang (source code) |
|---|
|
Download source files:
この記事は 2026年2月25日 水 11:20 に作者によって編集されましたhttp://www.jkofsp.net/files/ Please unzip bmp files from "@added-bmp-files.rar", then add these to "\bin\Debug\" or "\bin\Release\" "Advanced" version (source code): http://www.jkofsp.net/bbs/topic.aspx?id=363-0 Code Edit Box of Simulang (source code) http://www.jkofsp.net/bbs/topic.aspx?id=340-0 ASM of Simulang (source code) http://www.jkofsp.net/bbs/topic.aspx?id=341-0 Virtual Machine of Simulang (source code) http://www.jkofsp.net/bbs/topic.aspx?id=342-0 <CompilerMain.cs> using System; using System.IO; using System.Collections.Generic; public static partial class Compiler { public class MyException : Exception { public uint LineID; public MyException(uint lineID) { LineID = lineID; } } public static void GetSrcLines(string srcFilePath, ListEx<string> srcLines) { srcLines.Clear(); StreamReader r = new StreamReader(srcFilePath); string tmp = ""; while (tmp != null) { tmp = r.ReadLine(); if (tmp != null) srcLines.Add(tmp.Replace('\t', ' ')); } r.Close(); } public static void Compile(ListEx<string> srcLines, List<string> asmLines) { SetupKeys(); ListEx<ListEx<Token>> tokens = new ListEx<ListEx<Token>>(); // 空行? for (int i = 0; i <= srcLines.Max; i++) { tokens.Add(new ListEx<Token>()); for (int j = 0; j < srcLines[i].Length; ) { Token? token; try { token = NextToken(srcLines[i], ref j); } catch (Exception) { throw new MyException((uint)i); return; } if (token == null) break; if (token.Value.Type == TokenType.Im) token = new Token(TokenType.Im, TransIm(token.Value.Val)); if (token.Value.Type == TokenType.Id) token = new Token(TokenType.Id, TransId(token.Value.Val)); if (MapTokenIdToKey(token.Value)) token = new Token(TokenType.Key, token.Value.Val); tokens.End.Add(token.Value); } } ListEx<TokenLine> tokenLines = new ListEx<TokenLine>(); for (int i = 0; i <= tokens.Max; i++) { if (tokens[i].Count == 0) continue; tokenLines.Add(new TokenLine()); tokenLines.End.Ln = (uint)i; tokenLines.End.Tokens.AddRange(tokens[i]); } //List<TokenLines> _tokenLines; //_tokenLines = Simp(tokenLines); int endOfConst = GetConsts(tokenLines); int endOfGlobal = GetGlobals(endOfConst, tokenLines); GetFuncs(endOfGlobal, tokenLines); SetupFuncDefs(); // NO from .def file for (int i = 0; i <= Fns.Max; i++) { OutputStmts(Fns[i]); } GenGlobalsAddrs(); for (int i = 0; i <= Fns.Max; i++) { GenFnsVarsAddrs(Fns[i]); } for (int i = 0; i <= Fns.Max; i++) { ToAsms(Fns[i]); } asmLines.Clear(); asmLines.Add("mov4 x0, φmain"); asmLines.Add("call x0"); asmLines.Add("end"); for (int f = 0; f <= Fns.Max; f++) { for (int k = 0; k <= Fns[f].AsmsPrefix.Max; k++) asmLines.Add(Fns[f].AsmsPrefix[k]); for (int i = 0; i <= Fns[f].Lines.Max; i++) { for (int j = 0; j <= Fns[f].Lines[i].Asms.Max; j++) { asmLines.Add(Fns[f].Lines[i].Asms[j]); } } for (int k = 0; k <= Fns[f].AsmsSuffix.Max; k++) asmLines.Add(Fns[f].AsmsSuffix[k]); } } public static void GenSimFile(List<string> asmLines, string libAsmPath, string outputFilePath) { FileStream libAsmFile = new FileStream(libAsmPath, FileMode.OpenOrCreate); StreamReader r = new StreamReader(libAsmFile); while (!r.EndOfStream) asmLines.Add(r.ReadLine()); r.Close(); FileStream outputFile = new FileStream(outputFilePath, FileMode.OpenOrCreate); ASMLib.Asm.OK(asmLines, outputFile); // outputFile.Close(); } } |
|
<DeclsAndFuncs.cs>
public class TokenLine { public uint Ln; public ListEx<Token> Tokens = new ListEx<Token>(); } public class Const { public uint Ln; public ConstPair ConstVar; } public class Global { public uint Ln; public VarPair Var; } public class Fn { public uint Ln; public string Name; public ListEx<VarPair> Params = new ListEx<VarPair>(), Autos = new ListEx<VarPair>(); public byte RetType; // 0 for void public ListEx<Line> Lines = new ListEx<Line>(); public ListEx<string> AsmsPrefix = new ListEx<string>(), AsmsSuffix = new ListEx<string>(); } public struct ConstPair { public string Name, Val; } public struct VarPair { public string Name; public byte Type; public string Addr; } public static partial class Compiler { public static ListEx<Const> Consts = new ListEx<Const>(); public static ListEx<Global> Globals = new ListEx<Global>(); public static ListEx<Fn> Fns = new ListEx<Fn>(); public static byte TransType(string type) { if (type == "bool") return 1; else if (type == "char") return 2; else if (type == "Z") return 4; else if (type == "R") return 8; return 0; } public static int GetConsts(ListEx<TokenLine> tokenLines) // returns endOfGlobal { Consts.Clear(); int i = tokenLines.FindIndex(x => x.Tokens.Count == 1 && x.Tokens[0].Type == TokenType.Key && x.Tokens[0].Val == "const"); int j = tokenLines.FindIndex(x => x.Tokens.Count == 1 && x.Tokens[0].Type == TokenType.Key && x.Tokens[0].Val == "endconst"); if (i < 0 || j < 0) return - 1; for (int l = i + 1; l <= j - 1; l++) { if (tokenLines[l].Tokens.Count == 3 && tokenLines[l].Tokens[1].Type == TokenType.Op && tokenLines[l].Tokens[1].Val == "=" && tokenLines[l].Tokens[0].Type == TokenType.Id && tokenLines[l].Tokens[2].Type == TokenType.Im) { Consts.Add(new Const()); Consts.End.Ln = (uint)l; Consts.End.ConstVar = new ConstPair(); Consts.End.ConstVar.Name = tokenLines[l].Tokens[0].Val; Consts.End.ConstVar.Val = tokenLines[l].Tokens[2].Val; } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "state1" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "=" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Im) { Consts.Add(new Const()); Consts.End.Ln = (uint)l; Consts.End.ConstVar = new ConstPair(); Consts.End.ConstVar.Name = tokenLines[l].Tokens[1].Val + "ιcurrent"; Consts.End.ConstVar.Val = tokenLines[l].Tokens[3].Val; } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "state2" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "=" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Im) { Consts.Add(new Const()); Consts.End.Ln = (uint)l; Consts.End.ConstVar = new ConstPair(); Consts.End.ConstVar.Name = tokenLines[l].Tokens[1].Val + "ιnext"; Consts.End.ConstVar.Val = tokenLines[l].Tokens[3].Val; } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "diff1" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "=" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Im) { Consts.Add(new Const()); Consts.End.Ln = (uint)l; Consts.End.ConstVar = new ConstPair(); Consts.End.ConstVar.Name = tokenLines[l].Tokens[1].Val + "ιold"; Consts.End.ConstVar.Val = tokenLines[l].Tokens[3].Val; } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "diff2" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "=" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Im) { Consts.Add(new Const()); Consts.End.Ln = (uint)l; Consts.End.ConstVar = new ConstPair(); Consts.End.ConstVar.Name = tokenLines[l].Tokens[1].Val + "ιcurrent"; Consts.End.ConstVar.Val = tokenLines[l].Tokens[3].Val; } else throw new MyException(tokenLines[l].Ln); } return j; } public static int GetGlobals(int endOfConst, ListEx<TokenLine> tokenLines) // returns endOfGlobal { Globals.Clear(); int i = tokenLines.FindIndex(x => x.Tokens.Count == 1 && x.Tokens[0].Type == TokenType.Key && x.Tokens[0].Val == "global"); int j = tokenLines.FindIndex(x => x.Tokens.Count == 1 && x.Tokens[0].Type == TokenType.Key && x.Tokens[0].Val == "endglobal"); if (i < 0 || j < 0) return endOfConst; if (i <= endOfConst) throw new MyException(tokenLines[i].Ln); //Globals.Add(new VarPair()); //Globals.End.Name = "ξexitflag"; //Globals.End.Type = "bool"; for (int l = i + 1; l <= j - 1; l++) { if (tokenLines[l].Tokens.Count == 3 && tokenLines[l].Tokens[1].Type == TokenType.Op && tokenLines[l].Tokens[1].Val == "∈" && tokenLines[l].Tokens[0].Type == TokenType.Id && tokenLines[l].Tokens[2].Type == TokenType.Key) { Globals.Add(new Global()); Globals.End.Ln = (uint)l; Globals.End.Var = new VarPair(); Globals.End.Var.Name = tokenLines[l].Tokens[0].Val; Globals.End.Var.Type = TransType(tokenLines[l].Tokens[2].Val); if (Globals.End.Var.Type == 0) throw new MyException(tokenLines[l].Ln); } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "state" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "∈" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Key) { Globals.Add(new Global()); Globals.End.Ln = (uint)l; Globals.End.Var = new VarPair(); Globals.End.Var.Name = tokenLines[l].Tokens[1].Val + "ιcurrent"; Globals.End.Var.Type = TransType(tokenLines[l].Tokens[3].Val); if (Globals.End.Var.Type == 0) throw new MyException(tokenLines[l].Ln); Globals.Add(new Global()); Globals.End.Ln = (uint)l; Globals.End.Var = new VarPair(); Globals.End.Var.Name = tokenLines[l].Tokens[1].Val + "ιnext"; Globals.End.Var.Type = TransType(tokenLines[l].Tokens[3].Val); if (Globals.End.Var.Type == 0) throw new MyException(tokenLines[l].Ln); } else if (tokenLines[l].Tokens.Count == 4 && tokenLines[l].Tokens[0].Type == TokenType.Key && tokenLines[l].Tokens[0].Val == "diff" && tokenLines[l].Tokens[2].Type == TokenType.Op && tokenLines[l].Tokens[2].Val == "∈" && tokenLines[l].Tokens[1].Type == TokenType.Id && tokenLines[l].Tokens[3].Type == TokenType.Key) { Globals.Add(new Global()); Globals.End.Ln = (uint)l; Globals.End.Var = new VarPair(); Globals.End.Var.Name = tokenLines[l].Tokens[1].Val + "ιold"; Globals.End.Var.Type = TransType(tokenLines[l].Tokens[3].Val); if (Globals.End.Var.Type == 0) throw new MyException(tokenLines[l].Ln); Globals.Add(new Global()); Globals.End.Ln = (uint)l; Globals.End.Var = new VarPair(); Globals.End.Var.Name = tokenLines[l].Tokens[1].Val + "ιcurrent"; Globals.End.Var.Type = TransType(tokenLines[l].Tokens[3].Val); if (Globals.End.Var.Type == 0) throw new MyException(tokenLines[l].Ln); } else throw new MyException(tokenLines[l].Ln); } return j; } |
|
public static void GetFuncs(int endOfGlobal, ListEx<TokenLine> tokenLines)
{ Fns.Clear(); bool hasFunc = false; int i = endOfGlobal + 1; //for (int i = 0; i <= tokenLines.Max; i++) //{ _FuncBegin: if (i > tokenLines.Max) goto _Exit; if (tokenLines[i].Tokens[0].Type == TokenType.Key && tokenLines[i].Tokens[0].Val == "func") { hasFunc = true; bool hasEndfunc = false; for (int j = i + 1; j <= tokenLines.Max; j++) { /*if (tokenLines[j].Tokens.FindIndex(t => t.Type == TokenType.Key && (t.Val == "func" || t.Val == "global" || t.Val == "endglobal")) >= 0) throw new MyException(tokenLines[j].Ln);*/ if (tokenLines[j].Tokens.Count == 1 && tokenLines[j].Tokens[0].Type == TokenType.Key && tokenLines[j].Tokens[0].Val == "endfunc") { hasEndfunc = true; if (j - i <= 1) throw new MyException(tokenLines[i].Ln); Fns.Add(new Fn()); if (tokenLines[i].Tokens.Max <= 0) throw new MyException(tokenLines[i].Ln); if (tokenLines[i].Tokens[1].Type == TokenType.Id) Fns.End.Name = tokenLines[i].Tokens[1].Val; else throw new MyException(tokenLines[i].Ln); if (tokenLines[i].Tokens.End.Type != TokenType.Op || tokenLines[i].Tokens.End.Val != "=") throw new MyException(tokenLines[i].Ln); if (tokenLines[i].Tokens.Max >= 6 && tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 3].Type == TokenType.Op && tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 3].Val == ")" && tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 2].Type == TokenType.Op && tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 2].Val == "∈" && tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 1].Type == TokenType.Key) { Fns.End.RetType = TransType(tokenLines[i].Tokens[tokenLines[i].Tokens.Max - 1].Val); if (Fns.End.RetType == 0) throw new MyException(tokenLines[i].Ln); } else if (tokenLines[i].Tokens.Max >= 4) // && tokenLines[i].Tokens[tokenLines[i].Tokens.Max].Type == TokenType.Op && tokenLines[i].Tokens[tokenLines[i].Tokens.Max].Type == TokenType.Op) { Fns.End.RetType = 0; } else throw new MyException(tokenLines[i].Ln); int x = 2; int y = Fns.End.RetType == 0 ? tokenLines[i].Tokens.Max - 1 : tokenLines[i].Tokens.Max - 3; if (tokenLines[i].Tokens[x].Type != TokenType.Op || tokenLines[i].Tokens[x].Val != "(" || tokenLines[i].Tokens[y].Type != TokenType.Op || tokenLines[i].Tokens[y].Val != ")") throw new MyException(tokenLines[i].Ln); if (y - x > 1) { ListEx<ListEx<Token>> param = tokenLines[i].Tokens.Sub(x + 1, y - 1).Split(new Token(TokenType.Op, ","), (a, b) => a.Type == b.Type && a.Val == b.Val); foreach (ListEx<Token> p in param) { if (p.Count == 3 && p[1].Type == TokenType.Op && p[1].Val == "∈" && p[0].Type == TokenType.Id && p[2].Type == TokenType.Key) { VarPair tmp = new VarPair(); tmp.Name = p[0].Val; tmp.Type = TransType(p[2].Val); if (tmp.Type == 0) throw new MyException(tokenLines[i].Ln); Fns.End.Params.Add(tmp); } else throw new MyException(tokenLines[i].Ln); } } else Fns.End.Params.Clear(); int _k = -1; if (tokenLines[i + 1].Tokens.Count == 1 && tokenLines[i + 1].Tokens[0].Type == TokenType.Key && tokenLines[i + 1].Tokens[0].Val == "auto") { bool hasEndauto = false; for (int k = i + 1 + 1; k <= j - 1; k++) { if (tokenLines[k].Tokens.Count == 1 && tokenLines[k].Tokens[0].Type == TokenType.Key && tokenLines[k].Tokens[0].Val == "endauto") { hasEndauto = true; _k = k; if (k - (i + 1) <= 1) throw new MyException(tokenLines[i].Ln); for (int s = i + 1 + 1; s <= k - 1; s++) { if (tokenLines[s].Tokens.Count == 3 && tokenLines[s].Tokens[1].Type == TokenType.Op && tokenLines[s].Tokens[1].Val == "∈" && tokenLines[s].Tokens[0].Type == TokenType.Id && tokenLines[s].Tokens[2].Type == TokenType.Key) { VarPair tmp = new VarPair(); tmp.Name = tokenLines[s].Tokens[0].Val; tmp.Type = TransType(tokenLines[s].Tokens[2].Val); if (tmp.Type == 0) throw new MyException(tokenLines[s].Ln); Fns.End.Autos.Add(tmp); } else throw new MyException(tokenLines[s].Ln); } break; } } if (!hasEndauto) throw new MyException(tokenLines[j].Ln); } else _k = i; if (j - _k <= 1) throw new MyException(tokenLines[i].Ln); Fns.End.Lines = new ListEx<Line>(); for (int l = _k + 1; l <= j - 1; l++) { /*if (tokenLines[l].Tokens.FindIndex(t => t.Type == TokenType.Key && (t.Val == "func" || t.Val == "global" || t.Val == "endglobal" || t.Val == "auto" || t.Val == "endauto")) >= 0) throw new MyException(tokenLines[l].Ln);*/ Fns.End.Lines.Add(new Line()); Fns.End.Lines.End.Ln = tokenLines[l].Ln; Fns.End.Lines.End.Stmt = tokenLines[l].Tokens; } i = j + 1; //break; goto _FuncBegin; } } if (!hasEndfunc) throw new MyException(tokenLines.End.Ln); } else throw new MyException(tokenLines[i].Ln); //} _Exit: if (!hasFunc) throw new MyException(tokenLines.End.Ln); } } |
|
<FuncDefs.cs>
public class FnDef { public string Name; public ListEx<byte> ParamTypes = new ListEx<byte>(); public byte RetType; // 0 for void } public static partial class Compiler { public static ListEx<FnDef> FnDefs = new ListEx<FnDef>(); // NO from .def file public static void SetupFuncDefs() { FnDefs.Clear(); FnDefs.Add(new FnDef()); FnDefs.End.Name = "End"; FnDefs.End.RetType = 0; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Z2R"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "R2Z"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Z2Char"; FnDefs.End.RetType = 2; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Char2Z"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(2); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Mod"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ιNotBool"; FnDefs.End.RetType = 1; FnDefs.End.ParamTypes.Add(1); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ιNotZ"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name= "ShiftLeft"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name= "ShiftRight"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name= "Log"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Sin"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Cos"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Tan"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArcSin"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArcCos"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArcTan"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Rnd"; FnDefs.End.RetType = 8; FnDefs.Add(new FnDef()); FnDefs.End.Name = "RndInit"; FnDefs.End.RetType = 0; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Tick"; FnDefs.End.RetType = 8; FnDefs.Add(new FnDef()); FnDefs.End.Name = "TickShang"; FnDefs.End.RetType = 8; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Delete"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Size"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "DoEvents"; FnDefs.End.RetType = 0; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Debug"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ExDelete"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Z2Str"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Z2StrB"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Z2StrH"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "R2Str"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Str2Z"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StrB2Z"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StrH2Z"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Str2R"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCopy"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCompare"; FnDefs.End.RetType = 1; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "CreateReader"; // cannot use "New", "N" (false) FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "CreateWriter"; // cannot use "New", "N" (false) FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "CloseReader"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "CloseWriter"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReaderLen"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReadBool"; FnDefs.End.RetType = 1; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReadChar"; FnDefs.End.RetType = 2; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReadZ"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReadR"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ReadArray"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "WriteBool"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); FnDefs.Add(new FnDef()); FnDefs.End.Name = "WriteChar"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(2); FnDefs.Add(new FnDef()); FnDefs.End.Name = "WriteZ"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "WriteR"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "WriteArray"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Key"; FnDefs.End.RetType = 1; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "Left"; FnDefs.End.RetType = 1; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Right"; FnDefs.End.RetType = 1; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Middle"; FnDefs.End.RetType = 1; FnDefs.Add(new FnDef()); FnDefs.End.Name = "MouseιdZ"; FnDefs.End.RetType = 4; FnDefs.Add(new FnDef()); FnDefs.End.Name = "MouseX"; FnDefs.End.RetType = 4; FnDefs.Add(new FnDef()); FnDefs.End.Name = "MouseY"; FnDefs.End.RetType = 4; |
|
FnDefs.Add(new FnDef()); FnDefs.End.Name = "Clear"; FnDefs.End.RetType = 0; FnDefs.Add(new FnDef()); FnDefs.End.Name = "Present"; FnDefs.End.RetType = 0; // x0: err, x1: surf, x2: path, x3: videomem FnDefs.Add(new FnDef()); FnDefs.End.Name = "CreateSurface"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); FnDefs.Add(new FnDef()); FnDefs.End.Name = "SurfaceDX"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "SurfaceDY"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); // x0: err, x1: destX, x2: destY, x3: destDX, x4: destDY, x5: surf, x6: srcX, x7: srcY, x8: srcDX, x9: srcDY, x10: useColorKey FnDefs.Add(new FnDef()); FnDefs.End.Name = "Blt"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); // surf FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); // useColoeKey // x0: err, x1: x1, x2: y1, x3: x2, x4: y2, x5: color(Z) FnDefs.Add(new FnDef()); FnDefs.End.Name = "DrawLine"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); // x0: err, x1: x1, x2: y1, x3: x2, x4: y2, x5: bordercolor(Z), x6: fillcolor(Z), x7: transparent FnDefs.Add(new FnDef()); FnDefs.End.Name = "DrawBox"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); // x0: err, x1: x1, x2: y1, x3: x2, x4: y2, x5: rw, x6: rh, x7: bordercolor(Z), x8: fillcolor(Z), x9: transparent FnDefs.Add(new FnDef()); FnDefs.End.Name = "DrawRBox"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); // x0: err, x1: x1, x2: y1, x3: x2, x4: y2, x5: bordercolor(Z), x6: fillcolor(Z), x7: transparent FnDefs.Add(new FnDef()); FnDefs.End.Name = "DrawEllipse"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); // x0: err, x1: str, x2: fontsize(R), x3: color(Z), x4: x, x5: y, x6: dx, x7: dy FnDefs.Add(new FnDef()); FnDefs.End.Name = "DrawText"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(8); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); // x0: err, x1: sndbuf, x2: path FnDefs.Add(new FnDef()); FnDefs.End.Name = "CreateSoundBuffer"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); // x0: err, x1: volume, x2: sndbuf FnDefs.Add(new FnDef()); FnDefs.End.Name = "GetVolume"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); // x0: err, x1: sndbuf, x2: volume FnDefs.Add(new FnDef()); FnDefs.End.Name = "SetVolume"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); // x0: err, x1: sndbuf, x2: looping FnDefs.Add(new FnDef()); FnDefs.End.Name = "Play"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); // x0: err, x1: sndbuf*/ FnDefs.Add(new FnDef()); FnDefs.End.Name = "Stop"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCharCreate"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCharGet"; FnDefs.End.RetType = 2; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCharSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(2); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayCharLen"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayZCreate"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayZGet"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayZSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayZLen"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayRCreate"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayRGet"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayRSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(8); FnDefs.Add(new FnDef()); FnDefs.End.Name = "ArrayRLen"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructCreate"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructBoolGet"; FnDefs.End.RetType = 1; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructBoolSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(1); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructCharGet"; FnDefs.End.RetType = 2; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructCharSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(2); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructZGet"; FnDefs.End.RetType = 4; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructZSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructRGet"; FnDefs.End.RetType = 8; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.Add(new FnDef()); FnDefs.End.Name = "StructRSet"; FnDefs.End.RetType = 0; FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(4); FnDefs.End.ParamTypes.Add(8); } } |
|
<MapVarAddr.cs>
public static partial class Compiler { public static void GenGlobalsAddrs() { int c = 0; for (int i = 0; i <= Globals.Max; i++) { Globals[i].Var.Addr = '[' + c.ToString() + ']'; c += Globals[i].Var.Type; } } public static void GenFnsVarsAddrs(Fn fn) { // example: // push4 x // push4 y // call f ;push ip jmp f // push4 a // push4 b int c = -1; for (int a = fn.Autos.Max; a >= 0; a--) { c += fn.Autos[a].Type; VarPair tmp = new VarPair(); tmp.Name = fn.Autos[a].Name; tmp.Type = fn.Autos[a].Type; tmp.Addr = "[sp-" + c.ToString() + ']'; fn.Autos[a] = tmp; } c += 4; // ret addr in stack for (int p = fn.Params.Max; p >= 0; p--) { c += fn.Params[p].Type; VarPair tmp = new VarPair(); tmp.Name = fn.Params[p].Name; tmp.Type = fn.Params[p].Type; tmp.Addr = "[sp-" + c.ToString() + ']'; fn.Params[p] = tmp; } } } |
|
<OutputStmts.cs>
public class Line { public uint Ln; public ListEx<Token> Stmt = new ListEx<Token>(); public OutputStmt OutputStmt; public ListEx<string> Asms = new ListEx<string>(); } public class OutputStmt { //public int Ln; public string Label; public OutputStmtKind Kind; public string OpOrFn; public string LVal; public byte LType; // 1248 public ListEx<bool> RIsIm = new ListEx<bool>(); public ListEx<string> RVals = new ListEx<string>(); public ListEx<byte> RTypes = new ListEx<byte>(); public string GotoLabel; } public enum OutputStmtKind { Nop, Goto, IfGoto, Do, AssignFn, Assign, AssignOp, Ret, // Err, // no err } public static partial class Compiler { public static ConstPair? FindConst(string constName) { int c = Consts.FindIndex(x => x.ConstVar.Name == constName); if (c >= 0) return Consts[c].ConstVar; return null; } public static VarPair? FindVar(Fn fn, string varName) { int v = Globals.FindIndex(x => x.Var.Name == varName); if (v >= 0) return Globals[v].Var; else { v = fn.Params.FindIndex(x => x.Name == varName); if (v >= 0) return fn.Params[v]; else { v = fn.Autos.FindIndex(x => x.Name == varName); if (v >= 0) return fn.Autos[v]; } } return null; } public static byte GetImType(string im) { if (im.Length <= 0) return 0; if (im == "true" || im == "false") return 1; else if (im.Length == 3 && im[0] == '`') return 2; else if (im.Contains(".")) return 8; else return 4; return 0; } public static void OutputStmts(Fn fn) { for (int i = 0; i <= fn.Lines.Max; i++) // ListEx<> { fn.Lines[i].OutputStmt = new OutputStmt(); string label = null; if (fn.Lines[i].Stmt.Count == 1 && fn.Lines[i].Stmt[0].Type == TokenType.Label) { label = fn.Lines[i].Stmt[0].Val; fn.Lines[i].OutputStmt.Label = label; fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Nop; continue; } else if (fn.Lines[i].Stmt.Count >= 4 && fn.Lines[i].Stmt[0].Type == TokenType.Key && fn.Lines[i].Stmt[0].Val == "do") // copy to <- { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Do; if (fn.Lines[i].Stmt[1].Type != TokenType.Id) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.OpOrFn = fn.Lines[i].Stmt[1].Val; if (fn.Lines[i].Stmt[2].Type != TokenType.Op || fn.Lines[i].Stmt[2].Val != "(" || fn.Lines[i].Stmt[fn.Lines[i].Stmt.Max].Type != TokenType.Op || fn.Lines[i].Stmt[fn.Lines[i].Stmt.Max].Val != ")") throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].Stmt.Max - 1 - 3 >= 0) { ListEx<ListEx<Token>> args = fn.Lines[i].Stmt.Sub(3, fn.Lines[i].Stmt.Max - 1).Split(new Token(TokenType.Op, ","), (a, b) => a.Type == b.Type && a.Val == b.Val); foreach (ListEx<Token> a in args) { if (a.Count == 1 && (a[0].Type == TokenType.Im || a[0].Type == TokenType.Id)) { if (a[0].Type == TokenType.Im) { byte tyrv = GetImType(a[0].Val); if (tyrv == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(a[0].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv); } else if (a[0].Type == TokenType.Id) { ConstPair? rc = FindConst(a[0].Val); if (rc != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc.Value.Val)); } else { VarPair? rv = FindVar(fn, a[0].Val); if (rv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv.Value.Type); } } } else throw new MyException(fn.Lines[i].Ln); } } int tfndef = FnDefs.FindIndex(x => x.Name == fn.Lines[i].OutputStmt.OpOrFn); if (tfndef >= 0) { if (FnDefs[tfndef].ParamTypes.Count != fn.Lines[i].OutputStmt.RVals.Count) throw new MyException(fn.Lines[i].Ln); for (int t = 0; t <= fn.Lines[i].OutputStmt.RVals.Max; t++) { if (fn.Lines[i].OutputStmt.RTypes[t] != FnDefs[tfndef].ParamTypes[t]) throw new MyException(fn.Lines[i].Ln); } } else { int tfn = Fns.FindIndex(x => x.Name == fn.Lines[i].OutputStmt.OpOrFn); if (tfn >= 0) { if (Fns[tfn].Params.Count != fn.Lines[i].OutputStmt.RVals.Count) throw new MyException(fn.Lines[i].Ln); for (int t = 0; t <= fn.Lines[i].OutputStmt.RVals.Max; t++) { if (fn.Lines[i].OutputStmt.RTypes[t] != Fns[tfn].Params[t].Type) throw new MyException(fn.Lines[i].Ln); } } else throw new MyException(fn.Lines[i].Ln); } } |
|
else if (fn.Lines[i].Stmt.Count >= 5
&& fn.Lines[i].Stmt[1].Type == TokenType.Op && fn.Lines[i].Stmt[1].Val == "←" && fn.Lines[i].Stmt[3].Type == TokenType.Op && fn.Lines[i].Stmt[3].Val == "(") // copy from do) { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.AssignFn; if (fn.Lines[i].Stmt[2].Type != TokenType.Id) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.OpOrFn = fn.Lines[i].Stmt[2].Val; if (fn.Lines[i].Stmt[0].Type != TokenType.Id) // left val throw new MyException(fn.Lines[i].Ln); VarPair? lv = FindVar(fn, fn.Lines[i].Stmt[0].Val); if (lv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.LVal = lv.Value.Name; fn.Lines[i].OutputStmt.LType = lv.Value.Type; if (fn.Lines[i].Stmt[3].Type != TokenType.Op || fn.Lines[i].Stmt[3].Val != "(" || fn.Lines[i].Stmt[fn.Lines[i].Stmt.Max].Type != TokenType.Op || fn.Lines[i].Stmt[fn.Lines[i].Stmt.Max].Val != ")") throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].Stmt.Max - 1 - 4 >= 0) { ListEx<ListEx<Token>> args = fn.Lines[i].Stmt.Sub(4, fn.Lines[i].Stmt.Max - 1).Split(new Token(TokenType.Op, ","), (a, b) => a.Type == b.Type && a.Val == b.Val); foreach (ListEx<Token> a in args) { if (a.Count == 1 && (a[0].Type == TokenType.Im || a[0].Type == TokenType.Id)) { if (a[0].Type == TokenType.Im) { byte tyrv = GetImType(a[0].Val); if (tyrv == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(a[0].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv); } else if (a[0].Type == TokenType.Id) { ConstPair? rc = FindConst(a[0].Val); if (rc != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc.Value.Val)); } else { VarPair? rv = FindVar(fn, a[0].Val); if (rv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv.Value.Type); } } } else throw new MyException(fn.Lines[i].Ln); } } int tfndef = FnDefs.FindIndex(x => x.Name == fn.Lines[i].OutputStmt.OpOrFn); if (tfndef >= 0) { if (fn.Lines[i].OutputStmt.LType != FnDefs[tfndef].RetType) // left val (return type) throw new MyException(fn.Lines[i].Ln); if (FnDefs[tfndef].ParamTypes.Count != fn.Lines[i].OutputStmt.RVals.Count) throw new MyException(fn.Lines[i].Ln); for (int t = 0; t <= fn.Lines[i].OutputStmt.RVals.Max; t++) { if (fn.Lines[i].OutputStmt.RTypes[t] != FnDefs[tfndef].ParamTypes[t]) throw new MyException(fn.Lines[i].Ln); } } else { int tfn = Fns.FindIndex(x => x.Name == fn.Lines[i].OutputStmt.OpOrFn); if (tfn >= 0) { if (fn.Lines[i].OutputStmt.LType != Fns[tfn].RetType) // left val (return type) throw new MyException(fn.Lines[i].Ln); if (Fns[tfn].Params.Count != fn.Lines[i].OutputStmt.RVals.Count) throw new MyException(fn.Lines[i].Ln); for (int t = 0; t <= fn.Lines[i].OutputStmt.RVals.Max; t++) { if (fn.Lines[i].OutputStmt.RTypes[t] != Fns[tfn].Params[t].Type) throw new MyException(fn.Lines[i].Ln); } } else throw new MyException(fn.Lines[i].Ln); } } else if (fn.Lines[i].Stmt.Count == 3 && fn.Lines[i].Stmt[1].Type == TokenType.Op && fn.Lines[i].Stmt[1].Val == "←") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Assign; if (fn.Lines[i].Stmt[0].Type != TokenType.Id) // left val throw new MyException(fn.Lines[i].Ln); VarPair? lv = FindVar(fn, fn.Lines[i].Stmt[0].Val); if (lv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.LVal = lv.Value.Name; fn.Lines[i].OutputStmt.LType = lv.Value.Type; if (fn.Lines[i].Stmt[2].Type == TokenType.Im) // right val { byte tyrv = GetImType(fn.Lines[i].Stmt[2].Val); if (tyrv == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(fn.Lines[i].Stmt[2].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv); } else if (fn.Lines[i].Stmt[2].Type == TokenType.Id) { ConstPair? rc = FindConst(fn.Lines[i].Stmt[2].Val); if (rc != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc.Value.Val)); } else { VarPair? rv = FindVar(fn, fn.Lines[i].Stmt[2].Val); if (rv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv.Value.Type); } } else throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.LType != fn.Lines[i].OutputStmt.RTypes[0]) throw new MyException(fn.Lines[i].Ln); } |
|
else if (fn.Lines[i].Stmt.Count == 5
&& fn.Lines[i].Stmt[1].Type == TokenType.Op && fn.Lines[i].Stmt[1].Val == "←" && fn.Lines[i].Stmt[3].Type == TokenType.Op && fn.Lines[i].Stmt[3].Val != "(") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.AssignOp; if (fn.Lines[i].Stmt[3].Type != TokenType.Op) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.OpOrFn = fn.Lines[i].Stmt[3].Val; if (fn.Lines[i].Stmt[0].Type != TokenType.Id) // left val throw new MyException(fn.Lines[i].Ln); VarPair? lv = FindVar(fn, fn.Lines[i].Stmt[0].Val); if (lv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.LVal = lv.Value.Name; fn.Lines[i].OutputStmt.LType = lv.Value.Type; if (fn.Lines[i].Stmt[2].Type == TokenType.Im) // right val 1 { byte tyrv1 = GetImType(fn.Lines[i].Stmt[2].Val); if (tyrv1 == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(fn.Lines[i].Stmt[2].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv1); } else if (fn.Lines[i].Stmt[2].Type == TokenType.Id) { ConstPair? rc1 = FindConst(fn.Lines[i].Stmt[2].Val); if (rc1 != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc1.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc1.Value.Val)); } else { VarPair? rv1 = FindVar(fn, fn.Lines[i].Stmt[2].Val); if (rv1 == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv1.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv1.Value.Type); } } else throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].Stmt[4].Type == TokenType.Im) // right val 2 { byte tyrv2 = GetImType(fn.Lines[i].Stmt[4].Val); if (tyrv2 == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(fn.Lines[i].Stmt[4].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv2); } else if (fn.Lines[i].Stmt[4].Type == TokenType.Id) { ConstPair? rc2 = FindConst(fn.Lines[i].Stmt[4].Val); if (rc2 != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc2.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc2.Value.Val)); } else { VarPair? rv2 = FindVar(fn, fn.Lines[i].Stmt[4].Val); if (rv2 == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv2.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv2.Value.Type); } } else throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.OpOrFn == "+" || fn.Lines[i].OutputStmt.OpOrFn == "-" || fn.Lines[i].OutputStmt.OpOrFn == "*" || fn.Lines[i].OutputStmt.OpOrFn == "÷") { if (fn.Lines[i].OutputStmt.LType != 4 && fn.Lines[i].OutputStmt.LType != 8) throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.LType == 4) { if (fn.Lines[i].OutputStmt.RTypes[0] != 4 || fn.Lines[i].OutputStmt.RTypes[1] != 4) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].OutputStmt.LType == 8) { if (fn.Lines[i].OutputStmt.RTypes[0] != 8 || fn.Lines[i].OutputStmt.RTypes[1] != 8) throw new MyException(fn.Lines[i].Ln); } } else if (fn.Lines[i].OutputStmt.OpOrFn == "^") { if (fn.Lines[i].OutputStmt.LType != 8) throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.RTypes[0] != 8 || fn.Lines[i].OutputStmt.RTypes[1] != 8) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].OutputStmt.OpOrFn == "&" // not uses not() || fn.Lines[i].OutputStmt.OpOrFn == ":" || fn.Lines[i].OutputStmt.OpOrFn == "~") { if (fn.Lines[i].OutputStmt.LType != 1 && fn.Lines[i].OutputStmt.LType != 4) throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.LType == 1) { if (fn.Lines[i].OutputStmt.RTypes[0] != 1 || fn.Lines[i].OutputStmt.RTypes[1] != 1) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].OutputStmt.LType == 4) { if (fn.Lines[i].OutputStmt.RTypes[0] != 4 || fn.Lines[i].OutputStmt.RTypes[1] != 4) throw new MyException(fn.Lines[i].Ln); } } else if (fn.Lines[i].OutputStmt.OpOrFn == "=" || fn.Lines[i].OutputStmt.OpOrFn == "≠") { if (fn.Lines[i].OutputStmt.LType != 1) throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.RTypes[0] != fn.Lines[i].OutputStmt.RTypes[1]) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].OutputStmt.OpOrFn == "<" || fn.Lines[i].OutputStmt.OpOrFn == ">" || fn.Lines[i].OutputStmt.OpOrFn == "≤" || fn.Lines[i].OutputStmt.OpOrFn == "≥") { if (fn.Lines[i].OutputStmt.LType != 1) throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.RTypes[0] == 4) { if (fn.Lines[i].OutputStmt.RTypes[1] != 4) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].OutputStmt.RTypes[0] == 8) { if (fn.Lines[i].OutputStmt.RTypes[1] != 8) throw new MyException(fn.Lines[i].Ln); } else throw new MyException(fn.Lines[i].Ln); } else throw new MyException(fn.Lines[i].Ln); } |
|
else if (fn.Lines[i].Stmt.Count == 2
&& fn.Lines[i].Stmt[0].Type == TokenType.Key && fn.Lines[i].Stmt[0].Val == "goto") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Goto; if (fn.Lines[i].Stmt[1].Type != TokenType.Label) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.GotoLabel = fn.Lines[i].Stmt[1].Val; } else if (fn.Lines[i].Stmt.Count == 4 && fn.Lines[i].Stmt[0].Type == TokenType.Key && fn.Lines[i].Stmt[0].Val == "if" && fn.Lines[i].Stmt[2].Type == TokenType.Key && fn.Lines[i].Stmt[2].Val == "goto") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.IfGoto; if (fn.Lines[i].Stmt[3].Type != TokenType.Label) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.GotoLabel = fn.Lines[i].Stmt[3].Val; if (fn.Lines[i].Stmt[1].Type == TokenType.Im) { byte tyrv = GetImType(fn.Lines[i].Stmt[1].Val); if (tyrv == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(fn.Lines[i].Stmt[1].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv); } else if (fn.Lines[i].Stmt[1].Type == TokenType.Id) { ConstPair? rc = FindConst(fn.Lines[i].Stmt[1].Val); if (rc != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc.Value.Val)); } else { VarPair? rv = FindVar(fn, fn.Lines[i].Stmt[1].Val); if (rv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv.Value.Type); } } else throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.RTypes[0] != 1) throw new MyException(fn.Lines[i].Ln); } else if (fn.Lines[i].Stmt.Count == 1 && fn.Lines[i].Stmt[0].Type == TokenType.Key && fn.Lines[i].Stmt[0].Val == "ret") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Ret; } else if (fn.Lines[i].Stmt.Count == 2 && fn.Lines[i].Stmt[0].Type == TokenType.Key && fn.Lines[i].Stmt[0].Val == "ret") { fn.Lines[i].OutputStmt.Kind = OutputStmtKind.Ret; if (fn.Lines[i].Stmt[1].Type == TokenType.Im) { byte tyrv = GetImType(fn.Lines[i].Stmt[1].Val); if (tyrv == 0) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(fn.Lines[i].Stmt[1].Val); fn.Lines[i].OutputStmt.RTypes.Add(tyrv); } else if (fn.Lines[i].Stmt[1].Type == TokenType.Id) { ConstPair? rc = FindConst(fn.Lines[i].Stmt[1].Val); if (rc != null) { fn.Lines[i].OutputStmt.RIsIm.Add(true); fn.Lines[i].OutputStmt.RVals.Add(rc.Value.Val); fn.Lines[i].OutputStmt.RTypes.Add(GetImType(rc.Value.Val)); } else { VarPair? rv = FindVar(fn, fn.Lines[i].Stmt[1].Val); if (rv == null) throw new MyException(fn.Lines[i].Ln); fn.Lines[i].OutputStmt.RIsIm.Add(false); fn.Lines[i].OutputStmt.RVals.Add(rv.Value.Name); fn.Lines[i].OutputStmt.RTypes.Add(rv.Value.Type); } } else throw new MyException(fn.Lines[i].Ln); if (fn.Lines[i].OutputStmt.RTypes[0] != fn.RetType) throw new MyException(fn.Lines[i].Ln); } else throw new MyException(fn.Lines[i].Ln); } } } |
|
<ToAsm.cs>
public static partial class Compiler { public static void ToAsms(Fn fn) // check types in outoutstmts() { fn.AsmsPrefix.Add("φ" + fn.Name + ": nop"); for (int i = 0; i <= fn.Autos.Max; i++) fn.AsmsPrefix.Add("push" + fn.Autos[i].Type + " x0"); for (int i = 0; i <= fn.Lines.Max; i++) { if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.Do) { for (int j = 0; j <= fn.Lines[i].OutputStmt.RVals.Max; j++) { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x" + j.ToString() + ", " + (fn.Lines[i].OutputStmt.RIsIm[j] ? fn.Lines[i].OutputStmt.RVals[j] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[j]).Value.Addr)); } for (int j = 0; j <= fn.Lines[i].OutputStmt.RVals.Max; j++) { fn.Lines[i].Asms.Add("push" + fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x" + j.ToString()); } fn.Lines[i].Asms.Add("mov4 x0, " + "φ" + fn.Lines[i].OutputStmt.OpOrFn); fn.Lines[i].Asms.Add("call x0"); for (int j = fn.Lines[i].OutputStmt.RVals.Max; j >= 0; j--) { fn.Lines[i].Asms.Add("pop"+ fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x1"); } } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.AssignFn) { for (int j = 0; j <= fn.Lines[i].OutputStmt.RVals.Max; j++) { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x" + j.ToString() + ", " + (fn.Lines[i].OutputStmt.RIsIm[j] ? fn.Lines[i].OutputStmt.RVals[j] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[j]).Value.Addr)); } for (int j = 0; j <= fn.Lines[i].OutputStmt.RVals.Max; j++) { fn.Lines[i].Asms.Add("push" + fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x" + j.ToString()); } fn.Lines[i].Asms.Add("mov4 x0, " + "φ" + fn.Lines[i].OutputStmt.OpOrFn); fn.Lines[i].Asms.Add("call x0"); for (int j = fn.Lines[i].OutputStmt.RVals.Max; j >= 0; j--) { fn.Lines[i].Asms.Add("pop" + fn.Lines[i].OutputStmt.RTypes[j].ToString() + " x1"); } fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.Assign) { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", " + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.AssignOp) { if (fn.Lines[i].OutputStmt.OpOrFn == "+") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("add" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "-") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("sub" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "*") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("mul" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "÷") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("div" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "^") { fn.Lines[i].Asms.Add("mov8 x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov8 x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("pow x0, x1, x2"); fn.Lines[i].Asms.Add("mov8 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "&") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("and" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == ":") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("or" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "~") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("xor" + fn.Lines[i].OutputStmt.LType.ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.LType.ToString() + " " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } |
|
else if (fn.Lines[i].OutputStmt.OpOrFn == "=")
{ fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("eq" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "≠") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x3," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("eq" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1, x2, x3"); fn.Lines[i].Asms.Add("not1 x0, x1"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "<") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("lt" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == ">") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x2," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("gt" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x0, x1, x2"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "≤") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x3," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x4," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("lt" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1, x3, x4"); fn.Lines[i].Asms.Add("eq" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x2, x3, x4"); fn.Lines[i].Asms.Add("or1 x0, x1, x2"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } else if (fn.Lines[i].OutputStmt.OpOrFn == "≥") { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x3," + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[1].ToString() + " x4," + (fn.Lines[i].OutputStmt.RIsIm[1] ? fn.Lines[i].OutputStmt.RVals[1] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[1]).Value.Addr)); fn.Lines[i].Asms.Add("gt" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x1, x3, x4"); fn.Lines[i].Asms.Add("eq" + fn.Lines[i].OutputStmt.RTypes[0].ToString() + " x2, x3, x4"); fn.Lines[i].Asms.Add("or1 x0, x1, x2"); fn.Lines[i].Asms.Add("mov1 " + FindVar(fn, fn.Lines[i].OutputStmt.LVal).Value.Addr + ", x0"); } } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.Nop) { fn.Lines[i].Asms.Add(fn.Name + "ξ" + fn.Lines[i].OutputStmt.Label + ": nop"); } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.Goto) { fn.Lines[i].Asms.Add("mov4 x0, " + fn.Name + "ξ" + fn.Lines[i].OutputStmt.GotoLabel); fn.Lines[i].Asms.Add("jmp x0"); } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.IfGoto) { fn.Lines[i].Asms.Add("mov4 x0, " + fn.Name + "ξ" + fn.Lines[i].OutputStmt.GotoLabel); fn.Lines[i].Asms.Add("mov1 x1, " + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("jmpc x0, x1"); } else if (fn.Lines[i].OutputStmt.Kind == OutputStmtKind.Ret) { if (fn.Lines[i].OutputStmt.RVals.Count == 0) { fn.Lines[i].Asms.Add("mov4 x1, " + fn.Name + "ξψ"); fn.Lines[i].Asms.Add("jmp x1"); } else if (fn.Lines[i].OutputStmt.RVals.Count == 1) { fn.Lines[i].Asms.Add("mov" + fn.Lines[i].OutputStmt.RTypes[0] + " x0, " // set ret val (movn x0, [r]) + (fn.Lines[i].OutputStmt.RIsIm[0] ? fn.Lines[i].OutputStmt.RVals[0] : FindVar(fn, fn.Lines[i].OutputStmt.RVals[0]).Value.Addr)); fn.Lines[i].Asms.Add("mov4 x1, " + fn.Name + "ξψ"); fn.Lines[i].Asms.Add("jmp x1"); } } } fn.AsmsSuffix.Add(fn.Name + "ξψ: nop"); for (int i = fn.Autos.Max; i >= 0; i--) fn.AsmsSuffix.Add("pop" + fn.Autos[i].Type + " x1"); fn.AsmsSuffix.Add("ret"); } } |
|
<Lexer.cs>
using System; // lexer of compiler public enum TokenType { None, Label, Im, Id, Key, Op, } public struct Token { public TokenType Type; public string Val; public Token(TokenType type, string val) { Type = type; Val = val; } } // change ` to ' in CodeEditBox2! // do not support y', y'' // do not support greek delta or math delta // change trye false to y n in CodeEditBox2 public static partial class Compiler { static Token? NextToken(string l, ref int i) // 空の行はnullを戻す { if (l.Length == 0) return null; Token t = new Token(TokenType.None, ""); _Start: if (i >= l.Length) { return null; } else if (l[i] == ' ' || l[i] == '\t') { i++; goto _Start; } else if (l[i] == 'Y' || l[i] == 'N') { t.Val += l[i]; i++; t.Type = TokenType.Im; return t; } else if ((l[i] >= 'a' && l[i] <= 'z') || (l[i] >= 'A' && l[i] <= 'Z') || l[i] == '_' || l[i] == '\'') { t.Val += l[i]; i++; goto _Identifier; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _Z; } else if (l[i] == '-') { t.Val += l[i]; i++; goto _Minus; } else if (l[i] == '`') { t.Val += l[i]; i++; goto _Char; } else if (l[i] == '|') { i++; goto _Label; } else if (l[i] == '/') { i++; goto _Comment; } else { t.Val += l[i]; i++; t.Type = TokenType.Op; return t; } _Comment: if (i >= l.Length) { return null; } else if (l[i] == '/') { i++; goto _Comment2; } else { throw new Exception(); } _Comment2: if (i >= l.Length) { return null; } else { i++; goto _Comment2; } _Label: if (i >= l.Length) { t.Type = TokenType.Label; return t; } else if ((l[i] >= 'a' && l[i] <= 'z') || (l[i] >= 'A' && l[i] <= 'Z')) { t.Val += l[i]; i++; goto _Label; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _Label; } else { t.Type = TokenType.Label; return t; } _Identifier: if (i >= l.Length) { t.Type = TokenType.Id; return t; } else if (l[i] == ' ' || l[i] == '\t') { i++; t.Type = TokenType.Id; return t; } else if ((l[i] >= 'a' && l[i] <= 'z') || (l[i] >= 'A' && l[i] <= 'Z') || l[i] == '_' || l[i] == '\''){ t.Val += l[i]; i++; goto _Identifier; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _Identifier; } else { t.Type = TokenType.Id; return t; } _Minus: if (i >= l.Length) { t.Type = TokenType.Op; return t; } // "-"のみの場合、このlexerでは処理しなく、あとのInt32.Parseのテストで例外を! else if (l[i] == ' ' || l[i] == '\t') { t.Type = TokenType.Op; return t; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _Z; } else { t.Type = TokenType.Op; return t; } _Z: if (i >= l.Length) { t.Type = TokenType.Im; return t; } // "-"のみの場合、このlexerでは処理しなく、あとのInt32.Parseのテストで例外を! else if (l[i] == ' ' || l[i] == '\t') { t.Type = TokenType.Im; return t; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _Z; } else if (l[i] == '.') { t.Val += l[i]; i++; goto _R; } else { t.Type = TokenType.Im; return t;; } _R: if (i >= l.Length) { throw new Exception(); } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _R2; } else if (l[i] == '.') { throw new Exception(); } else { throw new Exception(); } _R2: if (i >= l.Length) { t.Type = TokenType.Im; return t; } else if (l[i] == ' ' || l[i] == '\t') { t.Type = TokenType.Im; return t; } else if (l[i] >= '0' && l[i] <= '9') { t.Val += l[i]; i++; goto _R2; } else if (l[i] == '.') { throw new Exception(); } else { t.Type = TokenType.Im; return t; } _Char: if (i >= l.Length) { throw new Exception(); } else if (l[i] == '`') { throw new Exception(); } //else if (l[i] == '\'') { throw new Exception(); } else { t.Val += l[i]; i++; goto _Char2; } _Char2: if (i >= l.Length) { throw new Exception(); } else if (l[i] == '`') { t.Val += l[i]; i++; t.Type = TokenType.Im; return t; } else { throw new Exception(); } } public static ListEx<string> Keys = new ListEx<string>(); public static void SetupKeys() { Keys.Add("state"); Keys.Add("diff"); Keys.Add("bool"); // if (token.Type == TokenType.Key) token.Val (type) Keys.Add("char"); Keys.Add("Z"); Keys.Add("R"); Keys.Add("do"); Keys.Add("ret"); Keys.Add("goto"); Keys.Add("if"); Keys.Add("global"); Keys.Add("endglobal"); Keys.Add("func"); Keys.Add("endfunc"); Keys.Add("auto"); Keys.Add("endauto"); Keys.Add("const"); Keys.Add("endconst"); Keys.Add("state1"); Keys.Add("state2"); Keys.Add("diff1"); Keys.Add("diff2"); } public static bool MapTokenIdToKey(Token token) { for (int i = 0; i <= Keys.Max; i++) { if (token.Type == TokenType.Id && token.Val == Keys[i]) { return true; } } return false; } public static string TransId(string id) { char[] tmp = id.ToCharArray(); for (int i = 0; i < id.Length; i++) { if (tmp[i] == '_') tmp[i] = 'ι'; if (tmp[i] == '\'') tmp[i] = 'ς'; } return new string(tmp); } public static string TransIm(string im) { if (im == "Y") return "true"; else if (im == "N") return "false"; else return im; } } |
|
<ListEx.cs>
using System; using System.Collections.Generic; public class ListEx<T> : List<T> { public int Max { get { return Count - 1; } } public T End { get { return this[Count - 1]; } } public ListEx<T> Sub(int i, int j) { ListEx<T> ret = new ListEx<T>(); for (int t = i; t <= j; t++) ret.Add(this[t]); return ret; } public ListEx<ListEx<T>> Split(T x, Func<T, T, bool> cmp) { ListEx<ListEx<T>> y = new ListEx<ListEx<T>>(); y.Add(new ListEx<T>()); for (int i = 0; i <= Max; i++) { if (cmp(this[i], x)) { y.Add(new ListEx<T>()); } else { y.End.Add(this[i]); } } return y; } } |
|
<Form1.cs>
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace IDE { public partial class Form1 : Form { string CurrentFilePath; bool Changed; public Form1() { InitializeComponent(); CEB.Keywords = new string[] { "bool", "char", "Z", "R", "Y", "N", "global", "endglobal", "func", "endfunc", "auto", "endauto", "do", "if", "goto", "ret", "state", "diff", "const", "endconst", "state1", "state2", "diff1", "diff2", }; CEB.TextChanged += new EventHandler<EventArgs>(CEB_TextChanged); CEB.ViewMouseClick += new EventHandler<EventArgs>(CEB_ViewMouseClick); } void SetFormTitle() { string fileName = ""; try { fileName = CurrentFilePath.Substring(CurrentFilePath.LastIndexOf('\\') + 1); } catch (Exception) { } Text = fileName + " (" + CEB.GetCurrentLineID().ToString() + ")" + (Changed ? " *" : ""); } void CEB_ViewMouseClick(object sender, EventArgs e) { SetFormTitle(); } void CEB_TextChanged(object sender, EventArgs e) { Changed = true; SetFormTitle(); } private void Form1_Load(object sender, EventArgs e) { New(); } void New() { CurrentFilePath = null; CEB.LoadText(""); Changed = false; SetFormTitle(); } void Open(string filePath) { StreamReader r = new StreamReader(filePath); string str = r.ReadToEnd(); r.Close(); CEB.LoadText(str); CurrentFilePath = filePath; Changed = false; SetFormTitle(); } void Save() { StreamWriter w = new StreamWriter(CurrentFilePath); string str = CEB.GetText(); w.Write(str); w.Close(); Changed = false; SetFormTitle(); } void SaveAs(string filePath) { StreamWriter w = new StreamWriter(filePath); string str = CEB.GetText(); w.Write(str); w.Close(); Changed = false; CurrentFilePath = filePath; SetFormTitle(); } private void newToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("Really to new file?", "New?", MessageBoxButtons.OKCancel) != DialogResult.OK) return; New(); } private void openToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("Really to open file?", "Open?", MessageBoxButtons.OKCancel) != DialogResult.OK) return; DialogResult result; result = openFileDialog1.ShowDialog(); if (result != DialogResult.OK) return; Open(openFileDialog1.FileName); } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { if (CurrentFilePath == null || CurrentFilePath == "") { saveAsToolStripMenuItem_Click(sender, e); return; } Save(); } private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) { DialogResult result; result = saveFileDialog1.ShowDialog(); if (result != DialogResult.OK) return; SaveAs(saveFileDialog1.FileName); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { //if (MessageBox.Show("Really to exit?", "Exit?", MessageBoxButtons.OKCancel) != DialogResult.OK) // return; Application.Exit(); } private void compileToolStripMenuItem1_Click(object sender, EventArgs e) { Compile(); } void Compile() { if (CurrentFilePath == null || CurrentFilePath == "") return; ListEx<string> srcLines = new ListEx<string>(); Compiler.GetSrcLines(CurrentFilePath, srcLines); List<string> asmLines = new List<string>(); try { Compiler.Compile(srcLines, asmLines); } catch (Compiler.MyException ex) { MessageBox.Show("syntax error: line " + ex.LineID.ToString()); } string tFilePath = CurrentFilePath.Substring(0, CurrentFilePath.LastIndexOf('.')); FileStream asmFile = new FileStream(tFilePath + @".asm", FileMode.Create); StreamWriter w = new StreamWriter(asmFile); foreach (string i in asmLines) w.WriteLine(i); w.Close(); try { Compiler.GenSimFile(asmLines, @"lib.asm", tFilePath + @".sim"); } catch (ASMLib.Asm.MyException ex) { MessageBox.Show("asm error: line " + ex.LineID.ToString()); } MessageBox.Show("Done!"); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("Really to exit?", "Exit?", MessageBoxButtons.OKCancel) != DialogResult.OK) e.Cancel = true; } } } |
|
<Form1.Designer.cs>
namespace IDE { partial class Form1 { /// <summary> /// 必要なデザイナー変数です。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows フォーム デザイナーで生成されたコード /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> private void InitializeComponent() { this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.compileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.compileToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.CEB = new CodeEditBox.CodeEditBox(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, this.compileToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(1266, 32); this.menuStrip1.TabIndex = 1; this.menuStrip1.Text = "menuStrip1"; // // fileToolStripMenuItem // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newToolStripMenuItem, this.openToolStripMenuItem, this.saveToolStripMenuItem, this.saveAsToolStripMenuItem, this.toolStripMenuItem2, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(52, 28); this.fileToolStripMenuItem.Text = "File"; // // newToolStripMenuItem // this.newToolStripMenuItem.Name = "newToolStripMenuItem"; this.newToolStripMenuItem.Size = new System.Drawing.Size(145, 28); this.newToolStripMenuItem.Text = "New"; this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); // // openToolStripMenuItem // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; this.openToolStripMenuItem.Size = new System.Drawing.Size(145, 28); this.openToolStripMenuItem.Text = "Open"; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // // saveToolStripMenuItem // this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; this.saveToolStripMenuItem.Size = new System.Drawing.Size(145, 28); this.saveToolStripMenuItem.Text = "Save"; this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); // // saveAsToolStripMenuItem // this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(145, 28); this.saveAsToolStripMenuItem.Text = "Save As"; this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); // // toolStripMenuItem2 // this.toolStripMenuItem2.Name = "toolStripMenuItem2"; this.toolStripMenuItem2.Size = new System.Drawing.Size(142, 6); // // exitToolStripMenuItem // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(145, 28); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // // compileToolStripMenuItem // this.compileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.compileToolStripMenuItem1}); this.compileToolStripMenuItem.Name = "compileToolStripMenuItem"; this.compileToolStripMenuItem.Size = new System.Drawing.Size(94, 28); this.compileToolStripMenuItem.Text = "Compile"; // // compileToolStripMenuItem1 // this.compileToolStripMenuItem1.Name = "compileToolStripMenuItem1"; this.compileToolStripMenuItem1.Size = new System.Drawing.Size(152, 28); this.compileToolStripMenuItem1.Text = "Compile"; this.compileToolStripMenuItem1.Click += new System.EventHandler(this.compileToolStripMenuItem1_Click); // // openFileDialog1 // this.openFileDialog1.FileName = "openFileDialog1"; // // CEB // this.CEB.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.CEB.Location = new System.Drawing.Point(13, 36); this.CEB.Margin = new System.Windows.Forms.Padding(4); this.CEB.Name = "CEB"; this.CEB.Size = new System.Drawing.Size(1240, 708); this.CEB.TabIndex = 2; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1266, 757); this.Controls.Add(this.CEB); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; this.Name = "Form1"; this.Text = "Form1"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.Load += new System.EventHandler(this.Form1_Load); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; private System.Windows.Forms.OpenFileDialog openFileDialog1; private CodeEditBox.CodeEditBox CEB; private System.Windows.Forms.ToolStripMenuItem compileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem compileToolStripMenuItem1; private System.Windows.Forms.SaveFileDialog saveFileDialog1; } } <Program.cs> using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace IDE { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } |
|
<lib.asm>
φEnd: nop end ret φZ2R: nop mov4 x1, [sp-7] z2r x0, x1 ret φR2Z: nop mov8 x1, [sp-11] r2z x0, x1 ret φZ2Char: nop mov4 x1, [sp-7] z2char x0, x1 ret φChar2Z: nop mov2 x1, [sp-5] char2z x0, x1 ret φMod: nop mov4 x1, [sp-11] mov4 x2, [sp-7] mod x0, x1, x2 ret φιNotBool: nop mov1 x1, [sp-4] not1 x0, x1 ret φιNotZ: nop mov4 x1, [sp-7] not4 x0, x1 ret φShiftLeft: nop mov4 x1, [sp-11] mov4 x2, [sp-7] shl x0, x1, x2 ret φShiftRight: nop mov4 x1, [sp-11] mov4 x2, [sp-7] shr x0, x1, x2 ret φLog: nop mov8 x1, [sp-19] mov8 x2, [sp-11] log x0, x1, x2 ret φSin: nop mov8 x1, [sp-11] sin x0, x1 ret φCos: nop mov8 x1, [sp-11] cos x0, x1 ret φTan: nop mov8 x1, [sp-11] tan x0, x1 ret φArcSin: nop mov8 x1, [sp-11] asin x0, x1 ret φArcCos: nop mov8 x1, [sp-11] acos x0, x1 ret φArcTan: nop mov8 x1, [sp-11] atan x0, x1 ret φRnd: nop rnd x0 ret φRndInit: nop rndi φTick: nop tick x0 φTickShang: nop ticksh x0 φDelete: nop mov4 hp, [sp-7] del ret φSize: nop mov4 hp, [sp-7] size x0 ret φDoEvents: nop doe ret φDebug: nop mov4 x0, [sp-7] debug ret φExDelete: nop mov4 x0, [sp-7] exdel ret φZ2Str: nop mov4 x1, [sp-7] z2str ret φZ2StrB: nop mov4 x1, [sp-7] z2strb ret φZ2StrH: nop mov4 x1, [sp-7] z2strh ret φR2Str: nop mov8 x1, [sp-11] r2str ret φStr2Z: nop mov4 x2, [sp-7] str2z mov4 x14, Str2Zξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret Str2Zξt: mov4 x0, 0 ret φStrB2Z: nop mov4 x2, [sp-7] strb2z mov4 x14, Str2Zξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret StrB2Zξt: mov4 x0, 0 ret φStrH2Z: nop mov4 x2, [sp-7] strh2z mov4 x14, Str2Zξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret StrH2Zξt: mov4 x0, 0 ret φStr2R: nop mov4 x2, [sp-7] str2r mov4 x14, Str2Rξt not1 x15, x0 jmpc x14, x15 mov8 x0, x1 ret Str2Rξt: mov8 x0, 0.0 ret φArrayCopy: nop mov4 x0, [sp-23] mov4 x1, [sp-19] mov4 x2, [sp-15] mov4 x3, [sp-11] mov4 x4, [sp-7] arrcpy ret φArrayCompare: nop mov4 x1, [sp-11] mov4 x2, [sp-7] arrcmp ret φCreateReader: nop mov4 x2, [sp-7] newreader mov4 x14, CreateReaderξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret CreateReaderξt: mov4 x0, 0 ret φCreateWriter: nop mov4 x2, [sp-7] newwriter mov4 x14, CreateWriterξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret CreateWriterξt: mov4 x0, 0 ret φCloseReader: nop mov4 x1, [sp-7] closereader ret φCloseWriter: nop mov4 x1, [sp-7] closewriter ret φReaderLen: nop mov4 x2, [sp-7] readerlen mov4 x0, x1 ret φReadBool: nop mov4 x2, [sp-7] read1 mov1 x0, x1 ret φReadChar: nop mov4 x2, [sp-7] read2 mov2 x0, x1 ret φReadZ: nop mov4 x2, [sp-7] read4 mov4 x0, x1 ret φReadR: nop mov4 x2, [sp-7] read8 mov8 x0, x1 ret φReadArray: nop mov4 x2, [sp-11] mov4 x3, [sp-7] readarray mov4 x0, x1 ret φWriteBool: nop mov4 x1, [sp-8] mov1 x2, [sp-4] write1 ret φWriteChar: nop mov4 x1, [sp-9] mov2 x2, [sp-5] write2 ret φWriteZ: nop mov4 x1, [sp-11] mov4 x2, [sp-7] write4 ret φWriteR: nop mov4 x1, [sp-15] mov8 x2, [sp-11] write8 ret φWriteArray: nop mov4 x1, [sp-11] mov4 x2, [sp-7] writearray ret φKey: nop mov4 x1, [sp-7] key ret φLeft: nop left ret φRight: nop right ret φMiddle: nop middle ret φMouseιdZ: nop mousedz ret φMouseX: nop mousex ret φMouseY: nop mousey ret φClear: nop clear ret φPresent: nop present ret φCreateSurface: nop mov4 x2, [sp-8] mov1 x3, [sp-4] newsurf mov4 x14, CreateSurfaceξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret CreateSurfaceξt: mov4 x0, 0 ret φSurfaceDX: nop mov4 x2, [sp-7] surfdx mov4 x0, x1 ret φSurfaceDY: nop mov4 x2, [sp-7] surfdy mov4 x0, x1 ret φBlt: nop mov4 x1, [sp-40] mov4 x2, [sp-36] mov4 x3, [sp-32] mov4 x4, [sp-28] mov4 x5, [sp-24] mov4 x6, [sp-20] mov4 x7, [sp-16] mov4 x8, [sp-12] mov4 x9, [sp-8] mov1 x10, [sp-4] blt ret φDrawLine: nop mov4 x1, [sp-23] mov4 x2, [sp-19] mov4 x3, [sp-15] mov4 x4, [sp-11] mov4 x5, [sp-7] drawline ret φDrawBox: nop mov4 x1, [sp-28] mov4 x2, [sp-24] mov4 x3, [sp-20] mov4 x4, [sp-16] mov4 x5, [sp-12] mov4 x6, [sp-8] mov1 x7, [sp-4] drawbox ret φDrawRBox: nop mov4 x1, [sp-36] mov4 x2, [sp-32] mov4 x3, [sp-28] mov4 x4, [sp-24] mov4 x5, [sp-20] mov4 x6, [sp-16] mov4 x7, [sp-12] mov4 x8, [sp-8] mov1 x9, [sp-4] drawrbox ret φDrawEllipse: nop mov4 x1, [sp-28] mov4 x2, [sp-24] mov4 x3, [sp-20] mov4 x4, [sp-16] mov4 x5, [sp-12] mov4 x6, [sp-8] mov1 x7, [sp-4] drawellipse ret φDrawText: nop mov4 x1,[sp-35] mov8 x2,[sp-31] mov4 x3,[sp-23] mov4 x4,[sp-19] mov4 x5,[sp-15] mov4 x6,[sp-11] mov4 x7,[sp-7] drawtext ret φCreateSoundBuffer: nop mov4 x2, [sp-7] newsndbuf mov4 x14, CreateSoundBufferξt not1 x15, x0 jmpc x14, x15 mov4 x0, x1 ret CreateSoundBufferξt: mov4 x0, 0 ret φGetVolume: nop mov4 x2, [sp-7] getvolume mov4 x0, x1 ret φSetVolume: nop mov4 x1, [sp-11] mov4 x2, [sp-7] setvolume ret φPlay: nop mov4 x1, [sp-8] mov1 x2, [sp-4] play ret φStop: nop mov4 x1, [sp-7] stop ret φArrayCharCreate: nop mov4 x2, [sp-7] mov4 x3, 2 mul4 x1, x2, x3 new x1 mov4 x0, hp ret φArrayCharGet: nop mov4 hp, [sp-11] mov4 x2, [sp-7] mov4 x3, 2 mul4 x1, x2, x3 mov2 x0, [hp->x1] ret φArrayCharSet: nop mov4 hp, [sp-13] mov4 x2, [sp-9] mov4 x3, 2 mul4 x1, x2, x3 mov2 [hp->x1], [sp-5] ret φArrayCharLen: nop mov4 hp, [sp-7] size x1 mov4 x2, 2 div4 x0, x1, x2 ret φArrayZCreate: nop mov4 x2, [sp-7] mov4 x3, 4 mul4 x1, x2, x3 new x1 mov4 x0, hp ret φArrayZGet: nop mov4 hp, [sp-11] mov4 x2, [sp-7] mov4 x3, 4 mul4 x1, x2, x3 mov4 x0, [hp->x1] ret φArrayZSet: nop mov4 hp, [sp-15] mov4 x2, [sp-11] mov4 x3, 4 mul4 x1, x2, x3 mov4 [hp->x1], [sp-7] ret φArrayZLen: nop mov4 hp, [sp-7] size x1 mov4 x2, 4 div4 x0, x1, x2 ret φArrayRCreate: nop mov4 x2, [sp-7] mov4 x3, 8 mul4 x1, x2, x3 new x1 mov4 x0, hp ret φArrayRGet: nop mov4 hp, [sp-11] mov4 x2, [sp-7] mov4 x3, 8 mul4 x1, x2, x3 mov8 x0, [hp->x1] ret φArrayRSet: nop mov4 hp, [sp-19] mov4 x2, [sp-15] mov4 x3, 8 mul4 x1, x2, x3 mov8 [hp->x1], [sp-11] ret φArrayRLen: nop mov4 hp, [sp-7] size x1 mov4 x2, 8 div4 x0, x1, x2 ret φStructCreate: nop mov4 x1, [sp-7] new x1 mov4 x0, hp ret φStructBoolGet: nop mov4 hp, [sp-11] mov4 x1, [sp-7] mov1 x0, [hp->x1] ret φStructBoolSet: nop mov4 hp, [sp-12] mov4 x1, [sp-8] mov1 [hp->x1], [sp-4] ret φStructCharGet: nop mov4 hp, [sp-11] mov4 x1, [sp-7] mov2 x0, [hp->x1] ret φStructCharSet: nop mov4 hp, [sp-13] mov4 x1, [sp-9] mov2 [hp->x1], [sp-5] ret φStructZGet: nop mov4 hp, [sp-11] mov4 x1, [sp-7] mov4 x0, [hp->x1] ret φStructZSet: nop mov4 hp, [sp-15] mov4 x1, [sp-11] mov4 [hp->x1], [sp-7] ret φStructRGet: nop mov4 hp, [sp-11] mov4 x1, [sp-7] mov8 x0, [hp->x1] ret φStructRSet: nop mov4 hp, [sp-19] mov4 x1, [sp-15] mov8 [hp->x1], [sp-11] ret |