Skip to content

Instantly share code, notes, and snippets.

View gaufung's full-sized avatar
Focusing

Fung Kao gaufung

Focusing
View GitHub Profile
@gaufung
gaufung / calculator_token_class.cs
Created September 13, 2020 08:03
Calculaotr token class
//Token.cs
public class Token
{
public TokenType Type { get; set; }
public string Literal { get; set; }
}
@gaufung
gaufung / lexer_test.cs
Created September 13, 2020 08:07
Lexer Test
[Test]
public void TestLexerNextToken()
{
string input = @"1 + 2 * (12 - 6) / 3 + 2 ^ 3
+ ((4+3) * 4)
/ 4
";
var tests = new[]
{
@gaufung
gaufung / calculator_lext.cs
Created September 13, 2020 08:09
Calculator Lexer
// Lexer.cs
public class Lexer
{
//...
public Token NextToken()
{
//...
char character = this.input[this.position];
switch (character)
{
@gaufung
gaufung / calculator_expression.cs
Created September 13, 2020 08:23
Calculator Expression
public abstract class Expression
{
public abstract string TokenLiteral();
}
//IntegerExpression.cs
public class IntegerExpression : Expression
{
public Token Token { get; set; }
public long Value { get; set; }
//...
@gaufung
gaufung / calculator_parser.cs
Created September 13, 2020 08:25
Calculator Parser
//Pecedence.cs
public enum Precedence
{
LOWEST = 0,
SUM = 1,
PRODUCT = 2,
PREFIX = 3,
POWER = 4,
GROUP = 5,
}
@gaufung
gaufung / calculator_parser_2.cs
Created September 13, 2020 08:27
Calculaotr parser 2
public class Parser
{
//...
public Expression Parse()
{
return this.ParseExpression(Precedence.LOWEST);
}
private Expression ParseExpression(Precedence precedence)
{
if(this.PrefixFns.ContainsKey(this._currentToken.Type))
// ParserTest.cs
[TestFixture]
public class ParserTest
{
//...
[Test]
public void TestParser()
{
var tests = new []
{
@gaufung
gaufung / calculator_evaluation_object.cs
Created September 13, 2020 08:31
Calculator Evaluation Object
// Object.cs
public abstract class Object
{
public abstract ObjectType Type();
public abstract string Inspect();
}
// IntegerObject.cs
public class IntegerObject : Object
{
public long Value { get; set; }
@gaufung
gaufung / calculator_evaluator.cs
Created September 13, 2020 08:32
Calculator Evaluator
// Evalutor.cs
public class Evaluator
{
public static Object.Object Eval(Expression expression)
{
if(expression is AST.IntegerExpression)
{
return new Object.IntegerObject { Value = ((IntegerExpression)expression).Value };
}
if(expression is AST.PrefixExpression)
@gaufung
gaufung / calculator_cli_main.cs
Created September 13, 2020 08:34
Calculator CLI Main
static void Main(string[] args)
{
var lexer = new Lexer.Lexer(input);
var parser = new Parser.Parser(lexer);
var expression = parser.Parse();
var result = Evaluate.Evaluator.Eval(expression);
Console.Out.Write(result.Inspect());
}