Skip to content

Instantly share code, notes, and snippets.

@VladD2
VladD2 / MiniC.cs
Created April 22, 2025 22:07
Грамматика Mini C
_parser.Rules["Expr"] = new Rule[]
{
t.Number(),
t.Ident(),
new Seq([new Literal("("), new Ref("Expr"), new Literal(")")], "Parens"),
new Seq([t.Ident(), new Literal("("), new Literal(")")], "CallNoArgs"),
new Seq([t.Ident(), new Literal("("), new Ref("Expr"), new ZeroOrMany(new Seq([new Literal(","), new Ref("Expr")], Kind: "ArgsRest")), new Literal(")")], "Call"),
new Seq([new Literal("-"), new ReqRef("Expr", 300)], "Neg"),
new Seq([new Ref("Expr"), new Literal("*"), new ReqRef("Expr", 200)], "Mul"),
@VladD2
VladD2 / SyntaxTree.cs
Created April 22, 2025 22:01
Дерево разбора
public interface ISyntaxNode
{
string Kind { get; }
int StartPos { get; }
int EndPos { get; }
void Accept(ISyntaxVisitor visitor);
ReadOnlySpan<char> AsSpan(string input);
string ToString(string input);
}
@VladD2
VladD2 / Rules.cs
Created April 22, 2025 21:57
AST грамматики динамически расширяемого парсера
public abstract record Rule(string Kind)
{
public abstract override string ToString();
public virtual Rule InlineReferences(Dictionary<string, Rule> inlineableRules) => this;
}
public abstract record Terminal(string Kind) : Rule(Kind)
{
public override Rule InlineReferences(Dictionary<string, Rule> inlineableRules) => this;
public abstract int TryMatch(string input, int position);
namespace A // создает локальный символ простанства имен для текущей ДЛЛ
{
module B // создает локальный символ модуля для текущей ДЛЛ
{
Main() : void // создает локальный символ метода для текущей ДЛЛ
{
// порождает АСТ в котором возможен биндинг
Foo(); // вызов Foo из нэйспэйса A объявленного в другой сборке.
}
}
using System.Console;
[Record] class A { public Foo : B { get; } }
[Record] class B { public Bar : int { get; } }
module Program
{
Main() : void
{
def obj1 : object = A(B(42));
using System.Console;
using System.Collections.Generic;
def dic = Dictionary();
dic.Add("aaa", 123);
WriteLine(dic["aaa"]);
WriteLine(dic[42]); // error: dic has Dictionary[string, int] type
// Nitra.Ast.TopAst
public override void EvalProperties(DependentPropertyEvalContext context)
{
if ((this._N_bitField_51532 & 32) == 0)
{
if (context.Stage >= 1)
{
if (this.IsOpeningInEvaluated)
{
this.OpeningOut = this.OpeningIn;
------ Build started: Project: DotNetLang, Configuration: Debug Any CPU ------
"C:\!\Nitra\.nuget\NuGet.exe" install "C:\!\Nitra\Nitra\DotNetLang\packages.config" -source "" -NonInteractive -RequireConsent -solutionDir "C:\!\Nitra\ "
Restoring NuGet packages...
To prevent NuGet from downloading packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages'.
All packages listed in packages.config are already installed.
C:\Program Files (x86)\Nemerle\\Net-4.0\ncc.exe
/no-color
/no-stdlib
/greedy-references:-
/define:TRACE;DEBUG_EVAL_DEPENDENT_PROPERTIES;DEBUG
Надо реализовать QualifiedReference.Aliased (сейчас там заглушечный код).
Нужно создать список глобальных псевдонимов.
Псевдонимы должны задаваться из свойств проекта или командной строки компилятора.
Каждый псевдоним может быть ассоциирован с одним деревом символов одной или более библиотеки (сборки).
Scope псевдонима должен содержать список корней деревьев символов для каждой сборки.
Предопределенный псевдоним global должен быть ассоциирован с корнем дерева символов проекта.
Для того чтобы сделать это, предварительно, нужно сделать отдельные иерархии символов для каждого проекта/сборки.
А дерево символов каждого проекта надо сделать сборным из деревьев подключенных к нему проектов/сборок.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using BlackHoles.DataContexts;
using BlackHoles.Entities;