Initial Commit

This commit is contained in:
Mike Nolan 2022-11-26 20:16:48 -06:00
commit 024342d4da
10 changed files with 1940 additions and 0 deletions

26
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net6.0/langtest.dll",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

41
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/langtest.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/langtest.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/langtest.csproj"
],
"problemMatcher": "$msCompile"
}
]
}

1509
AST.cs Normal file

File diff suppressed because it is too large Load Diff

267
Lexer.cs Normal file
View File

@ -0,0 +1,267 @@
using System.Globalization;
using System.Text;
namespace langtest
{
public enum LexTokenType
{
PLUS=0,
MINUS=1,
MULTIPLY=2,
DIVIDE=3,
MOD=4,
LPAREN=5,
RPAREN=6,
IDENTIFER=7,
NUMBER=8,
EQUALS=9,
COMMA=10,
ERROR=11,
SEMI=12,
LBRACE=13,
RBRACE=14,
STRING=15,
}
public class LexToken
{
public LexToken()
{
}
public LexToken(string text)
{
Text = text;
Type=char.IsLetter(text.FirstOrDefault()) ? LexTokenType.IDENTIFER : (char.IsNumber(text.FirstOrDefault()) ? LexTokenType.NUMBER : LexTokenType.ERROR);
}
public LexTokenType Type {get;set;}
public string Text {get;set;}="";
}
public static class Lexer
{
public static string? Prompt(string t)
{
Console.Write(t);
return Console.ReadLine();
}
public static IEnumerable<LexToken> EnumerateTokens(string text)
{
int filePos=0;
Func<(char chr,bool esc)> read_char = ()=>{
int txt=text[filePos++];
if(txt == '\\')
{
//we are to escape
txt = text[filePos++];
if(txt == 'x')
{
char[] chars=new char[4];
for(int i = 0 ;i<4;i++)
{
txt = text[filePos++];
chars[i] = (char)txt;
}
return ((char)Int16.Parse(new string(chars), NumberStyles.AllowHexSpecifier),true);
}else{
if(txt == 'n')
{
return ('\n',true);
}
if(txt == 'r')
{
return ('\r',true);
}
if(txt == 't')
{
return ('\t',true);
}
return ((char)txt,true);
}
}
else{
return ((char)txt,false);
}
};
Func<string> read_string = ()=>{
StringBuilder b=new StringBuilder();
while(true)
{
(char chr,bool esc) txt=read_char();
if(txt.chr == '\"' && !txt.esc)
{
break;
}
b.Append(txt.chr);
}
return b.ToString();
};
StringBuilder b=new StringBuilder();
while(filePos < text.Length)
{
char c=text[filePos++];
if(c == '\"')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
string str = read_string();
yield return new LexToken(){Text = str,Type = LexTokenType.STRING};
}
else
if(c == '\'')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
char str = read_char().chr;
filePos++;
yield return new LexToken(){Text = ((int)str).ToString(),Type = LexTokenType.NUMBER};
}else
if(c == '+')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="+",Type = LexTokenType.PLUS};
}else
if(c == '-')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="-",Type = LexTokenType.MINUS};
}else
if(c == '*')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="*",Type = LexTokenType.MULTIPLY};
}else
if(c == '/')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="/",Type = LexTokenType.DIVIDE};
}else
if(c == '%')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="%",Type = LexTokenType.MOD};
}else if(c == '{')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="{",Type = LexTokenType.LBRACE};
}else if(c == '}')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="}",Type = LexTokenType.RBRACE};
}
else
if(c == '(')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="(",Type = LexTokenType.LPAREN};
}else
if(c == ')')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text=")",Type = LexTokenType.RPAREN};
}else if(c == '=')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text="=",Type = LexTokenType.EQUALS};
}
else if(c == ',')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text=",",Type = LexTokenType.COMMA};
}
else if(c == ';')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
yield return new LexToken(){Text=";",Type = LexTokenType.SEMI};
}
else if(c == '\n' || c == ' ' || c == '\t')
{
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
}else{
b.Append(c);
}
}
if(b.Length > 0)
{
yield return new LexToken(b.ToString());
b.Clear();
}
}
}
}

38
Program.cs Normal file
View File

@ -0,0 +1,38 @@
using langtest;
using Newtonsoft.Json;
/*
var re=new ApplicationState();
if(args.Length == 0)
{
string? text;
while((text=Lexer.Prompt("> ")) != null)
{
var lexed=Lexer.EnumerateTokens(text);
var res=Ast.Parse(lexed.ToList());
res.Execute(re);
}
}else{
string text=File.ReadAllText(args[0]);
var lexed=Lexer.EnumerateTokens(text);
var res=Ast.Parse(lexed.ToList());
res.Execute(re);
}*/
var app = new ApplicationState();
var ast = new ListNode();
foreach(var file in Directory.GetFiles("code/dep","*",SearchOption.AllDirectories))
{
string text=File.ReadAllText(file);
var lexed=Lexer.EnumerateTokens(text);
Ast.Parse(ast,lexed.ToList());
}
string text2=File.ReadAllText("code/app.bs");
var lexed2=Lexer.EnumerateTokens(text2);
Ast.Parse(ast,lexed2.ToList());
ast.Execute(app);

18
boxscript.bs Normal file
View File

@ -0,0 +1,18 @@
create_function(box_addrange,mybox,boxToAppend,{
cur.i = 0;
cur.len =box_len(boxToAppend);
for(cur.i,cur.len,cur.i+1,{
box_add(mybox,box_getvalue(boxToAppend,i));
});
});
box_print("Type youtube url: ");
connection=tcp_client("192.168.0.142",3252);
res = box_create();
box_addrange(res,"GET /api/AddItem/");
box_addrange(res,box_readline());
box_addrange(res,"HTTP/1.1\r\nHost: 192.168.0.142:3252\r\n\r\n");
stream_write(connection,res,0,box_len(res));
stream_close(connection);

5
code/app.bs Normal file
View File

@ -0,0 +1,5 @@
res=string_split_chr("Demi,Lovato,Tom,Joel",',');
j=0;
for(j,box_len(res),j+1,{
box_println(box_getvalue(res,j));
});

22
code/dep/string_split.bs Normal file
View File

@ -0,0 +1,22 @@
create_function(string_split_chr,boxId,string_split_chr_chr,{
box=box_create();
box2 = box_create();
split_str_chr_i = 0;
for(split_str_chr_i,box_len(boxId),split_str_chr_i+1,{
if(eq(box_getvalue(boxId,split_str_chr_i),string_split_chr_chr),{
if(box_len(box2),{
box_add(box,box2);
box2 = box_create();
},0);
},{
box_add(box2,box_getvalue(boxId,split_str_chr_i));
});
});
if(box_len(box2),{
box_add(box,box2);
box2 = box_create();
},0);
box;
});

0
http.bs Normal file
View File

14
langtest.csproj Normal file
View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
</ItemGroup>
</Project>