importe
This commit is contained in:
commit
8ecb783cf8
31 changed files with 1111 additions and 0 deletions
BIN
.vs/GASi/v14/.suo
Normal file
BIN
.vs/GASi/v14/.suo
Normal file
Binary file not shown.
BIN
.vs/GASi/v15/.suo
Normal file
BIN
.vs/GASi/v15/.suo
Normal file
Binary file not shown.
0
.vs/GASi/v15/Server/sqlite3/db.lock
Normal file
0
.vs/GASi/v15/Server/sqlite3/db.lock
Normal file
BIN
.vs/GASi/v15/Server/sqlite3/storage.ide
Normal file
BIN
.vs/GASi/v15/Server/sqlite3/storage.ide
Normal file
Binary file not shown.
22
GASi.sln
Normal file
22
GASi.sln
Normal file
|
@ -0,0 +1,22 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.25420.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GASi", "GASi\GASi.csproj", "{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
6
GASi/App.config
Normal file
6
GASi/App.config
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||
</startup>
|
||||
</configuration>
|
71
GASi/GASi.csproj
Normal file
71
GASi/GASi.csproj
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{E0A2B15D-FBA2-43CB-9E13-843C6143E0F8}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>GASi</RootNamespace>
|
||||
<AssemblyName>GASi</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Lexer.cs" />
|
||||
<Compile Include="Stdlib.cs" />
|
||||
<Compile Include="Parser.cs" />
|
||||
<Compile Include="SymbolTable.cs" />
|
||||
<Compile Include="Transpiler.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<None Include="stdlib\math.glib" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>COPY "$(ProjectDir)stdlib\" "$(TargetDir)"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
213
GASi/Lexer.cs
Normal file
213
GASi/Lexer.cs
Normal file
|
@ -0,0 +1,213 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GASi {
|
||||
class Lexer {
|
||||
private enum kTokenState {
|
||||
UNSURE, ALPHA, NUMERIC, OPERATOR, PREPROCESSOR, RAW, STRING
|
||||
}
|
||||
|
||||
private static string[] Scopes = { "global", "static", "local" };
|
||||
private static string[] Types = { "string", "date", "bool", "float", "int", "void" };
|
||||
private static string[] Controls = { "if", "else", "elseif",
|
||||
"switch", "case", "default",
|
||||
"for", "while" };
|
||||
private static string[] Keywords = { "return", "ref", "break" };
|
||||
private static string[] Operators = { "+", "-", "*", "/", "%",
|
||||
"==", "!=", ">", ">=", "<", "<=", "&&", "||",
|
||||
"&", "|", "^", "~",
|
||||
"++", "--" };
|
||||
private static string[] Assigners = { "=", "+=", "-=", "*=", "/=" };
|
||||
|
||||
private static string Significants = null;
|
||||
|
||||
private static char Peek(int column, string line) {
|
||||
return (column + 1 >= line.Length) ? '\0' : line[column + 1];
|
||||
}
|
||||
|
||||
private static char Rewind(int column, string line) {
|
||||
return (column - 1 < 0) ? '\0' : line[column - 1];
|
||||
}
|
||||
|
||||
public static IEnumerable<Token> Interpret(string[] rawProgramLines) {
|
||||
List<Token> tokenList = new List<Token>();
|
||||
Token current = new Token();
|
||||
kTokenState state = kTokenState.UNSURE;
|
||||
var rawStartLine = -0xFF;
|
||||
|
||||
for(var line = 0; line < rawProgramLines.Length; ++line) {
|
||||
var rawProgramLine = rawProgramLines[line];
|
||||
bool firstCharFound = false;
|
||||
var rawStartCol = -0xFF;
|
||||
|
||||
for(var column = 0; column < rawProgramLine.Length; ++column) {
|
||||
var glyph = rawProgramLine[column];
|
||||
var curWord = current.Value;
|
||||
var tmpWord = current.Value + glyph;
|
||||
bool rerunGlyph = false;
|
||||
|
||||
if(state == kTokenState.UNSURE) {
|
||||
// ignore tabs and spaces when nothing is being interpreted yet
|
||||
if(glyph == 0x20 || glyph == 0x09)
|
||||
continue;
|
||||
|
||||
if(glyph == '/' && Peek(column, rawProgramLine) == '/')
|
||||
break;
|
||||
else if(glyph == '#' && !firstCharFound)
|
||||
state = kTokenState.PREPROCESSOR;
|
||||
else if(glyph == ':' && !firstCharFound && Peek(column, rawProgramLine) == ':') {
|
||||
state = kTokenState.RAW;
|
||||
rawStartCol = column;
|
||||
rawStartLine = line;
|
||||
} else if(glyph == '"')
|
||||
state = kTokenState.STRING;
|
||||
else if(IsAlpha(glyph))
|
||||
state = kTokenState.ALPHA;
|
||||
else if(IsNumeric(glyph))
|
||||
state = kTokenState.NUMERIC;
|
||||
else if(IsSignificant(glyph))
|
||||
state = kTokenState.OPERATOR;
|
||||
else
|
||||
throw Transpiler.Exception("Unexpected glyph " + glyph, line, column);
|
||||
|
||||
firstCharFound = true;
|
||||
}
|
||||
|
||||
switch(state) {
|
||||
case kTokenState.RAW:
|
||||
if(glyph == ':' && Rewind(column, rawProgramLine) == ':' && rawStartCol != column - 1)
|
||||
current.Type = Token.kType.RAW;
|
||||
else if(column == 0 && line != rawStartLine)
|
||||
current.Value += '\n';
|
||||
break;
|
||||
case kTokenState.ALPHA:
|
||||
if(!IsAlpha(glyph) && !IsNumeric(glyph)) {
|
||||
if(Scopes.Contains(curWord.Trim()))
|
||||
current.Type = Token.kType.SCOPE;
|
||||
else if(Types.Contains(curWord.Trim()))
|
||||
current.Type = Token.kType.TYPE;
|
||||
else if(Controls.Contains(curWord.Trim()))
|
||||
current.Type = Token.kType.CONTROL;
|
||||
else if(Keywords.Contains(curWord.Trim()))
|
||||
current.Type = Token.kType.KEYWORD;
|
||||
else
|
||||
current.Type = Token.kType.IDENTIFIER;
|
||||
|
||||
rerunGlyph = true;
|
||||
}
|
||||
break;
|
||||
case kTokenState.NUMERIC:
|
||||
if(!IsNumeric(glyph) && !(glyph == '.' && !current.Value.Contains('.'))) {
|
||||
current.Type = Token.kType.NUMBER;
|
||||
rerunGlyph = true;
|
||||
}
|
||||
break;
|
||||
case kTokenState.PREPROCESSOR:
|
||||
if(!IsAlpha(glyph) && !(glyph == '#' && curWord == "")) {
|
||||
current.Type = Token.kType.PREPROC;
|
||||
rerunGlyph = true;
|
||||
}
|
||||
break;
|
||||
case kTokenState.OPERATOR:
|
||||
if("[]".Contains(glyph))
|
||||
current.Type = glyph == '[' ? Token.kType.LBRACKET : Token.kType.RBRACKET;
|
||||
else if("()".Contains(glyph))
|
||||
current.Type = glyph == '(' ? Token.kType.LPAREN : Token.kType.RPAREN;
|
||||
else if("{}".Contains(glyph))
|
||||
current.Type = glyph == '{' ? Token.kType.LBRACE : Token.kType.RBRACE;
|
||||
else {
|
||||
switch(glyph) {
|
||||
case '.':
|
||||
current.Type = Token.kType.PERIOD;
|
||||
break;
|
||||
case ',':
|
||||
current.Type = Token.kType.COMMA;
|
||||
break;
|
||||
case ';':
|
||||
current.Type = Token.kType.SEMICOL;
|
||||
break;
|
||||
default:
|
||||
if(Operators.Contains(curWord) && !Operators.Contains(tmpWord) && !Assigners.Contains(tmpWord)) {
|
||||
current.Type = Token.kType.OPERATOR;
|
||||
rerunGlyph = true;
|
||||
} else if(Assigners.Contains(curWord) && !Assigners.Contains(tmpWord) && !Operators.Contains(tmpWord)) {
|
||||
current.Type = Token.kType.ASSIGNER;
|
||||
rerunGlyph = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kTokenState.STRING:
|
||||
// TODO determine if you can escape double quotes in gas using \"
|
||||
if(curWord != "") {
|
||||
if((glyph == '"' && !curWord.EndsWith("\\")) || column == rawProgramLine.Length - 1)
|
||||
current.Type = Token.kType.STRING;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!rerunGlyph)
|
||||
current.Value += glyph;
|
||||
else
|
||||
--column;
|
||||
|
||||
if(current.Type != Token.kType.UNDECIDED) {
|
||||
current.Value = current.Value.Trim();
|
||||
tokenList.Add(current);
|
||||
current = new Token();
|
||||
state = kTokenState.UNSURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tokenList;
|
||||
}
|
||||
|
||||
private static bool IsAlpha(char glyph) {
|
||||
return (glyph >= 0x41 && glyph <= 0x5A) || (glyph >= 0x61 && glyph <= 0x7A);
|
||||
}
|
||||
|
||||
private static bool IsNumeric(char glyph) {
|
||||
return glyph >= 0x30 && glyph <= 0x39;
|
||||
}
|
||||
|
||||
private static bool IsSignificant(char glyph) {
|
||||
AssembleSignificantCharactersTable();
|
||||
return Significants.Contains(glyph);
|
||||
}
|
||||
|
||||
private static void AssembleSignificantCharactersTable() {
|
||||
if(Significants != null)
|
||||
return;
|
||||
|
||||
Significants = "[]{}(),.;";
|
||||
List<string> mergedList = Operators.ToList();
|
||||
mergedList.AddRange(Assigners.ToList());
|
||||
foreach(var op in mergedList) {
|
||||
foreach(var glyph in op) {
|
||||
if(!Significants.Contains(glyph))
|
||||
Significants += glyph;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Token {
|
||||
public kType Type { get; set; } = kType.UNDECIDED;
|
||||
public string Value { get; set; } = "";
|
||||
|
||||
public enum kType {
|
||||
UNDECIDED,
|
||||
PREPROC, RAW,
|
||||
SCOPE, TYPE, IDENTIFIER,
|
||||
OPERATOR, ASSIGNER, CONTROL, KEYWORD,
|
||||
LPAREN, RPAREN, LBRACKET, RBRACKET, LBRACE, RBRACE,
|
||||
PERIOD, COMMA, SEMICOL,
|
||||
NUMBER, STRING, BOOL
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
246
GASi/Parser.cs
Normal file
246
GASi/Parser.cs
Normal file
|
@ -0,0 +1,246 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static GASi.Lexer;
|
||||
|
||||
namespace GASi {
|
||||
class Parser {
|
||||
public enum kControl {
|
||||
FUNC, IF, FOR, WHILE, SWITCH, CASE
|
||||
}
|
||||
|
||||
private ScopeTable Globals = new ScopeTable();
|
||||
private MethodTable Methods = new MethodTable();
|
||||
private Stack<kControl> ControlStack = new Stack<kControl>();
|
||||
|
||||
private MethodTable.Method CurrentMethod = null;
|
||||
private List<Token> Tokens;
|
||||
private int TokenIterator;
|
||||
|
||||
private static Dictionary<string, List<Pattern>> Patterns = new Dictionary<string, List<Pattern>>() {
|
||||
{ "pre_inc", new List<Pattern> {
|
||||
new Pattern(Token.kType.PREPROC, "#include"),
|
||||
new Pattern(Token.kType.STRING)
|
||||
} },
|
||||
|
||||
{ "fndecl", new List<Pattern> {
|
||||
new Pattern(Token.kType.TYPE),
|
||||
new Pattern(Token.kType.IDENTIFIER),
|
||||
new Pattern(Token.kType.LPAREN)
|
||||
} },
|
||||
|
||||
{ "fnparams", new List<Pattern> {
|
||||
new Pattern(Token.kType.TYPE),
|
||||
new Pattern(Token.kType.IDENTIFIER),
|
||||
new Pattern(Token.kType.COMMA),
|
||||
} },
|
||||
|
||||
{ "ctrlstart", new List<Pattern> {
|
||||
new Pattern(Token.kType.RPAREN),
|
||||
new Pattern(Token.kType.LBRACE)
|
||||
} }
|
||||
};
|
||||
|
||||
public Parser(List<Token> Tokens) {
|
||||
this.Tokens = Tokens;
|
||||
}
|
||||
|
||||
public List<Expression> Parse() {
|
||||
var ret = new List<Expression>();
|
||||
|
||||
TokenIterator = 0;
|
||||
while(TokenIterator < Tokens.Count) {
|
||||
var expr = new Expression();
|
||||
var token = Tokens[TokenIterator];
|
||||
|
||||
if(CurrentMethod == null) { // if we're in the global scope
|
||||
switch(token.Type) {
|
||||
case Token.kType.PREPROC: // preprocessor definition
|
||||
// TODO add more preproc defs
|
||||
if(!CheckPattern(Patterns["pre_inc"]))
|
||||
Transpiler.Exception("Invalid preprocessor directive '" + token.Value.Substring(1) + "'", 0, 0);
|
||||
|
||||
expr.Tokens = Iterate(2);
|
||||
expr.Type = Expression.kType.PREPROC;
|
||||
break;
|
||||
case Token.kType.TYPE: // function declaration
|
||||
expr = ParseFunctionDeclaration();
|
||||
break;
|
||||
default:
|
||||
Transpiler.Exception("Unexpected token '" + token.Value + "' of type '" + token.Type.ToString() + "' in global scope", 0, 0);
|
||||
break;
|
||||
}
|
||||
} else { // if we're in a local scope
|
||||
|
||||
}
|
||||
|
||||
ret.Add(expr);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Expression ParseFunctionDeclaration() {
|
||||
var expr = new Expression();
|
||||
|
||||
if(CheckPattern(Patterns["fndecl"])) {
|
||||
expr.Tokens = Iterate(Patterns["fndecl"].Count);
|
||||
var functionName = expr.Tokens[1].Value;
|
||||
|
||||
expr.ControlName = functionName;
|
||||
expr.ControlType = kControl.FUNC;
|
||||
expr.Type = Expression.kType.CTRLSTART;
|
||||
|
||||
var method = new MethodTable.Method() {
|
||||
Name = functionName,
|
||||
ReturnType = Conversion.StringToType(expr.Tokens[0].Value)
|
||||
};
|
||||
|
||||
int argTokenCount;
|
||||
if((argTokenCount = CheckPatternLoop(Patterns["fnparams"], Token.kType.RPAREN)) == -1)
|
||||
Transpiler.Exception("Invalid token found in argument list of function '"+ functionName +"'", 0, 0);
|
||||
|
||||
// Now that we know that it follows the pattern, we must check for early truncation.
|
||||
// Note the standard form for an argument list:
|
||||
// TOKENS: [TYPE IDENTIFIER COMMA]*(n-1) + [TYPE IDENTIFIER]
|
||||
// Where n is the function's number of arguments.
|
||||
// The last argument should not be followed by a comma, nor should be incomplete
|
||||
// (that is to say, only a type identifier by itself), so we can check the
|
||||
// length of the argument list passed and treat it as such:
|
||||
// TOKEN COUNT = 3*(n-1) + 2
|
||||
// This follows from the token formula state above.
|
||||
// If you add one to this token count, you end up with this:
|
||||
// TOKEN COUNT = 3*(n-1) + 3 = 3n - 3 + 3 = 3n
|
||||
// Which can then be confirmed using the remainder of dividing the argument list
|
||||
// by three and determining if it is zero. This will only be true for a well-
|
||||
// formed argument list.
|
||||
if((argTokenCount + 1) % 3 != 0)
|
||||
Transpiler.Exception("Malformed final argument in argument list of function '"+ functionName +"'", 0, 0);
|
||||
|
||||
var args = Iterate(argTokenCount);
|
||||
var arg = new MethodTable.Method.Argument();
|
||||
for(int i = 0; i < args.Count; ++i) {
|
||||
var token = args[i];
|
||||
|
||||
switch(i%3) {
|
||||
case 0:
|
||||
arg = new MethodTable.Method.Argument {
|
||||
Type = Conversion.StringToType(token.Value)
|
||||
};
|
||||
|
||||
if(arg.Type == kType.VOID)
|
||||
Transpiler.Exception("Function '" + functionName + "' cannot have arguments with a void type", 0, 0);
|
||||
break;
|
||||
case 1:
|
||||
arg.Name = token.Value;
|
||||
method.Arguments.Add(arg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
expr.Tokens.AddRange(args);
|
||||
if(!CheckPattern(Patterns["ctrlstart"]))
|
||||
Transpiler.Exception("Malformed tokens after argument list in function declaration '"+ functionName +"'", 0, 0);
|
||||
|
||||
expr.Tokens.AddRange(Iterate(Patterns["ctrlstart"].Count));
|
||||
|
||||
Methods.AddMethod(method);
|
||||
} else
|
||||
Transpiler.Exception("Invalid token found during function declaration", 0, 0);
|
||||
|
||||
return expr;
|
||||
}
|
||||
|
||||
private bool CheckPattern(List<Pattern> pattern) {
|
||||
for(var i = TokenIterator; i < TokenIterator + pattern.Count; ++i) {
|
||||
if(i >= Tokens.Count)
|
||||
Transpiler.Exception("Unexpected EOF when checking for token pattern", 0, 0);
|
||||
|
||||
var j = i - TokenIterator;
|
||||
if(Tokens[i].Type != pattern[j].Type || (pattern[j].Value != null && Tokens[i].Value != pattern[j].Value))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private int CheckPatternLoop(List<Pattern> pattern, Token.kType terminator) {
|
||||
var i = TokenIterator;
|
||||
for(; ; ++i) {
|
||||
if(i >= Tokens.Count)
|
||||
Transpiler.Exception("Unexpected EOF when checking for repeated token pattern", 0, 0);
|
||||
|
||||
var j = (i - TokenIterator) % pattern.Count;
|
||||
if(Tokens[i].Type == terminator)
|
||||
break;
|
||||
if(Tokens[i].Type != pattern[j].Type || (pattern[j].Value != null && Tokens[i].Value != pattern[j].Value))
|
||||
return -1;
|
||||
}
|
||||
|
||||
return i - TokenIterator;
|
||||
}
|
||||
|
||||
private List<Token> Extract(int length) {
|
||||
if(TokenIterator + length > Tokens.Count)
|
||||
Transpiler.Exception("Attempted to read expected tokens past EOF", 0, 0);
|
||||
|
||||
return Tokens.GetRange(TokenIterator, length);
|
||||
}
|
||||
|
||||
private void Skip(int count) {
|
||||
TokenIterator += count;
|
||||
}
|
||||
|
||||
private List<Token> Iterate(int count) {
|
||||
var tmp = Extract(count);
|
||||
Skip(count);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
private int CountUntilNext(Token.kType type, Token.kType? nester = null, bool allowNesting = true) {
|
||||
int depth = 1, count = 0;
|
||||
for(; depth > 0; ++count) {
|
||||
if(TokenIterator + count >= Tokens.Count)
|
||||
Transpiler.Exception("Closing token '"+ type.ToString() +"' for appropriate scope not found", 0, 0);
|
||||
|
||||
var token = Tokens[TokenIterator + count];
|
||||
|
||||
if(token.Type == type)
|
||||
--depth;
|
||||
else if(token.Type == nester) {
|
||||
if(allowNesting)
|
||||
++depth;
|
||||
else
|
||||
Transpiler.Exception("Invalid token of type '" + token.Type + "' found when nesting is not allowed", 0, 0);
|
||||
}
|
||||
|
||||
}
|
||||
return count + 1;
|
||||
}
|
||||
|
||||
public class Pattern {
|
||||
public Token.kType Type { get; set; }
|
||||
public string Value { get; set; }
|
||||
|
||||
public Pattern(Token.kType type, string value = null) {
|
||||
Type = type;
|
||||
Value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public class Expression {
|
||||
public enum kType {
|
||||
PREPROC,
|
||||
CTRLSTART, BREAK, CTRLEND,
|
||||
LVAL, ASSIGN, RVAL
|
||||
}
|
||||
|
||||
public kType Type { get; set; }
|
||||
public kControl ControlType { get; set; }
|
||||
public string ControlName { get; set; }
|
||||
public List<Token> Tokens { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
36
GASi/Properties/AssemblyInfo.cs
Normal file
36
GASi/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,36 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("GASi")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("GASi")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("e0a2b15d-fba2-43cb-9e13-843c6143e0f8")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
21
GASi/Stdlib.cs
Normal file
21
GASi/Stdlib.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
|
||||
namespace GASi {
|
||||
static class Stdlib {
|
||||
private static MethodTable functions;
|
||||
|
||||
public static void Initialize() {
|
||||
|
||||
}
|
||||
|
||||
public class StdMethod : MethodTable.Method {
|
||||
|
||||
public string Translation { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
77
GASi/SymbolTable.cs
Normal file
77
GASi/SymbolTable.cs
Normal file
|
@ -0,0 +1,77 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GASi {
|
||||
public enum kType {
|
||||
STRING, INT, FLOAT, DATE, BOOL, VOID
|
||||
}
|
||||
|
||||
class Conversion {
|
||||
public static kType StringToType(string str) {
|
||||
try {
|
||||
return (kType)Enum.Parse(typeof(kType), str, true);
|
||||
} catch {
|
||||
throw Transpiler.Exception("Could not determine type implied by keyword '"+ str +"'", 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ScopeTable {
|
||||
private List<Variable> Variables = new List<Variable>();
|
||||
|
||||
public void AddVariable(Variable var) {
|
||||
if(!CheckVariableExists(var.Name))
|
||||
Variables.Add(var);
|
||||
else
|
||||
throw Transpiler.Exception("Variable already exists with name '" + var.Name + "' in this scope", 0, 0);
|
||||
}
|
||||
|
||||
public bool CheckVariableExists(string name) {
|
||||
return Variables.FirstOrDefault(x => x.Name == name) != null;
|
||||
}
|
||||
|
||||
public Variable GetVariable(string name) {
|
||||
return Variables.FirstOrDefault(x => x.Name == name);
|
||||
}
|
||||
|
||||
public class Variable {
|
||||
public string Name { get; set; }
|
||||
public kType Type { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
class MethodTable {
|
||||
private List<Method> Methods = new List<Method>();
|
||||
|
||||
public void AddMethod(Method method) {
|
||||
// TODO determine if GAS allows function overloading
|
||||
if(!CheckMethodExists(method.Name))
|
||||
Methods.Add(method);
|
||||
else
|
||||
throw Transpiler.Exception("Method already exists with name '" + method.Name + "'", 0, 0);
|
||||
}
|
||||
|
||||
public bool CheckMethodExists(string name) {
|
||||
return Methods.FirstOrDefault(x => x.Name == name) != null;
|
||||
}
|
||||
|
||||
public Method GetMethod(string name) {
|
||||
return Methods.FirstOrDefault(x => x.Name == name);
|
||||
}
|
||||
|
||||
public class Method {
|
||||
public string Name { get; set; }
|
||||
public kType ReturnType { get; set; }
|
||||
public List<Argument> Arguments { get; set; }
|
||||
public ScopeTable Scope { get; set; } = new ScopeTable();
|
||||
|
||||
public class Argument {
|
||||
public string Name { get; set; }
|
||||
public kType Type { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
35
GASi/Transpiler.cs
Normal file
35
GASi/Transpiler.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
|
||||
// TODO: add foreach support at some point
|
||||
// this will save enormous amounts of time when processing data
|
||||
|
||||
namespace GASi {
|
||||
class Transpiler {
|
||||
static void Main(string[] args) {
|
||||
var test = File.ReadAllLines("test.gi");
|
||||
var result = Lexer.Interpret(test);
|
||||
FancyPrint(result);
|
||||
|
||||
while(true) ;
|
||||
}
|
||||
|
||||
static void FancyPrint(IEnumerable<Lexer.Token> tokens) {
|
||||
var longestCount = 0;
|
||||
foreach(var token in tokens)
|
||||
longestCount = Math.Max(longestCount, token.Value.Length);
|
||||
|
||||
foreach(var token in tokens) {
|
||||
Console.WriteLine("{0, 20}{1}", "(" + token.Type.ToString() + ") | ", token.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public static Exception Exception(string text, int line, int column) {
|
||||
return new Exception("ERROR: " + text + " (line: " + (line + 1) + ", column: " + (column + 1) + ")");
|
||||
}
|
||||
}
|
||||
}
|
BIN
GASi/bin/Debug/GASi.exe
Normal file
BIN
GASi/bin/Debug/GASi.exe
Normal file
Binary file not shown.
6
GASi/bin/Debug/GASi.exe.config
Normal file
6
GASi/bin/Debug/GASi.exe.config
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||
</startup>
|
||||
</configuration>
|
BIN
GASi/bin/Debug/GASi.pdb
Normal file
BIN
GASi/bin/Debug/GASi.pdb
Normal file
Binary file not shown.
BIN
GASi/bin/Debug/GASi.vshost.exe
Normal file
BIN
GASi/bin/Debug/GASi.vshost.exe
Normal file
Binary file not shown.
6
GASi/bin/Debug/GASi.vshost.exe.config
Normal file
6
GASi/bin/Debug/GASi.vshost.exe.config
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||
</startup>
|
||||
</configuration>
|
11
GASi/bin/Debug/GASi.vshost.exe.manifest
Normal file
11
GASi/bin/Debug/GASi.vshost.exe.manifest
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
162
GASi/bin/Debug/math.glib
Normal file
162
GASi/bin/Debug/math.glib
Normal file
|
@ -0,0 +1,162 @@
|
|||
! gasi stdlib
|
||||
! math function definitions
|
||||
! {0}, {1}, {2}, etc. indicate function arguments
|
||||
! {r} indicates the return value
|
||||
|
||||
float abs float
|
||||
Function.Instrinsic.Math.Abs({0}, {r})
|
||||
***
|
||||
float acos float
|
||||
Function.Instrinsic.Math.Acos({0}, {r})
|
||||
***
|
||||
float acsc float
|
||||
Function.Instrinsic.Math.ACoSec({0}, {r})
|
||||
***
|
||||
float acot float
|
||||
Function.Intrinsic.Math.ACoTan({0}, {r})
|
||||
***
|
||||
float asec float
|
||||
Function.Intrinsic.Math.Asec({0}, {r})
|
||||
***
|
||||
float asin float
|
||||
Function.Intrinsic.Math.Asin({0}, {r})
|
||||
***
|
||||
float atan float
|
||||
Function.Intrinsic.Math.Atan({0}, {r})
|
||||
***
|
||||
int upccheck string
|
||||
Function.Intrinsic.Math.CalculateUPCcheckDigit({0}, {r})
|
||||
***
|
||||
float tofloat string
|
||||
Function.Intrinsic.Math.ConvertToFloat({0}, {r})
|
||||
***
|
||||
int toint string
|
||||
Function.Intrinsic.Math.ConvertToLong({0}, {r})
|
||||
***
|
||||
float cos float
|
||||
Function.Intrinsic.Math.Cos({0}, {r})
|
||||
***
|
||||
float csc float
|
||||
Function.Intrinsic.Math.CoSec({0}, {r})
|
||||
***
|
||||
float cot float
|
||||
Function.Intrinsic.Math.CoTan({0}, {r})
|
||||
***
|
||||
string tofraction float
|
||||
Function.Intrinsic.Math.DecimalToFraction({0}, {r})
|
||||
***
|
||||
string tofraction float float
|
||||
Function.Intrinsic.Math.DecimalToFraction({0}, {1}, {r})
|
||||
***
|
||||
float degrees float
|
||||
Function.Intrinsic.Math.DegToRad({0}, {r})
|
||||
***
|
||||
float radians float
|
||||
Function.Intrinsic.Math.RadToDeg({0}, {r})
|
||||
***
|
||||
float exp float
|
||||
Function.Intrinsic.Math.Exp({0}, {r})
|
||||
***
|
||||
int whole float
|
||||
Function.Intrinsic.Math.Fix({0}, {r})
|
||||
***
|
||||
float acosh float
|
||||
Function.Intrinsic.Math.HACos({0}, {r})
|
||||
***
|
||||
float acsch float
|
||||
Function.Intrinsic.Math.HACoSec({0}, {r})
|
||||
***
|
||||
float acoth float
|
||||
Function.Intrinsic.Math.HACoTan({0}, {r})
|
||||
***
|
||||
float asech float
|
||||
Function.Intrinsic.Math.HASec({0}, {r})
|
||||
***
|
||||
float asinh float
|
||||
Function.Intrinsic.Math.HASin({0}, {r})
|
||||
***
|
||||
float atanh float
|
||||
Function.Intrinsic.Math.HATan({0}, {r})
|
||||
***
|
||||
float cosh float
|
||||
Function.Intrinsic.Math.Hcos({0}, {r})
|
||||
***
|
||||
float csch float
|
||||
Function.Intrinsic.Math.HCoSec({0}, {r})
|
||||
***
|
||||
float coth float
|
||||
Function.Intrinsic.Math.HCoTan({0}, {r})
|
||||
***
|
||||
float sech float
|
||||
Function.Intrinsic.Math.Hsec({0}, {r})
|
||||
***
|
||||
float sinh float
|
||||
Function.Intrinsic.Math.Hsin({0}, {r})
|
||||
***
|
||||
float tanh float
|
||||
Function.Intrinsic.Math.HTan({0}, {r})
|
||||
***
|
||||
int idiv float float
|
||||
Function.Intrinsic.Math.Idiv({0}, {1}, {r})
|
||||
***
|
||||
float inv float
|
||||
Function.Intrinsic.Math.Inv({0}, {r})
|
||||
***
|
||||
bool inrange float float float
|
||||
Function.Intrinsic.Math.IsInRange({0}, {1}, {2}, {r})
|
||||
***
|
||||
bool isnum string
|
||||
Function.Intrinsic.Math.IsNumeric({0}, {r})
|
||||
***
|
||||
float log float
|
||||
Function.Intrinsic.Math.Log({0}, {r})
|
||||
***
|
||||
float logn float int
|
||||
Function.Intrinsic.Math.LogN({0}, {1}, {r})
|
||||
***
|
||||
float polarx float float
|
||||
Function.Intrinsic.Math.PolarToX({0}, {1}, {r})
|
||||
***
|
||||
float polary float float
|
||||
Function.Intrinsic.Math.PolarToY({0}, {1}, {r})
|
||||
***
|
||||
float lendiag float float
|
||||
Function.Intrinsic.Math.RectToRad({0}, {1}, {r})
|
||||
***
|
||||
float angdiag float float
|
||||
Function.Intrinsic.Math.RectToTheta({0}, {1}, {r})
|
||||
***
|
||||
float rand
|
||||
Function.Intrinsic.Math.Rnd({r})
|
||||
***
|
||||
float rand float
|
||||
Function.Intrinsic.Math.Rnd({0}, {r})
|
||||
***
|
||||
float rand float float
|
||||
Function.Intrinsic.Math.Rnd({0}, {1}, {r})
|
||||
***
|
||||
float round float float
|
||||
Function.Intrinsic.Math.Round({0}, {1}, 0, {r})
|
||||
***
|
||||
float huround float float
|
||||
Function.Intrinsic.Math.Round({0}, {1}, 1, {r})
|
||||
***
|
||||
float sec float
|
||||
Function.Intrinsic.Math.Sec({0}, {r})
|
||||
***
|
||||
int sign float
|
||||
Function.Intrinsic.Math.Sgn({0}, {r})
|
||||
***
|
||||
float sin float
|
||||
Function.Intrinsic.Math.Sin({0}, {r})
|
||||
***
|
||||
float sqrt float
|
||||
Function.Intrinsic.Math.Sqr({0}, {r})
|
||||
***
|
||||
float tan float
|
||||
Function.Intrinsic.Math.Tan({0}, {r})
|
||||
***
|
||||
float pow float float
|
||||
Function.Intrinsic.Math.XToY({0}, {1}, {r})
|
||||
|
||||
! TODO: add Function.Intrinsic.Math.UnitConversion aliases
|
23
GASi/bin/Debug/test.gi
Normal file
23
GASi/bin/Debug/test.gi
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include "test.gas"
|
||||
|
||||
float add(float a, float b) {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
//this is a comment
|
||||
void main() {
|
||||
global float coolFloatDude = 20.30;
|
||||
global int coolIntegerDude = 30;
|
||||
|
||||
coolFloatDude = add(coolFloatDude, coolFloatDude);
|
||||
|
||||
::
|
||||
Function.Intrinsic.Math.Log(coolFloatDude,coolFloatDude)
|
||||
Function.Intrinsic.Math.Exp(coolFloatDude,coolFloatDude)
|
||||
Really.Long.Trash.Statement(coolFloatDude,coolFloatDude)
|
||||
::
|
||||
|
||||
if(coolFloatDude <= coolIntegerDude) { //comment after the line ends
|
||||
Msgbox.Show("Hi");
|
||||
}
|
||||
}
|
BIN
GASi/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
Normal file
BIN
GASi/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
Normal file
Binary file not shown.
1
GASi/obj/Debug/GASi.csproj.CoreCompileInputs.cache
Normal file
1
GASi/obj/Debug/GASi.csproj.CoreCompileInputs.cache
Normal file
|
@ -0,0 +1 @@
|
|||
6acd9c8c400fd21bde195fc004fe6c0d34033e41
|
13
GASi/obj/Debug/GASi.csproj.FileListAbsolute.txt
Normal file
13
GASi/obj/Debug/GASi.csproj.FileListAbsolute.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\bin\Debug\GASi.exe.config
|
||||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\bin\Debug\GASi.exe
|
||||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\bin\Debug\GASi.pdb
|
||||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\obj\Debug\GASi.csprojResolveAssemblyReference.cache
|
||||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\obj\Debug\GASi.exe
|
||||
\\dc01\users\alec\my documents\visual studio 2015\Projects\GASi\GASi\obj\Debug\GASi.pdb
|
||||
C:\Users\Julian\Desktop\GASi\GASi\bin\Debug\GASi.exe.config
|
||||
C:\Users\Julian\Desktop\GASi\GASi\bin\Debug\GASi.exe
|
||||
C:\Users\Julian\Desktop\GASi\GASi\bin\Debug\GASi.pdb
|
||||
C:\Users\Julian\Desktop\GASi\GASi\obj\Debug\GASi.csprojResolveAssemblyReference.cache
|
||||
C:\Users\Julian\Desktop\GASi\GASi\obj\Debug\GASi.csproj.CoreCompileInputs.cache
|
||||
C:\Users\Julian\Desktop\GASi\GASi\obj\Debug\GASi.exe
|
||||
C:\Users\Julian\Desktop\GASi\GASi\obj\Debug\GASi.pdb
|
BIN
GASi/obj/Debug/GASi.csprojResolveAssemblyReference.cache
Normal file
BIN
GASi/obj/Debug/GASi.csprojResolveAssemblyReference.cache
Normal file
Binary file not shown.
BIN
GASi/obj/Debug/GASi.exe
Normal file
BIN
GASi/obj/Debug/GASi.exe
Normal file
Binary file not shown.
BIN
GASi/obj/Debug/GASi.pdb
Normal file
BIN
GASi/obj/Debug/GASi.pdb
Normal file
Binary file not shown.
162
GASi/stdlib/math.glib
Normal file
162
GASi/stdlib/math.glib
Normal file
|
@ -0,0 +1,162 @@
|
|||
! gasi stdlib
|
||||
! math function definitions
|
||||
! {0}, {1}, {2}, etc. indicate function arguments
|
||||
! {r} indicates the return value
|
||||
|
||||
float abs float
|
||||
Function.Instrinsic.Math.Abs({0}, {r})
|
||||
***
|
||||
float acos float
|
||||
Function.Instrinsic.Math.Acos({0}, {r})
|
||||
***
|
||||
float acsc float
|
||||
Function.Instrinsic.Math.ACoSec({0}, {r})
|
||||
***
|
||||
float acot float
|
||||
Function.Intrinsic.Math.ACoTan({0}, {r})
|
||||
***
|
||||
float asec float
|
||||
Function.Intrinsic.Math.Asec({0}, {r})
|
||||
***
|
||||
float asin float
|
||||
Function.Intrinsic.Math.Asin({0}, {r})
|
||||
***
|
||||
float atan float
|
||||
Function.Intrinsic.Math.Atan({0}, {r})
|
||||
***
|
||||
int upccheck string
|
||||
Function.Intrinsic.Math.CalculateUPCcheckDigit({0}, {r})
|
||||
***
|
||||
float tofloat string
|
||||
Function.Intrinsic.Math.ConvertToFloat({0}, {r})
|
||||
***
|
||||
int toint string
|
||||
Function.Intrinsic.Math.ConvertToLong({0}, {r})
|
||||
***
|
||||
float cos float
|
||||
Function.Intrinsic.Math.Cos({0}, {r})
|
||||
***
|
||||
float csc float
|
||||
Function.Intrinsic.Math.CoSec({0}, {r})
|
||||
***
|
||||
float cot float
|
||||
Function.Intrinsic.Math.CoTan({0}, {r})
|
||||
***
|
||||
string tofraction float
|
||||
Function.Intrinsic.Math.DecimalToFraction({0}, {r})
|
||||
***
|
||||
string tofraction float float
|
||||
Function.Intrinsic.Math.DecimalToFraction({0}, {1}, {r})
|
||||
***
|
||||
float degrees float
|
||||
Function.Intrinsic.Math.DegToRad({0}, {r})
|
||||
***
|
||||
float radians float
|
||||
Function.Intrinsic.Math.RadToDeg({0}, {r})
|
||||
***
|
||||
float exp float
|
||||
Function.Intrinsic.Math.Exp({0}, {r})
|
||||
***
|
||||
int whole float
|
||||
Function.Intrinsic.Math.Fix({0}, {r})
|
||||
***
|
||||
float acosh float
|
||||
Function.Intrinsic.Math.HACos({0}, {r})
|
||||
***
|
||||
float acsch float
|
||||
Function.Intrinsic.Math.HACoSec({0}, {r})
|
||||
***
|
||||
float acoth float
|
||||
Function.Intrinsic.Math.HACoTan({0}, {r})
|
||||
***
|
||||
float asech float
|
||||
Function.Intrinsic.Math.HASec({0}, {r})
|
||||
***
|
||||
float asinh float
|
||||
Function.Intrinsic.Math.HASin({0}, {r})
|
||||
***
|
||||
float atanh float
|
||||
Function.Intrinsic.Math.HATan({0}, {r})
|
||||
***
|
||||
float cosh float
|
||||
Function.Intrinsic.Math.Hcos({0}, {r})
|
||||
***
|
||||
float csch float
|
||||
Function.Intrinsic.Math.HCoSec({0}, {r})
|
||||
***
|
||||
float coth float
|
||||
Function.Intrinsic.Math.HCoTan({0}, {r})
|
||||
***
|
||||
float sech float
|
||||
Function.Intrinsic.Math.Hsec({0}, {r})
|
||||
***
|
||||
float sinh float
|
||||
Function.Intrinsic.Math.Hsin({0}, {r})
|
||||
***
|
||||
float tanh float
|
||||
Function.Intrinsic.Math.HTan({0}, {r})
|
||||
***
|
||||
int idiv float float
|
||||
Function.Intrinsic.Math.Idiv({0}, {1}, {r})
|
||||
***
|
||||
float inv float
|
||||
Function.Intrinsic.Math.Inv({0}, {r})
|
||||
***
|
||||
bool inrange float float float
|
||||
Function.Intrinsic.Math.IsInRange({0}, {1}, {2}, {r})
|
||||
***
|
||||
bool isnum string
|
||||
Function.Intrinsic.Math.IsNumeric({0}, {r})
|
||||
***
|
||||
float log float
|
||||
Function.Intrinsic.Math.Log({0}, {r})
|
||||
***
|
||||
float logn float int
|
||||
Function.Intrinsic.Math.LogN({0}, {1}, {r})
|
||||
***
|
||||
float polarx float float
|
||||
Function.Intrinsic.Math.PolarToX({0}, {1}, {r})
|
||||
***
|
||||
float polary float float
|
||||
Function.Intrinsic.Math.PolarToY({0}, {1}, {r})
|
||||
***
|
||||
float lendiag float float
|
||||
Function.Intrinsic.Math.RectToRad({0}, {1}, {r})
|
||||
***
|
||||
float angdiag float float
|
||||
Function.Intrinsic.Math.RectToTheta({0}, {1}, {r})
|
||||
***
|
||||
float rand
|
||||
Function.Intrinsic.Math.Rnd({r})
|
||||
***
|
||||
float rand float
|
||||
Function.Intrinsic.Math.Rnd({0}, {r})
|
||||
***
|
||||
float rand float float
|
||||
Function.Intrinsic.Math.Rnd({0}, {1}, {r})
|
||||
***
|
||||
float round float float
|
||||
Function.Intrinsic.Math.Round({0}, {1}, 0, {r})
|
||||
***
|
||||
float huround float float
|
||||
Function.Intrinsic.Math.Round({0}, {1}, 1, {r})
|
||||
***
|
||||
float sec float
|
||||
Function.Intrinsic.Math.Sec({0}, {r})
|
||||
***
|
||||
int sign float
|
||||
Function.Intrinsic.Math.Sgn({0}, {r})
|
||||
***
|
||||
float sin float
|
||||
Function.Intrinsic.Math.Sin({0}, {r})
|
||||
***
|
||||
float sqrt float
|
||||
Function.Intrinsic.Math.Sqr({0}, {r})
|
||||
***
|
||||
float tan float
|
||||
Function.Intrinsic.Math.Tan({0}, {r})
|
||||
***
|
||||
float pow float float
|
||||
Function.Intrinsic.Math.XToY({0}, {1}, {r})
|
||||
|
||||
! TODO: add Function.Intrinsic.Math.UnitConversion aliases
|
Reference in a new issue