Index 扉へ 首頁
人類の品種・宇宙人・系外銀河など
compiler of Simulang (source code)
0   商湯      2026年2月4日 水 11:48
Download source files:
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();
}

}
この記事は 2026年2月25日 水 11:20 に作者によって編集されました
1   商湯      2026年2月4日 水 11:50
<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;
}
2   商湯      2026年2月4日 水 11:50
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);
}

}
3   商湯      2026年2月4日 水 11:52
<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;
4   商湯      2026年2月4日 水 11:53

       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);
   }
}
5   商湯      2026年2月4日 水 11:54
<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;
}
}

}
6   商湯      2026年2月4日 水 11:58
<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);
           }
       }
7   商湯      2026年2月4日 水 11:59
       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);
       }
8   商湯      2026年2月4日 水 11:59
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);
       }
9   商湯      2026年2月4日 水 12:00
       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);
}
}

}
10   商湯      2026年2月4日 水 12:01
<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");
           }
11   商湯      2026年2月4日 水 12:01
           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");
}

}
12   商湯      2026年2月4日 水 12:02
<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;
}

}
13   商湯      2026年2月4日 水 12:03
<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;
   }
}
14   商湯      2026年2月4日 水 12:04
<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;
       }
   }
}
15   商湯      2026年2月4日 水 12:05
<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());
       }
   }
}
16   商湯      2026年2月4日 水 12:06
<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
名前      編集用パスワード(省略可)    パスワードの記憶
数式 αβγ IPA http:// 画像 B I U 上 下
(添付ファイルは http://www.jkofsp.net/up/ にアップロードしてください)