2015-07-30 3 views
0

Я пытаюсь сделать парсер, используя Sprache Я использую F #. Все примеры, которые я когда-либо видел для библиотеки, используют синтаксис запроса Linq. Я попытался перевести linq в f #, используя выражение вычисления запроса, но там я потерялся.как перевести запрос linq на вызовы метода

Вот образец, который я использовал.

[TestClass] 
public class tests 
{ 
    [TestMethod] 
    public void test() 
    { 
     var input = "\"this is text\""; 
     var content = Class1.Quoted.Parse(input); 
     Assert.AreEqual("this is text", content); 
    } 
} 
public class Class1 
{ 
    public static readonly Parser<string> Quoted = 
     (from open in Parse.Char('"') 
     from content in Parse.CharExcept('"').Many().Text() 
     from close in Parse.Char('"') 
     select content); 

    public static readonly Parser<string> Quoted2 = 
     Parse.Char('"').SelectMany(open => 
     Parse.CharExcept('"').Many().Text(),()) 
} 

Очевидный способ сделать это, чтобы просто перевести LINQ вниз на вызовы методов, но я не знаю, как сделать это. Я попытался взглянуть на ILSpy, но это немного смутило меня.

Как выглядит запрос Linq как прямой вызов метода?

+0

@Jashaszun сделаю. Я не эксперт, но я компетентен. То, что я не знаю, как это сделать, - это перевести запрос linq в вызовы методов. Я также не знаю, как перевести запрос linq в предмет запроса F #. Вот что я задаю в этом вопросе. – phil

+0

@phil Это имеет смысл. Извините, я кажусь оскорбительным. – Jashaszun

+0

@ FrédéricHamidi правда. Я редактировал вопрос в конце. Это лучше? – phil

ответ

0

Переводя ваш пример

(from open in Parse.Char('"') 
from content in Parse.CharExcept('"').Many().Text() 
from close in Parse.Char('"') 
select content); 

дает

(Parse.Char('"') 
.SelectMany(open => Parse.CharExcept('"').Many().Text(), (open, content) => new {open, content}) 
.SelectMany(@t => Parse.Char('"'), (@t, close) => @t.content)); 

NB: Переход к подходу, более идиоматические к F # может быть сложно, потому что вычисления выражения, кажется, не имеют эквивалента перегрузки SelectMany, чтобы синтаксис C# LINQ был предварительно скомпилирован (и это обеспечивает Sprache).