diff --git a/.editorconfig b/.editorconfig index 380d16d..49a4fb8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,8 +8,8 @@ indent_size = 4 insert_final_newline = false trim_trailing_whitespace = true -[*.sln] -indent_style = tab +[*.slnx] +indent_size = 2 [*.{csproj,vbproj,vcxproj,vcxproj.filters}] indent_size = 2 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6db2219..b511f7d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,21 +14,22 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cache packages - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ${{ env.NUGET_PACKAGES }} - key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} + key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET 6.x - uses: actions/setup-dotnet@v1 + - name: Setup .NET SDK (global.json + .NET 8 for tests) + uses: actions/setup-dotnet@v5 with: - dotnet-version: 6.0.300 + global-json-file: global.json + dotnet-version: 8.0.x - name: Integration Tests shell: bash @@ -55,21 +56,22 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cache packages - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ${{ env.NUGET_PACKAGES }} - key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} + key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET 6.x - uses: actions/setup-dotnet@v1 + - name: Setup .NET SDK (global.json + .NET 8 for tests) + uses: actions/setup-dotnet@v5 with: - dotnet-version: 6.0.300 + global-json-file: global.json + dotnet-version: 8.0.x - name: Integration Tests shell: bash diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index e6b2d78..144de40 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -21,21 +21,22 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cache packages - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ${{ env.NUGET_PACKAGES }} - key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} + key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET 6.x - uses: actions/setup-dotnet@v1 + - name: Setup .NET SDK (global.json + .NET 8 for tests) + uses: actions/setup-dotnet@v5 with: - dotnet-version: 6.0.300 + global-json-file: global.json + dotnet-version: 8.0.x - name: Publish shell: bash diff --git a/.gitignore b/.gitignore index 286d5f7..4d0e373 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,6 @@ dotnet-install.sh* .vs/ .vscode/ launchSettings.json -*.sln.ide/ # Rider src/.idea/**/workspace.xml @@ -41,7 +40,6 @@ src/.idea/**/uiDesigner.xml # User-specific files *.suo *.user -*.sln.docstates *.userprefs *.GhostDoc.xml *StyleCop.Cache diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..c64cba3 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,83 @@ +# AGENTS.md + +Guidance for AI coding agents and contributors working in this repository. + +## Overview + +Appy.Parsing is an open-source .NET library, published to nuget.org, that turns raw text into +objects. A regex-based lexer splits text into tokens and a parser combines tokens into objects; +fluent builders define the grammar. Usage lives in [README.md](README.md), design in +[docs/Architecture.md](docs/Architecture.md). + +## Build Commands + +```bash +dotnet tool restore # cake, minver-cli, gpr +dotnet cake # Default target: clean, build, test, pack into .artifacts/ +dotnet test src/Appy.Parsing.slnx # tests only +dotnet test src/Appy.Parsing.slnx --filter "FullyQualifiedName~CalculatorTest" +``` + +- The cake build treats warnings as errors. +- `config.yml` lists the projects cake builds and their role (`Package` or `Test`). A new + project not listed there is skipped by the build. +- Package versions live in `src/Directory.Packages.props` (central package management); a + `PackageReference` in a csproj carries no `Version`. The repo `nuget.config` restores from + nuget.org only. +- Never run the `Publish` cake target or `dotnet nuget push` locally; CI publishes. + +## Structure + +| Path | Purpose | +|------|---------| +| `src/Appy.Parsing/` | The library (`net10.0;net8.0`): `Builder/`, `Lexers/`, `Parsers/` | +| `src/Appy.Parsing.Tests/` | xUnit v3 tests (`net10.0;net8.0`, one run per library TFM) | +| `src/Directory.Build.props` | Shared build settings, package metadata | +| `src/Directory.Build.targets` | MinVer and package validation settings | +| `src/Directory.Packages.props` | Package versions | +| `global.json` | .NET 10 SDK version | +| `build.cake`, `functions.cake`, `config.yml` | Cake build | +| `.github/workflows/` | `ci.yaml` on pull requests, `publish.yaml` on push to `master` or a tag | +| `docs/` | Architecture and plans | + +## Versioning and Publishing + +- [MinVer](https://github.com/adamralph/minver) derives the version from git tags + (`MAJOR.MINOR.PATCH`, no `v` prefix). Untagged commits get a `-preview.0.N` suffix. +- The MinVer minimum major.minor (`2.0`) is set in both `src/Directory.Build.targets` and + `build.cake`; keep them in sync. +- Pack runs package validation against the last release: `PackageValidationBaselineVersion` in + `src/Directory.Build.targets`, suppressions in `src/Appy.Parsing/CompatibilitySuppressions.xml`. + After each release, move the baseline to that version and drop suppressions that no longer + apply. +- A push to `master` that touches `src/` publishes a preview package; a tag publishes that + version. Do not create tags or releases unless a maintainer asks. +- Dropping a target framework or public API is a breaking change: call it out in the PR. + +## Tests + +- xUnit v3 (`xunit.v3` 3.2.2, `xunit.runner.visualstudio` 3.1.5, run through VSTest, + `GitHubActionsTestLogger` 2.4.1) with FluentAssertions 7. Stay on FluentAssertions 7: 8 has a + commercial licence. +- Tests build real lexers and parsers through the builders; no mocks. +- Add or update a test with every behaviour change, and write it first. + +## Code Style + +- `.editorconfig`: 4 spaces, CRLF; 2 spaces for XML, JSON and YAML. +- Match the existing code: `_camelCase` private fields, lower camel case private methods + (`populateUnmatchedPart`), no explicit `private` modifier. +- Public types and members carry XML doc comments. + +## Git Conventions + +- Branches: `feat/…`, `fix/…`, `docs/…`, `chore/…`, from `master`. +- Commits: conventional commits, `type(scope): subject`, imperative, lower case, no trailing dot + ([CONTRIBUTING.md](CONTRIBUTING.md#commit)). Breaking changes go in a `BREAKING CHANGE:` footer. +- No `Co-Authored-By` or tool attribution trailers. +- Public repository: never commit secrets, private feeds or internal links. + +## Documentation + +- [docs/Architecture.md](docs/Architecture.md): start here +- [docs/plans/](docs/plans/): implementation plans (`NNN-slug.md`) diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e7d9fe5 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,15 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +@./AGENTS.md + +## Build & Test + +```bash +dotnet tool restore +dotnet cake # clean, build, test, pack into .artifacts/ +dotnet test src/Appy.Parsing.slnx # tests only +``` + +Never run the `Publish` cake target or `dotnet nuget push`; publishing happens in CI only. diff --git a/README.md b/README.md index cd19b57..341d1b2 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,16 @@ It also has a number of Builders that allow you to easily define a grammar and b ## Table of Contents +- [Supported frameworks](#supported-frameworks) - [Installing](#installing) - [Usage](#usage) +## Supported frameworks + +Appy.Parsing targets `net10.0` and `net8.0`. + +Version 2.0 drops `net6.0` and `netstandard2.0`, so it no longer runs on .NET Framework. Projects on those frameworks can stay on [1.1.0](https://www.nuget.org/packages/Appy.Parsing/1.1.0). + ## Installing Install using the [Appy.Parsing NuGet package](https://www.nuget.org/packages/Appy.Parsing): diff --git a/build.cake b/build.cake index 83e0e3c..b75657e 100644 --- a/build.cake +++ b/build.cake @@ -1,7 +1,7 @@ -#addin nuget:?package=YamlDotNet&version=8.1.2 +#addin nuget:?package=YamlDotNet&version=16.2.0 #addin nuget:?package=System.Xml.XDocument&version=4.3.0 -#addin nuget:?package=Cake.MinVer&version=2.0.0 -#addin nuget:?package=Cake.Yaml&version=3.1.1 +#addin nuget:?package=Cake.MinVer&version=4.0.0 +#addin nuget:?package=Cake.Yaml&version=6.0.0 #load "./functions.cake" @@ -14,6 +14,7 @@ var configFilePath = "config.yml"; var taskConfigManager = new ProjectTaskConfigurationManager(); var projectDescriptors = ProjectLoader.Load(Context, configFilePath, basePath, configuration).Projects; var version = MinVer(settings => settings + .WithMinimumMajorMinor("2.0") .WithDefaultPreReleasePhase("preview") .WithVerbosity(MinVerVerbosity.Info)); @@ -41,7 +42,7 @@ Task("Restore") DotNetRestore(basePath, new DotNetRestoreSettings { - Verbosity = DotNetCoreVerbosity.Minimal + Verbosity = DotNetVerbosity.Minimal }); }); @@ -59,7 +60,7 @@ Task("Build-Project") Configuration = configuration, NoRestore = true, NoIncremental = context.HasArgument("rebuild"), - MSBuildSettings = new DotNetCoreMSBuildSettings() + MSBuildSettings = new DotNetMSBuildSettings() .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) }); } @@ -104,7 +105,7 @@ Task("Package") NoRestore = true, NoBuild = true, OutputDirectory = artifactsPath, - MSBuildSettings = new DotNetCoreMSBuildSettings() + MSBuildSettings = new DotNetMSBuildSettings() .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) }); } @@ -163,7 +164,7 @@ Task("Publish-Package-NuGet") context.Information("Publishing {0} to Nuget", nugetPkgFilePath); - DotNetCoreNuGetPush(nugetPkgFilePath, new DotNetCoreNuGetPushSettings + DotNetNuGetPush(nugetPkgFilePath, new DotNetNuGetPushSettings { Source = "https://api.nuget.org/v3/index.json", ApiKey = apiKey, diff --git a/docs/Architecture.md b/docs/Architecture.md new file mode 100644 index 0000000..d86e5fe --- /dev/null +++ b/docs/Architecture.md @@ -0,0 +1,44 @@ +# Appy.Parsing: Architecture + +## Overview + +Appy.Parsing converts raw text into objects in two stages. A `Lexer` runs one combined regular +expression (one named group per `Tokenizer`) and turns each match into a token object; text that +matches nothing is kept as a string unless the lexer ignores it. A `Parser` then applies its +`TokenParser` rules in registration order. Each rule encodes the token sequence as a string of type +identifiers, matches its pattern against it and replaces the matched run with the object it +creates, repeating until the rule no longer matches. + +`LexerBuilder` and `ParserBuilder` are the public entry points: fluent builders that declare the +grammar. Build and test guidance lives in [AGENTS.md](../AGENTS.md). + +## System Diagram + +```mermaid +graph LR + Text["Input text"] --> Lexer + LexerBuilder -->|creates| Lexer + Lexer -->|tokens| Parser + ParserBuilder -->|creates| Parser + Parser -->|applies TokenParser rules in order| Result["object[] or T"] +``` + +## Key Patterns + +### Builders define the grammar + +`LexerBuilder.Match*` registers tokenizers (regex, enum values via `[Match]`, dictionaries). +`ParserBuilder.Match*` registers token rules with `MatchOptions` (`AllInOrder`, `AnyOrder`, +`AtLeastOne`) that expand into one rule per accepted token combination. Builders compose with +`CombineWith`. + +### Cached tokenization + +`Lexer` caches the token array per input expression in a `ConcurrentDictionary`, so repeated +expressions skip the regex pass. + +## Plans + +| Plan | Status | Summary | +|------|--------|---------| +| [001 .NET 10 Migration](plans/001-net10-migration.md) | In Progress | Target net10.0 and net8.0; align build and CI | diff --git a/docs/plans/001-net10-migration.md b/docs/plans/001-net10-migration.md new file mode 100644 index 0000000..eb91218 --- /dev/null +++ b/docs/plans/001-net10-migration.md @@ -0,0 +1,95 @@ +# .NET 10 Migration + +- **Status:** In Progress +- **Branch:** `feat/net10` + +## Summary + +Move Appy.Parsing from `net6.0;netstandard2.0` to `net10.0;net8.0` on the .NET 10 SDK, with tests +on `net10.0` and `net8.0`, and release it as 2.0.0. The build, packages, test stack and GitHub Actions line up +with [Appy.Configuration](https://github.com/YellowLineParking/Appy.Configuration), which already +made this move. No public API or behaviour change is intended; only the supported frameworks change. + +## Decisions + +| Decision | Context | Alternatives Considered | +|----------|---------|------------------------| +| Library `net10.0;net8.0`, tests `net10.0;net8.0` | net10.0 and net8.0 are the supported LTS releases. net6.0 is out of support; `netstandard2.0` only needed the `Nullable` polyfill. Tests run once per shipped library asset. | Also `net9.0`: a short-term release that net8.0 assets already cover. Keep `netstandard2.0`: .NET Framework users can stay on 1.x. | +| Release 2.0.0 | Dropping `net6.0` and `netstandard2.0` breaks .NET Framework, net6 and net7 users: a SemVer major. | 1.2.0, as Appy.Configuration did for the same drop: undersells the break. | +| MinVer as the reference (2.3.0, package and CLI), phase `preview`, minimum major.minor `2.0` | One versioning setup across both repos. With the minimum set, the preview published on merge reads `2.0.0-preview.0.N`, not `1.1.1-preview`. | MinVer 8: needs a workaround in `build.cake` because Cake.MinVer only exposes the phase option that MinVer 8 rejects. | +| Repo `nuget.config` restores from nuget.org only | Central package management warns (NU1507) when a contributor's machine has more than one package source; a single cleared source avoids that without suppressing the warning. | Suppress NU1507: hides real source mix-ups. | +| Central package management, `.slnx`, no Traversal build | `.slnx` is the SDK 10 solution format. Cake builds the projects listed in `config.yml`, as before. | Keep `.sln` as the reference. Traversal build as the reference: deferred. | +| xUnit v3 3.2.2 with `xunit.runner.visualstudio` 3.1.5, FluentAssertions 7.2.2 | xUnit v2 is in maintenance mode; 3.2.2 matches the sibling repos. FluentAssertions 8 has a commercial licence; 7.x is the last Apache-2.0 line. | xUnit v3 4.x: newer, not yet used alongside. xUnit v2 as the reference: leaves a migration for later. | +| CI installs the .NET 10 SDK (from `global.json`) plus .NET 8.0.x | The SDK builds both TFMs; 8.0.x provides the runtime for the net8.0 test run. | Install 8/9/10 as the reference: net9 is unused. | +| Package validation against 1.1.0 | Guards the API from this release on. The only expected findings are the two dropped TFMs (PKV006), suppressed explicitly. | None (the reference has none): a TFM or API drop could ship silently. | +| Drop `Microsoft.SourceLink.GitHub`, `Nullable`, unused `Moq` | Source Link ships in the .NET 8+ SDK; the polyfill and `Moq` are unused on net8+. | Keep them as the reference does: dead dependencies. | +| Nullable reference types stay off | Annotating the public API is a separate change. | Enable now: widens a framework-only PR. | + +## Tasks + +Each task is one commit. The `!` marks the breaking change. + +- [x] 1. `feat(dotnet)!: target net10.0 and net8.0`: `global.json` SDK `10.0.103` with + `rollForward: latestFeature` (drop `projects`); library TFMs; test TFM `net10.0` (later net10.0;net8.0, from review); remove the + `Nullable` package, the `Microsoft.NETCore.App.Ref` download and the annotator properties; + `PackageTags` to `NET10;NET8;parsing;lexer`. Test: the existing 14 tests pass on net10.0. +- [x] 2. `chore(deps): adopt central package management and upgrade packages`: add + `src/Directory.Packages.props`, move all versions out of `Directory.Build.props` and the csproj + files, drop `Moq` and `Microsoft.SourceLink.GitHub`. Versions: Microsoft.NET.Test.Sdk 18.10.1, + FluentAssertions 7.2.2, NodaTime 3.3.5, GitHubActionsTestLogger 3.0.5 (2.4.1 in task 3), + XunitXml.TestLogger 8.0.0 (dropped in task 3), MinVer 2.3.0. Test: build with `-warnaserror`, + 14 tests pass. +- [x] 3. `test: migrate tests to xUnit v3`: `xunit` to `xunit.v3` 3.2.2, + `xunit.runner.visualstudio` 3.1.5, `OutputType` `Exe`, per the xUnit v3 migration guide. Test: + 14 tests discovered and passing (a count of 0 is a failure). GitHubActionsTestLogger goes to 2.4.1 + and XunitXml.TestLogger is dropped: their newer versions need Microsoft.Testing.Platform 2, which + xunit.v3 3.2.2 does not use. +- [x] 4. `chore(build): align cake build and versioning with .NET 10`: port `build.cake` from the + reference without the Docker tasks (Cake 6 `DotNet*` API; projects still come from `config.yml`, + no Traversal build); `dotnet-tools.json` cake.tool 6.3.0, + minver-cli 2.3.0, gpr 0.1.294; addins Cake.MinVer 4.0.0, Cake.Yaml 6.0.0, YamlDotNet 16.2.0 (as + the reference). `MinVerMinimumMajorMinor=2.0` in `Directory.Build.targets` and + `WithMinimumMajorMinor("2.0")` in `build.cake`. Test: `dotnet cake` prints the same version as the + `.nupkg` file name. +- [x] 5. `feat(packages): enable package validation against 1.1.0`: `EnablePackageValidation`, + `PackageValidationBaselineVersion=1.1.0`, and a generated `CompatibilitySuppressions.xml` with only + PKV006 for `net6.0` and `netstandard2.0`. Test: pack fails before the suppression file (red) and + passes with it (green). +- [x] 6. `ci: update GitHub Actions for .NET 10`: `ci.yaml` and `publish.yaml` as the reference: + `actions/checkout@v6`, `actions/cache@v5`, `actions/setup-dotnet@v5` reading `global.json` in + every job (later plus .NET 8.0.x for the net8.0 tests, from review). Triggers stay as they are; no Docker steps. Test: PR checks green on all three OSes. +- [x] 7. `docs: update docs for .NET 10`: README supported frameworks (net8.0, net10.0; 1.x stays + available for `netstandard2.0` and `net6.0`), AGENTS.md (central package management, xUnit v3), + this plan's status. The README badge moves to 2.0.0 after the release, as a `docs(readme)` commit. + +## Verification + +- [x] `dotnet build src/Appy.Parsing.slnx -c Release -warnaserror`: 0 warnings, 0 errors. +- [x] `dotnet test src/Appy.Parsing.slnx`: 14 passed on net10.0 and 14 on net8.0 (4 facts, 10 theory cases). +- [x] `dotnet cake` (Default target) is green, and `.artifacts/Appy.Parsing.2.0.0-preview.0.N.nupkg` + holds `lib/net8.0` and `lib/net10.0` only. +- [x] Package validation runs on pack; the suppression file lists only the two PKV006 entries. +- [x] No `net6.0`, `net9.0` or `netstandard2.0` left outside the suppression file and the docs that + explain the change. +- [x] No `.cs` change under `src/Appy.Parsing/`, so the public API is unchanged. +- [x] Nothing is published or tagged from a local machine. +- [ ] Done when: the PR is merged, a maintainer tags `2.0.0`, the publish workflow is green, and + nuget.org lists Appy.Parsing 2.0.0 for net8.0 and net10.0. Merging also publishes a + `2.0.0-preview.0.N` package first; that is expected. + +## Key Files + +``` +global.json # SDK 10 +nuget.config # (new) nuget.org as the only package source +src/Directory.Build.props # package metadata +src/Directory.Build.targets # MinVer and package validation settings +src/Directory.Packages.props # (new) central package versions +src/Appy.Parsing.slnx # (new) solution file (SDK 10 format) +src/Appy.Parsing/Appy.Parsing.csproj # library TFMs +src/Appy.Parsing/CompatibilitySuppressions.xml # (new) PKV006 for dropped TFMs +src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj # test TFM, xUnit v3 +build.cake, dotnet-tools.json # Cake 6, MinVer +.github/workflows/ci.yaml, publish.yaml # action versions, SDK setup +README.md, AGENTS.md # supported frameworks, conventions +``` diff --git a/dotnet-tools.json b/dotnet-tools.json index d3de183..507eff5 100644 --- a/dotnet-tools.json +++ b/dotnet-tools.json @@ -3,19 +3,19 @@ "isRoot": true, "tools": { "cake.tool": { - "version": "2.2.0", + "version": "6.3.0", "commands": [ "dotnet-cake" ] }, "minver-cli": { - "version": "4.1.0", + "version": "2.3.0", "commands": [ "minver" ] }, "gpr": { - "version": "0.1.281", + "version": "0.1.294", "commands": [ "gpr" ] diff --git a/global.json b/global.json index 264dc52..d92a294 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,6 @@ { - "projects": [ "src" ], "sdk": { - "version": "6.0.300", - "rollForward": "latestPatch" + "version": "10.0.103", + "rollForward": "latestFeature" } } \ No newline at end of file diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..4d736c1 --- /dev/null +++ b/nuget.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj b/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj index 4fbaf93..2359d81 100644 --- a/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj +++ b/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj @@ -1,23 +1,21 @@  - net6.0 + net10.0;net8.0 + Exe false - latest - - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + diff --git a/src/Appy.Parsing.Tests/LexerTests.cs b/src/Appy.Parsing.Tests/LexerTests.cs index 45b51da..1dbfc77 100644 --- a/src/Appy.Parsing.Tests/LexerTests.cs +++ b/src/Appy.Parsing.Tests/LexerTests.cs @@ -24,6 +24,6 @@ public LexerTests() => [Fact] public void ParsesTokens() => _subject.Tokenize("9 * 6 / 3 - 2") - .Should().BeEquivalentTo(9, new MultiToken(), 6, new DivideToken(), 3, new MinusToken(), 2); + .Should().BeEquivalentTo(new object[] { 9, new MultiToken(), 6, new DivideToken(), 3, new MinusToken(), 2 }); } } \ No newline at end of file diff --git a/src/Appy.Parsing.sln b/src/Appy.Parsing.sln deleted file mode 100644 index 3dc768f..0000000 --- a/src/Appy.Parsing.sln +++ /dev/null @@ -1,39 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2002 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Parsing", "Appy.Parsing\Appy.Parsing.csproj", "{65291E12-5AE8-4AC6-A28F-F84D0C182B62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Appy.Parsing.Tests", "Appy.Parsing.Tests\Appy.Parsing.Tests.csproj", "{D536A6AE-BF06-4BD8-860F-0E4A3AD73004}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{FB7DCD2D-E9C1-4773-8B80-BEFF8883A09B}" - ProjectSection(SolutionItems) = preProject - ..\build.cake = ..\build.cake - ..\config.yml = ..\config.yml - ..\functions.cake = ..\functions.cake - ..\global.json = ..\global.json - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Release|Any CPU.Build.0 = Release|Any CPU - {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {4CA5C51B-B78E-4847-80FD-01A8A26EBAC7} - EndGlobalSection -EndGlobal diff --git a/src/Appy.Parsing.slnx b/src/Appy.Parsing.slnx new file mode 100644 index 0000000..26ca993 --- /dev/null +++ b/src/Appy.Parsing.slnx @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/Appy.Parsing/Appy.Parsing.csproj b/src/Appy.Parsing/Appy.Parsing.csproj index f232fa6..ac92565 100644 --- a/src/Appy.Parsing/Appy.Parsing.csproj +++ b/src/Appy.Parsing/Appy.Parsing.csproj @@ -1,26 +1,12 @@  - net6.0;netstandard2.0 + net10.0;net8.0 Library - latest - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - 3.0.0 - False - - \ No newline at end of file diff --git a/src/Appy.Parsing/CompatibilitySuppressions.xml b/src/Appy.Parsing/CompatibilitySuppressions.xml new file mode 100644 index 0000000..2b52f50 --- /dev/null +++ b/src/Appy.Parsing/CompatibilitySuppressions.xml @@ -0,0 +1,12 @@ + + + + + PKV006 + .NETStandard,Version=v2.0 + + + PKV006 + net6.0 + + \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 3bf5c94..cba6c58 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -24,7 +24,7 @@ https://github.com/YellowLineParking/Appy.Parsing MIT https://github.com/YellowLineParking/Appy.Parsing/releases - NET6;NETCore + NET10;NET8;parsing;lexer @@ -38,26 +38,7 @@ - - + - - 1.0.0-alpha.160 - 1.2.1 - 2.4.18 - - - - 0.1.0 - 17.0.0 - 5.10.3 - 4.14.6 - 2.4.1 - 2.4.3 - 1.3.0 - 2.1.26 - 1.1.2 - - diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 4b6ff93..d3d5eaf 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,6 +1,16 @@ + + true + 1.1.0 + + + + + + 2.0 preview normal diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props new file mode 100644 index 0000000..14b5a69 --- /dev/null +++ b/src/Directory.Packages.props @@ -0,0 +1,14 @@ + + + true + + + + + + + + + + +