Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Переезд на паттерн "Посетитель" #4

Merged
merged 176 commits into from
Jul 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
176 commits
Select commit Hold shift + click to select a range
1072028
Добавил пакет с контрактом паттерна "Посетитель", на который переведу…
Stepami Jul 28, 2022
231f09a
Merge branch 'master' into feature/visitor-net
Stepami Jul 29, 2022
b783016
Merge branch 'master' into feature/visitor-net
Stepami Aug 5, 2022
1f9a095
migration to Visitor.NET 2.0.0
Stepami Aug 22, 2022
0165836
базис внедрения шаблона Посетитель
Stepami Sep 9, 2022
e27469c
Merge branch 'master' into feature/visitor-net
Stepami Sep 15, 2022
b6e3dd8
move folder
Stepami Sep 15, 2022
510e9a6
Merge branch 'master' into feature/visitor-net
Stepami Sep 16, 2022
516e1ea
Merge branch 'master' into feature/visitor-net
Stepami Sep 19, 2022
e6ff155
merge
Stepami Sep 19, 2022
9caa7e2
small refactoring + two nodes
Stepami Oct 3, 2022
dbc1b64
fix build
Stepami Oct 3, 2022
a988279
Merge branch 'master' into feature/visitor-net
Stepami Oct 17, 2022
a3314ab
Новая система адресации инструкций (#21)
Stepami Dec 23, 2022
f7408f4
переписал новые визиторы на AddressedInstructions
Stepami Dec 23, 2022
b7835e9
Merge branch 'master' into feature/visitor-net
Stepami Dec 23, 2022
d63313f
удаление конструкта "номер инструкции"
Stepami Dec 28, 2022
e95c233
допиливание работы с Label.cs
Stepami Dec 28, 2022
7ab5460
удаление конструкта номера из алгоритмов инструкций
Stepami Dec 28, 2022
49f4d8a
прогон инструкций в виртуальной машине по адресу
Stepami Dec 28, 2022
7d57c45
переписывание алгоритмов инструкций на работу с адресами
Stepami Dec 28, 2022
2145282
текущая реализация не требует такой сложной конструкции инструкции во…
Stepami Dec 29, 2022
5c4765a
remove unused
Stepami Jan 8, 2023
f39979b
подправил контракт AST
Stepami Jan 8, 2023
c4c027d
block statement
Stepami Jan 17, 2023
07e76ea
Proper HasReturnStatementImplementation
Stepami Jan 17, 2023
d390af9
removed unused code
Stepami Jan 17, 2023
f0f99ea
перегруппировка
Stepami Feb 15, 2023
bf4c73b
address system refactoring
Stepami Mar 1, 2023
1b378bb
HashedAddress.cs fix
Stepami Mar 1, 2023
19f238f
AddressedInstructions.cs fix
Stepami Mar 1, 2023
85b0f6e
introducing brand new visitor architecture
Stepami Mar 1, 2023
ee51c79
unary expression visitor
Stepami Mar 1, 2023
91f1643
refactoring + error removal
Stepami Mar 1, 2023
899ecf5
Simple.cs fix
Stepami Mar 1, 2023
7b131b1
BinaryExpression refactoring
Stepami Mar 2, 2023
4c5b08a
move AddressedInstructions.cs back
Stepami Mar 2, 2023
89014c0
remove unused
Stepami Mar 2, 2023
55d7c1d
as string code gen
Stepami Mar 4, 2023
dfbcab4
Constant.cs refactoring
Stepami Mar 4, 2023
0d7d8c3
доработка генерации существующих функций ExpressionInstructionProvide…
Stepami Mar 6, 2023
b57dee2
ArrayLiteral.cs visit
Stepami Mar 6, 2023
ecdd910
TypeStatement.cs fix
Stepami Mar 6, 2023
f8da897
InsideLoopStatement.cs visit
Stepami Mar 6, 2023
02dd1e1
ExpressionStatement.cs visit
Stepami Mar 6, 2023
748c7b7
ReturnStatement.cs visit
Stepami Mar 6, 2023
cb5b635
Label.cs fix
Stepami Mar 6, 2023
2ed9c81
remove redunant override
Stepami Mar 6, 2023
67e751e
Property.cs refactoring
Stepami Mar 6, 2023
8662728
ObjectLiteral.cs + FunctionDeclaration.cs visitor refactoring & decou…
Stepami Mar 6, 2023
cb7e640
WhileStatement.cs visit refactoring
Stepami Mar 7, 2023
5d0f86c
IfStatement.cs refactoring with visitor
Stepami Mar 7, 2023
cdd2f82
IfStatement.cs fix
Stepami Mar 8, 2023
f65ce87
ConditionalExpression.cs visit fix
Stepami Mar 8, 2023
847112f
AssignmentExpression.cs visitor
Stepami Mar 8, 2023
b627f76
fix
Stepami Mar 8, 2023
2d5408b
fix tests
Stepami Mar 8, 2023
dedfc29
ComplexLiteral.cs
Stepami Mar 9, 2023
7474b10
AssignmentExpression visit fix
Stepami Mar 9, 2023
b275c20
Исправление некорректной грамматики (#28)
Stepami Mar 9, 2023
6165b4c
MemberExpression.cs visiting
Stepami Mar 10, 2023
7b71dd3
refactoring
Stepami Mar 10, 2023
f5e1e07
fix
Stepami Mar 10, 2023
92f68bd
replacement function in AddressedInstructions.cs
Stepami Mar 10, 2023
3077bf0
AssignmentExpression visiting fix
Stepami Mar 10, 2023
667a7a7
fix
Stepami Mar 12, 2023
50e2c79
call expr print
Stepami Mar 12, 2023
532a66e
fix parser
Stepami Mar 12, 2023
13c6b84
parser fix 2
Stepami Mar 12, 2023
21f7ebb
restructuring
Stepami Mar 12, 2023
275e9d3
script body visit fix
Stepami Mar 15, 2023
01a7c77
formatting
Stepami Mar 15, 2023
18968d6
parser fix
Stepami Mar 15, 2023
f922c09
refactoring
Stepami Mar 15, 2023
b6ad784
semantic assertion draft
Stepami Mar 15, 2023
9afb172
break support in if statatement
Stepami Mar 16, 2023
93eca8a
enum rename
Stepami Mar 16, 2023
ace4118
rename
Stepami Mar 16, 2023
f75860e
exceptions excluded from codecov
Stepami Mar 24, 2023
a4dac71
some semantic analysis rework
Stepami Mar 24, 2023
39ab681
removed some tests
Stepami Mar 24, 2023
84abf9a
supress code cov
Stepami Mar 24, 2023
104e577
suppress
Stepami Mar 24, 2023
90baba9
ReturnStatement.cs semantic
Stepami Mar 24, 2023
873265b
renane
Stepami Mar 26, 2023
69c2100
parser fix
Stepami Mar 26, 2023
0ce39d3
rename
Stepami Mar 26, 2023
32e6816
move
Stepami Mar 26, 2023
2a2b8b0
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
6817d09
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
015f198
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
59b295b
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
789b925
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
50d969e
Merge branch 'master' into feature/visitor-net
Stepami Apr 18, 2023
a98b4f7
mv SemanticChecker.cs
Stepami Apr 19, 2023
b07d258
new visitor
Stepami Apr 19, 2023
85e26ff
region
Stepami Apr 19, 2023
c8447a5
SymbolTableBuilder.cs completed
Stepami Apr 23, 2023
ee2afa5
module refactoring
Stepami Apr 24, 2023
9d22ac4
removed symbol table construction from parsing
Stepami Apr 24, 2023
d9a5ee2
SymbolTableInitializer fix
Stepami Apr 25, 2023
5e6ced1
integration with symbol table initializer
Stepami Apr 25, 2023
903141c
refactoring
Stepami Apr 25, 2023
5bad399
DeclarationVisitor.cs
Stepami Apr 29, 2023
ffbd8f8
usage of decl visitor
Stepami Apr 29, 2023
f8da1ba
fix recursion
Stepami Apr 29, 2023
401ca7d
- Visiting type decl
Stepami Apr 29, 2023
a70402d
fix
Stepami Apr 29, 2023
4e8f02d
small fix
Stepami May 2, 2023
b25a9ee
update nuget
Stepami May 2, 2023
d8fdddf
symbol refactoring
Stepami May 2, 2023
c2a153d
some work stuck long time ago
Stepami Aug 29, 2023
d3a3796
symbol state
Stepami Aug 30, 2023
864b37a
предварительная версия инициализатора имён
Stepami Sep 1, 2023
af642d6
fix ci
Stepami Sep 1, 2023
8c44d94
complete type loading system rework
Stepami Oct 10, 2023
d887b9e
type resolving example
Stepami Oct 10, 2023
89b5883
refactoring of default js types consuming and custom types resolving
Stepami Oct 10, 2023
818005e
fix function codegen bug - end label was not emitted
Stepami Oct 10, 2023
46d825c
type domain refactored
Stepami Oct 11, 2023
b73cc7d
pre-load built types before reference resolving
Stepami Oct 11, 2023
cc75ea2
fix bug in object type ref resolving
Stepami Oct 11, 2023
c52520f
hierarchy enhancement
Stepami Oct 11, 2023
e7c542d
guard of type duplicates and built-in types declaration
Stepami Oct 14, 2023
cc3eacd
initialized/declared type symbols
Stepami Oct 14, 2023
f8bce62
some new checks
Stepami Oct 14, 2023
a5cb1a4
more refac
Stepami Oct 15, 2023
867bc64
proper render of type values
Stepami Oct 16, 2023
c90acef
guard declarations from duplicates
Stepami Oct 16, 2023
698fa64
do not return null
Stepami Oct 16, 2023
c9c97a3
binary and unary expressions check
Stepami Oct 16, 2023
a8ed4d0
fix bug sequence has no elements
Stepami Oct 16, 2023
2cc2a53
guard against no initializer
Stepami Oct 16, 2023
d36f26a
formatting
Stepami Oct 16, 2023
41d197b
there is not symbol without initializer thus symbol cannot be not ini…
Stepami Oct 16, 2023
34757f4
working with assignments
Stepami Oct 18, 2023
317a981
checking access expressions
Stepami Oct 18, 2023
a5f6657
Merge branch 'master' into feature/visitor-net
Stepami Oct 18, 2023
6bef425
check object literal without methods
Stepami Oct 19, 2023
fb8bec3
реструктуризация сервисов посетителей
Stepami Dec 8, 2023
3352007
рефакторинг после реструктуризации
Stepami Dec 8, 2023
eda24ac
удалил ненавистный Utils
Stepami Dec 8, 2023
c7a3000
рефакторинг объектного типа
Stepami Dec 8, 2023
445e42e
сохранение функций в хранилище, для которых не был сразу выведен возв…
Stepami Dec 17, 2023
7662f85
call expr check v1
Stepami Dec 17, 2023
2d619e1
fix
Stepami Feb 15, 2024
377b417
перенос проверок функции статическим анализом
Stepami Feb 16, 2024
568a835
Починил бекенд при работе с анонимными массивами и объектами
Stepami Feb 16, 2024
87b3dfd
доработка вывода типов
Stepami Feb 16, 2024
4dc7124
поправил вывод типов в части необработанных функций
Stepami Feb 16, 2024
02735dc
обновление версий экшенов
Stepami Feb 16, 2024
f227199
вторая волна обновлений
Stepami Feb 16, 2024
edfbfae
upd workflows
Stepami Feb 16, 2024
097e1a0
global using visitor.net
Stepami Feb 16, 2024
ef97623
fix func decl gen
Stepami Feb 16, 2024
e6448c1
Revert "fix func decl gen"
Stepami Feb 16, 2024
84c66b1
visit fix
Stepami Feb 16, 2024
872a7a1
Имеет ли функция пустое тело
Stepami Feb 19, 2024
9986fea
исправил ошибку кодогенерации if statement при отсутствии else блока
Stepami Feb 19, 2024
a2b5a3f
базовая кодогенерация для вызова функции без учета метода объекта
Stepami Feb 19, 2024
cfcd17e
доработка вывода типов
Stepami Feb 19, 2024
a4e37fd
починил статический анализ доступа к элементу массива по индексу
Stepami Mar 24, 2024
65e5f94
fix
Stepami Mar 24, 2024
38f0e27
rename to hydrascript
Stepami Jun 17, 2024
9820043
#15 - удалил методы из объекта
Stepami Jul 18, 2024
4d86b41
#15 - удалил концепцию метода из бекенда
Stepami Jul 18, 2024
0c03f2a
#15 - удалил FunctionType.cs
Stepami Jul 19, 2024
73fc15b
#15 - статический анализ вызова метода
Stepami Jul 19, 2024
49448a6
#15 - кодогенерация вызова метода
Stepami Jul 19, 2024
d21136b
#15 - актуализация лексической структуры
Stepami Jul 19, 2024
906ce88
#15 - доработка "забытого" статического анализа
Stepami Jul 19, 2024
dcb7927
#15 - поправил кодген if-else
Stepami Jul 19, 2024
b2bf014
rm
Stepami Jul 20, 2024
5ff32a5
#15 - если у функции не прописан тип и нет return'ов, то она void
Stepami Jul 20, 2024
c621031
#15 - корректировка примеров
Stepami Jul 20, 2024
8154d4d
#23 - рабочий пример
Stepami Jul 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/cla.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
with:
path-to-signatures: 'signatures.json'
path-to-document: 'https://github.com/Stepami/extended-js-subset/blob/master/contributor-licence-agreement.md'
path-to-document: 'https://github.com/Stepami/hydrascript/blob/master/contributor-licence-agreement.md'
allowlist: Stepami,bot*
branch: 'main'
remote-repository-name: hydrascript-cla-signatures
18 changes: 9 additions & 9 deletions .github/workflows/develop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v2
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Cache NuGet packages
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj*') }}
Expand All @@ -36,9 +36,9 @@ jobs:
if: github.event_name == 'pull_request'
uses: 5monkeys/cobertura-action@master
with:
path: ./Interpreter.Tests/coverage.cobertura.xml
path: ./HydraScript.Tests/coverage.cobertura.xml
repo_token: ${{ secrets.GITHUB_TOKEN }}
minimum_coverage: 80
minimum_coverage: 20
fail_below_threshold: true
show_class_names: true
show_missing: true
Expand All @@ -49,21 +49,21 @@ jobs:
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
uses: irongut/[email protected]
with:
filename: ./Interpreter.Tests/coverage.cobertura.xml
filename: ./HydraScript.Tests/coverage.cobertura.xml
badge: true
fail_below_min: false
format: markdown
hide_branch_rate: true
hide_complexity: true
thresholds: '80 100'
- name: ReportGenerator
uses: danielpalme/ReportGenerator-GitHub-Action@5.1.10
uses: danielpalme/ReportGenerator-GitHub-Action@5.2.1
with:
reports: './Interpreter.Tests/coverage.cobertura.xml'
reports: './HydraScript.Tests/coverage.cobertura.xml'
targetdir: './coverage-report'
- name: Upload coverage report artifact
if: github.event_name == 'push'
uses: actions/upload-artifact@v2.2.3
uses: actions/upload-artifact@v4
with:
name: CoverageReport
path: coverage-report
12 changes: 6 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Create release
id: create_release
uses: ncipollo/release-action@v1
Expand All @@ -38,21 +38,21 @@ jobs:
runs-on: ${{ matrix.config.os }}
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v2
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Publish
run: |
mkdir output
dotnet publish ./Interpreter/Interpreter.csproj -c Release -r ${{ matrix.config.rid }} -p:PublishSingleFile=true -p:DebugType=embedded --self-contained false -o ./output
dotnet publish ./HydraScript/HydraScript.csproj -c Release -r ${{ matrix.config.rid }} -p:PublishSingleFile=true -p:DebugType=embedded --self-contained false -o ./output
- name: Upload release assets
uses: shogo82148/actions-upload-release-asset@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_name: interpreter-${{ matrix.config.rid }}${{ matrix.config.rid == 'win-x64' && '.exe' || '' }}
asset_path: ./output/Interpreter${{ matrix.config.rid == 'win-x64' && '.exe' || '' }}
asset_name: hydrascript-${{ matrix.config.rid }}${{ matrix.config.rid == 'win-x64' && '.exe' || '' }}
asset_path: ./output/HydraScript${{ matrix.config.rid == 'win-x64' && '.exe' || '' }}
asset_content_type: ${{ matrix.config.type }}

2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Contributions are welcomed! Here's a few things to know:
## Steps to Contributing

Here are the basic steps to get started with your first contribution. Please reach out with any questions.
1. Use [open issues](https://github.com/stepami/extended-js-subset/issues) to discuss the proposed changes. Create an issue describing changes if necessary to collect feedback. Also, please use provided labels to tag issues so everyone can easily sort issues of interest.
1. Use [open issues](https://github.com/stepami/hydrascript/issues) to discuss the proposed changes. Create an issue describing changes if necessary to collect feedback. Also, please use provided labels to tag issues so everyone can easily sort issues of interest.
1. [Fork the repo](https://help.github.com/articles/fork-a-repo/) in order if you want to make and test local changes.
1. Create a new branch **from master** for the issue. We suggest prefixing the branch with type of contribution (`bugfix`/`feature`), your username and then a descriptive title: (e.g. `bugfix/user1/object-comparision` or `feature/user2/variable-initialization-check`)
1. Make code changes.
Expand Down
6 changes: 3 additions & 3 deletions ExtendedJavaScriptSubset.sln
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Interpreter.Lib", "Interpreter.Lib\Interpreter.Lib.csproj", "{83524079-4A56-4AF0-9011-F7CA871536E9}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HydraScript.Lib", "HydraScript.Lib\HydraScript.Lib.csproj", "{83524079-4A56-4AF0-9011-F7CA871536E9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Interpreter", "Interpreter\Interpreter.csproj", "{5DA79C0C-2B98-4E64-81EA-92AFFC5204D3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HydraScript", "HydraScript\HydraScript.csproj", "{5DA79C0C-2B98-4E64-81EA-92AFFC5204D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Interpreter.Tests", "Interpreter.Tests\Interpreter.Tests.csproj", "{F0DD56CB-C68A-4CDC-AA54-0A07342FE08B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HydraScript.Tests", "HydraScript.Tests\HydraScript.Tests.csproj", "{F0DD56CB-C68A-4CDC-AA54-0A07342FE08B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
83 changes: 83 additions & 0 deletions HydraScript.Lib/BackEnd/AddressedInstructions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System.Collections;
using HydraScript.Lib.BackEnd.Addresses;
using HydraScript.Lib.BackEnd.Instructions;

namespace HydraScript.Lib.BackEnd;

public class AddressedInstructions : IEnumerable<Instruction>
{
private readonly LinkedList<IAddress> _addresses = new();
private readonly Dictionary<IAddress, LinkedListNode<IAddress>> _addressToNode = new();
private readonly Dictionary<LinkedListNode<IAddress>, Instruction> _instructions = new();

public Instruction this[IAddress address]
{
get => _instructions[_addressToNode[address]];
private set => _instructions[_addressToNode[address]] = value;
}

public IAddress Start =>
_addresses.First?.Value;

public IAddress End =>
_addresses.Last?.Value;

public void Add(Instruction instruction, string label = null)
{
IAddress newAddress = label is null
? new HashAddress(seed: instruction.GetHashCode())
: new Label(label);
instruction.Address = newAddress;

AddWithAddress(instruction, newAddress);
}

public void Replace(Instruction old, Instruction @new)
{
var address = old.Address;
@new.Address = address;

this[address] = @new;
}

private void AddWithAddress(Instruction instruction, IAddress newAddress)
{
var last = _addresses.Last;
if (last is not null)
last.Value.Next = newAddress;

var newNode = _addresses.AddLast(newAddress);

_addressToNode.Add(newAddress, newNode);
_instructions.Add(newNode, instruction);
}

public void AddRange(IEnumerable<Instruction> instructions)
{
foreach (var instruction in instructions)
AddWithAddress(instruction, instruction.Address);
}

public void Remove(Instruction instruction)
{
var address = instruction.Address;
var nodeToRemove = _addressToNode[address];

var prev = nodeToRemove.Previous;
if (prev is not null)
{
prev.Value.Next = nodeToRemove.Next?.Value;
}

_addressToNode.Remove(address);
_instructions.Remove(nodeToRemove);
_addresses.Remove(nodeToRemove);
}

public IEnumerator<Instruction> GetEnumerator() =>
_addresses.Select(address => this[address])
.GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() =>
GetEnumerator();
}
29 changes: 29 additions & 0 deletions HydraScript.Lib/BackEnd/Addresses/HashAddress.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace HydraScript.Lib.BackEnd.Addresses;

public class HashAddress : IAddress
{
private readonly int _seed;

public IAddress Next { get; set; }

public HashAddress(int seed) =>
_seed = seed;

public bool Equals(IAddress other)
{
if (other is HashAddress hashed)
return _seed == hashed._seed;

return false;
}

public override int GetHashCode()
{
var i1 = _seed ^ 17;
var i2 = 31 * _seed + i1;

return HashCode.Combine(i1, i2);
}

public override string ToString() => "\t";
}
6 changes: 6 additions & 0 deletions HydraScript.Lib/BackEnd/Addresses/IAddress.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace HydraScript.Lib.BackEnd.Addresses;

public interface IAddress : IEquatable<IAddress>
{
IAddress Next { get; set; }
}
25 changes: 25 additions & 0 deletions HydraScript.Lib/BackEnd/Addresses/Label.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace HydraScript.Lib.BackEnd.Addresses;

public class Label : IAddress
{
public string Name { get; }

public Label(string name) =>
Name = name;

public IAddress Next { get; set; }

public bool Equals(IAddress other)
{
if (other is Label label)
return Name == label.Name;

return false;
}

public override int GetHashCode() =>
Name.GetHashCode();

public override string ToString() =>
$"{Name}:\n\t";
}
48 changes: 48 additions & 0 deletions HydraScript.Lib/BackEnd/Instructions/BlockLabel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using HydraScript.Lib.BackEnd.Addresses;

namespace HydraScript.Lib.BackEnd.Instructions;

public abstract class BlockLabel : Instruction
{
private readonly BlockPosition _blockPosition;
private readonly BlockType _blockType;
private readonly string _blockId;

protected BlockLabel(BlockPosition blockPosition, BlockType blockType, string blockId)
{
_blockPosition = blockPosition;
_blockType = blockType;
_blockId = blockId;
}

public override IAddress Execute(VirtualMachine vm) =>
Address.Next;

protected override string ToStringInternal() =>
$"{_blockPosition}{_blockType} {_blockId}";

protected enum BlockPosition
{
Begin,
End
}
}

public enum BlockType
{
Function,
Loop,
Condition
}

public class BeginBlock : BlockLabel
{
public BeginBlock(BlockType blockType, string blockId) :
base(BlockPosition.Begin, blockType, blockId) { }
}

public class EndBlock : BlockLabel
{
public EndBlock(BlockType blockType, string blockId) :
base(BlockPosition.End, blockType, blockId) { }
}
16 changes: 16 additions & 0 deletions HydraScript.Lib/BackEnd/Instructions/Halt.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using HydraScript.Lib.BackEnd.Addresses;

namespace HydraScript.Lib.BackEnd.Instructions;

public class Halt : Instruction
{
public override bool End() => true;

public override IAddress Execute(VirtualMachine vm)
{
vm.Frames.Pop();
return new HashAddress(seed: 0);
}

protected override string ToStringInternal() => "End";
}
29 changes: 29 additions & 0 deletions HydraScript.Lib/BackEnd/Instructions/Instruction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using HydraScript.Lib.BackEnd.Addresses;

namespace HydraScript.Lib.BackEnd.Instructions;

public abstract class Instruction
{
private IAddress _address;

public IAddress Address
{
get => _address;
set
{
OnSetOfAddress(value);
_address = value;
}
}

protected virtual void OnSetOfAddress(IAddress address) { }

public abstract IAddress Execute(VirtualMachine vm);

public virtual bool End() => false;

protected abstract string ToStringInternal();

public override string ToString() =>
$"{Address}{ToStringInternal()}";
}
21 changes: 21 additions & 0 deletions HydraScript.Lib/BackEnd/Instructions/Print.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using HydraScript.Lib.BackEnd.Addresses;
using HydraScript.Lib.BackEnd.Values;

namespace HydraScript.Lib.BackEnd.Instructions;

public class Print : Instruction
{
private readonly IValue _value;

public Print(IValue value) =>
_value = value;

public override IAddress Execute(VirtualMachine vm)
{
vm.Writer.WriteLine(_value.Get(vm.Frames.Peek()));
return Address.Next;
}

protected override string ToStringInternal() =>
$"Print {_value}";
}
Loading
Loading