VisualFA.SourceGenerator 1.3.1

dotnet add package VisualFA.SourceGenerator --version 1.3.1
NuGet\Install-Package VisualFA.SourceGenerator -Version 1.3.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="VisualFA.SourceGenerator" Version="1.3.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add VisualFA.SourceGenerator --version 1.3.1
#r "nuget: VisualFA.SourceGenerator, 1.3.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install VisualFA.SourceGenerator as a Cake Addin
#addin nuget:?package=VisualFA.SourceGenerator&version=1.3.1

// Install VisualFA.SourceGenerator as a Cake Tool
#tool nuget:?package=VisualFA.SourceGenerator&version=1.3.1

Visual FA Source Generator for C#

This package provides tokenizer/lexer generation facilities using source generator technology (C#9/.NET 6 and above)

Documentation Visual FA Basics https://www.codeproject.com/Articles/5375797/Visual-FA-Part-1-Understanding-Finite-Automata Source Generator Docs https://www.codeproject.com/Articles/5376805/Visual-FA-Part-4-Generating-matchers-and-lexers-wi

Usage

[FARule(@"\/\*", Symbol = "commentBlock", BlockEnd = @"\*\/")]
[FARule(@"\/\/[^\n]*", Symbol = "lineComment")]
[FARule(@"[ \t\r\n]+", Symbol = "whiteSpace")]
[FARule(@"[A-Za-z_][A-Za-z0-9_]*", Symbol = "identifier")]
[FARule(@"(0|([1-9][0-9]*))((\.[0-9]+[Ee]\-?[1-9][0-9]*)?|\.[0-9]+)", Symbol = "number")]
[FARule(@"\+", Symbol = "plus")]
[FARule(@"\-", Symbol = "minus")]
[FARule(@"\*", Symbol = "multiply")]
[FARule(@"\/", Symbol = "divide")]
[FARule(@"%", Symbol = "modulo")]
partial class CalcRunner : FAStringDfaTableRunner
{

}

After which you can do

var exp = "the 10 quick brown #@%$! foxes jumped over 1.5 lazy dogs";
var runner = new CalcRunner();
runner.Set(exp);
foreach (var match in runner)
{
    Console.WriteLine(match);
}

That will print the following to the stdout:

[SymbolId: 3, Value: "the", Position: 0 (1, 1)]
[SymbolId: 2, Value: " ", Position: 3 (1, 4)]
[SymbolId: 4, Value: "10", Position: 4 (1, 5)]
[SymbolId: 2, Value: " ", Position: 6 (1, 7)]
[SymbolId: 3, Value: "quick", Position: 7 (1, 8)]
[SymbolId: 2, Value: " ", Position: 12 (1, 13)]
[SymbolId: 3, Value: "brown", Position: 13 (1, 14)]
[SymbolId: 2, Value: " ", Position: 18 (1, 19)]
[SymbolId: -1, Value: "#@", Position: 19 (1, 20)]
[SymbolId: 9, Value: "%", Position: 21 (1, 22)]
[SymbolId: -1, Value: "$!", Position: 22 (1, 23)]
[SymbolId: 2, Value: " ", Position: 24 (1, 25)]
[SymbolId: 3, Value: "foxes", Position: 25 (1, 26)]
[SymbolId: 2, Value: " ", Position: 30 (1, 31)]
[SymbolId: 3, Value: "jumped", Position: 31 (1, 32)]
[SymbolId: 2, Value: " ", Position: 37 (1, 38)]
[SymbolId: 3, Value: "over", Position: 38 (1, 39)]
[SymbolId: 2, Value: " ", Position: 42 (1, 43)]
[SymbolId: 4, Value: "1.5", Position: 43 (1, 44)]
[SymbolId: 2, Value: " ", Position: 46 (1, 47)]
[SymbolId: 3, Value: "lazy", Position: 47 (1, 48)]
[SymbolId: 2, Value: " ", Position: 51 (1, 52)]
[SymbolId: 3, Value: "dogs", Position: 52 (1, 53)]

The base class of your lexer can be one of several values each providing a consistent interface, but different capabilities or implementations:

  1. FAStringRunner - a compiled tokenizer/lexer that works on strings
  2. FATextReaderRunner - a compiled tokenizer/lexer that works on TextReaders
  3. FAStringDfaTableRunner - a table driven tokenizer/lexer that works on strings
  4. FATextReaderDfaTableRunner - a table driven tokenizer/lexer that works on TextReaders

The other alternative is to use [FARule(...}] on a partial method. This will create the runner for you, and implement its class behind the scenes

partial class Lexers
{
    // Declare a lexer. Here we specify the rules and the type of lexer
    // as indicated by FARule attributes and the return type
    // shared dependency code is automatically generated as needed.
    // It won't be generated if your code references VisualFA.
    [FARule(@"\/\*",Symbol="commentBlock",BlockEnd=@"\*\/")]
    [FARule(@"\/\/[^\n]*", Symbol = "lineComment")]
    [FARule(@"[ \t\r\n]+", Symbol = "whiteSpace")]
    [FARule(@"[A-Za-z_][A-Za-z0-9_]*",Symbol="identifier")]
    [FARule(@"(0|([1-9][0-9]*))((\.[0-9]+[Ee]\-?[1-9][0-9]*)?|\.[0-9]+)",Symbol="number")]
    [FARule(@"\+",Symbol = "plus")]
    [FARule(@"\-", Symbol = "minus")]
    [FARule(@"\*", Symbol = "multiply")]
    [FARule(@"\/", Symbol = "divide")]
    [FARule(@"%", Symbol = "modulo")]
    internal static partial FATextReaderDfaTableRunner Calc(TextReader text);
}

After which you can do

var exp = "the 10 quick brown #@%$! foxes jumped over 1.5 lazy dogs";
foreach (var match in Lexers.Calc(new StringReader(exp)))
{
    Console.WriteLine(match);
}

The same output will be produced as before

See the documentation for more details.

There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.1 32 4/25/2024
1.3.0 46 4/24/2024
1.2.1 113 4/1/2024
1.2.0 89 2/5/2024
1.1.0 119 2/4/2024
1.0.0 110 2/2/2024