Написал простой код.
using Nemerle.Collections;
using Nemerle.Extensions;
using Nemerle.Compiler;
using System;
module Program
{
Main() : void
{
def options = CompilationOptions() <-
{
ColorMessages = false;
ReferencedLibraries = [ "Nitra.Runtime.dll", "Nitra.Core.dll", "Nitra.Compiler.dll" ];
LibraryPaths = [ @"C:\Program Files (x86)\JetBrains\Nitra\" ];
OutputPath = "";
OutputFileName = "Calc.exe";
Sources = [FileSource("Calc.nitra", false, false), FileSource("Program.n", false, false) ];
DisableExternalParsers = false;
DoNotLoadMacros = false;
IgnoreConfusion = true;
ColorMessages = false;
CompileToMemory = true;
};
Compiler(options).Run();
}
}
class Compiler : ManagerClass
{
public this(options : CompilationOptions)
{
base(options);
InitOutput(Console.Out);
InitCompiler();
LoadExternalLibraries();
}
}
валит ошибку
Calc.nitra:1:1:1:1: error: can't parse file with extension 'nitra', parser not registered
Пытаюсь тогда руками зарегистировать плугин
public this(options : CompilationOptions)
{
base(options);
InitOutput(Console.Out);
InitCompiler();
LoadExternalLibraries();
LibrariesManager.LoadPluginsFrom("Nitra.Compiler.dll", loadMacros = true, loadParsers = true);
}
В коллекции парсеров (DispatchingFileParser) парсер Нитры появляется, но компиляция все равно не проходит:
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:12:30:12:33: error: Unbound name 'Any'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:12:18:12:18: hint: Declare whitespace handling rule 's' or import 'Whitespaces' syntax module from Nitra.Core library.
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:17:16:17:27: error: Unbound name 'IgnoreToken'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:19:18:19:25: error: Unbound name 'Comment'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:19:48:19:65: error: Unbound name 'SingleLineComment'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:20:18:20:25: error: Unbound name 'Comment'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:20:28:20:44: error: Unbound name 'MultiLineComment'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:34:27:34:29: error: Unbound name 'sm'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:34:34:34:36: error: Unbound name 'sm'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:38:27:38:29: error: Unbound name 'sm'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:38:34:38:36: error: Unbound name 'sm'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:42:27:42:29: error: Unbound name 'sm'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:42:34:42:36: error: Unbound name 'sm'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:46:27:46:29: error: Unbound name 'sm'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:46:34:46:36: error: Unbound name 'sm'
Calc.nitra:1:1:1:1: error: Unbound name 's'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:50:27:50:29: error: Unbound name 'sm'
C:\Projects\NitraSample\NitraSample\bin\Debug\Calc.nitra:50:34:50:36: error: Unbound name 'sm'
Calc.nitra:1:1:1:1: error: Unbound name 's'
Calc.nitra:1:1:1:1: error: Unbound name 's'
Calc.nitra:1:1:1:1: error: Unbound name 's'
Calc.nitra:1:1:1:1: error: Unbound name 's'
Исходный код файлов для компиляции взят SampleParserApplication. На всякий случай приведу его:
| Calc.nitra |
| syntax module Calc
{
using PrettyPrint;
using Outline;
using TokenNames;
using StandardSpanClasses;
using Whitespaces;
using Identifiers;
using CStyleComments;
[StartRule]
syntax Start = Expression !Any
{
Value() : double = Expression.Value();
}
extend token IgnoreToken
{
| [SpanClass(Comment)] SingleLineComment = SingleLineComment;
| [SpanClass(Comment)] MultiLineComment;
}
regex Number = ['0'..'9']+ ('.' ['0'..'9']*)?;
syntax Expression
{
Value() : double;
missing Value = double.NaN;
| Number
{
override Value = double.Parse(GetText(this.Number));
}
| Add = Expression sm '+' sm Expression precedence 10
{
override Value = Expression1.Value() + Expression2.Value();
}
| Sub = Expression sm '-' sm Expression precedence 10
{
override Value = Expression1.Value() - Expression2.Value();
}
| Mul = Expression sm '*' sm Expression precedence 20
{
override Value = Expression1.Value() * Expression2.Value();
}
| Div = Expression sm '/' sm Expression precedence 20
{
override Value = Expression1.Value() / Expression2.Value();
}
| Pow = Expression sm '^' sm Expression precedence 30 right-associative
{
override Value = System.Math.Pow(Expression1.Value(), Expression2.Value());
}
| Neg = '-' Expression precedence 100
{
override Value = -Expression.Value();
}
| Plus = '+' Expression precedence 100
{
override Value = Expression.Value();
}
| Rounds = '(' Expression ')'
{
override Value = Expression.Value();
}
}
}
|
| |
| Program.n |
| using Nitra;
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;
using Nemerle.Imperative;
using System;
using System.Collections.Generic;
using System.Console;
using System.Linq;
module Program
{
Main() : void
{
def parserHost = ParserHost();
for (;;)
{
Write("input>");
def input = ReadLine();
when (string.IsNullOrWhiteSpace(input))
break;
def source = SingleLineSourceSnapshot(input);
def parseResult = Calc.Start(source, parserHost);
def ast = CalcAst.Start.Create(parseResult);
WriteLine($"Pretty print: $ast");
unless (parseResult.IsSuccess)
foreach(error in parseResult.GetErrors())
{
def (line, col) = error.Location.StartLineColumn;
WriteLine($<#$line:$col: $(error.Message)#>);
}
def result = ast.Value();
WriteLine($"Result: $result");
}
}
}
|
| |
Как быть?