Как заставить компилятор работать с .nitra-файлами
От: STDray http://stdray.livejournal.com
Дата: 27.10.14 17:46
Оценка:
Написал простой код.

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");
    }
  }
}


Как быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.