MainClass
This commit is contained in:
parent
eed8d26712
commit
f27939ee67
@ -1,16 +1,5 @@
|
|||||||
public static class Calculator
|
public static class Calculator {
|
||||||
{
|
public static double Calculate(string exprStr) {
|
||||||
public static void Main(string[] args){
|
|
||||||
string() joined = "";
|
|
||||||
foreach(string arg in args){
|
|
||||||
joined += arg;
|
|
||||||
}
|
|
||||||
double rezult = Calculate(joined);
|
|
||||||
Console.WriteLine(rezult);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double Calculate(string exprStr)
|
|
||||||
{
|
|
||||||
Lexer() lexer;
|
Lexer() lexer;
|
||||||
List<Token()> tokens = lexer.Lex(exprStr);
|
List<Token()> tokens = lexer.Lex(exprStr);
|
||||||
// lexer.PrintTokens();
|
// lexer.PrintTokens();
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
abstract class FunctionCallExpression : IExpression
|
abstract class FunctionCallExpression : IExpression {
|
||||||
{
|
|
||||||
IExpression X;
|
IExpression X;
|
||||||
|
|
||||||
internal void Init!(IExpression x){
|
internal void Init!(IExpression x){
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
abstract class IExpression
|
abstract class IExpression {
|
||||||
{
|
|
||||||
internal abstract double Calculate();
|
internal abstract double Calculate();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
class NumericExpression : IExpression
|
class NumericExpression : IExpression {
|
||||||
{
|
|
||||||
double N;
|
double N;
|
||||||
|
|
||||||
internal void Init!(double n){
|
internal void Init!(double n){
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
abstract class OperatorExpression : IExpression
|
abstract class OperatorExpression : IExpression {
|
||||||
{
|
|
||||||
IExpression A;
|
IExpression A;
|
||||||
IExpression B;
|
IExpression B;
|
||||||
|
|
||||||
|
|||||||
19
src/Lexer.fu
19
src/Lexer.fu
@ -1,7 +1,5 @@
|
|||||||
class Lexer
|
class Lexer {
|
||||||
{
|
|
||||||
string ExprStr;
|
string ExprStr;
|
||||||
|
|
||||||
List<Token()>() TokenStorage;
|
List<Token()>() TokenStorage;
|
||||||
int tokType = Token.Type_Number;
|
int tokType = Token.Type_Number;
|
||||||
int tokBegin = 0;
|
int tokBegin = 0;
|
||||||
@ -39,10 +37,8 @@ class Lexer
|
|||||||
internal List<Token()> Lex!(string exprStr){
|
internal List<Token()> Lex!(string exprStr){
|
||||||
ExprStr = exprStr;
|
ExprStr = exprStr;
|
||||||
|
|
||||||
while (i < ExprStr.Length)
|
while (i < ExprStr.Length) {
|
||||||
{
|
switch (ExprStr[i]) {
|
||||||
switch (ExprStr[i])
|
|
||||||
{
|
|
||||||
// end token, add new predifined token and move next
|
// end token, add new predifined token and move next
|
||||||
case '(': AddStaticToken(TokBracketOpen); break;
|
case '(': AddStaticToken(TokBracketOpen); break;
|
||||||
case ')': AddStaticToken(TokBracketClose); break;
|
case ')': AddStaticToken(TokBracketClose); break;
|
||||||
@ -75,10 +71,8 @@ class Lexer
|
|||||||
return TokenStorage;
|
return TokenStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TryEndToken!()
|
void TryEndToken!() {
|
||||||
{
|
if (tokBegin != i) {
|
||||||
if (tokBegin != i)
|
|
||||||
{
|
|
||||||
Token() tok = Token.Create(ExprStr, tokBegin, i - tokBegin, tokType);
|
Token() tok = Token.Create(ExprStr, tokBegin, i - tokBegin, tokType);
|
||||||
TokenStorage.Add();
|
TokenStorage.Add();
|
||||||
TokenStorage[TokenStorage.Count-1] = tok;
|
TokenStorage[TokenStorage.Count-1] = tok;
|
||||||
@ -87,8 +81,7 @@ class Lexer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddStaticToken!(Token() tok)
|
void AddStaticToken!(Token() tok) {
|
||||||
{
|
|
||||||
TryEndToken();
|
TryEndToken();
|
||||||
TokenStorage.Add();
|
TokenStorage.Add();
|
||||||
TokenStorage[TokenStorage.Count-1] = tok;
|
TokenStorage[TokenStorage.Count-1] = tok;
|
||||||
|
|||||||
15
src/MainClass.fu
Normal file
15
src/MainClass.fu
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
public static class MainClass {
|
||||||
|
public static void Main(string[] args){
|
||||||
|
#if CS
|
||||||
|
native {
|
||||||
|
System.Globalization.CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
string() joined = "";
|
||||||
|
foreach(string arg in args){
|
||||||
|
joined += arg;
|
||||||
|
}
|
||||||
|
double rezult = Calculator.Calculate(joined);
|
||||||
|
Console.WriteLine(rezult);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,19 +1,18 @@
|
|||||||
class Parser
|
class Parser {
|
||||||
{
|
|
||||||
List<Token()> TokenStorage;
|
List<Token()> TokenStorage;
|
||||||
IExpression# RootExpression;
|
IExpression# RootExpression;
|
||||||
TokenLinkedList() TokensInRPN;
|
TokenLinkedList() TokensInRPN;
|
||||||
Token() TokZero;
|
Token() TokZero;
|
||||||
|
|
||||||
internal Parser(){
|
internal Parser(){
|
||||||
NumericExpression# nan = new NumericExpression();
|
RootExpression = new NumericExpression(); // NaN
|
||||||
nan.Init(Math.NaN);
|
|
||||||
RootExpression = nan;
|
|
||||||
TokZero = Token.Create("0", 0, 1, Token.Type_Number);
|
TokZero = Token.Create("0", 0, 1, Token.Type_Number);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IExpression# Parse!(List<Token()> tokens){
|
internal IExpression# Parse!(List<Token()> tokens){
|
||||||
TokenStorage = tokens;
|
TokenStorage = tokens;
|
||||||
|
if(tokens.Count == 0)
|
||||||
|
return RootExpression; // NaN
|
||||||
SortTokensInRPN();
|
SortTokensInRPN();
|
||||||
BuildExpressionTree();
|
BuildExpressionTree();
|
||||||
return RootExpression;
|
return RootExpression;
|
||||||
@ -133,6 +132,7 @@ class Parser
|
|||||||
|
|
||||||
if(expressionStack.Count == 1)
|
if(expressionStack.Count == 1)
|
||||||
RootExpression = expressionStack.Pop();
|
RootExpression = expressionStack.Pop();
|
||||||
|
else RootExpression = new NumericExpression(); // NaN
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the number or NaN
|
// returns the number or NaN
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
class Token
|
class Token {
|
||||||
{
|
|
||||||
string Str;
|
string Str;
|
||||||
int StartIndex;
|
int StartIndex;
|
||||||
int Length;
|
int Length;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user