от
Я продолжаю думать, что понимаю синтаксический анализ Sprache, чем больше я его использую, но потом я сталкиваюсь с новым синтаксисом, который сбивает меня с толку, и примеров в Интернете не так много. В настоящее время я пытаюсь разрешить моей строке иметь условный синтаксис (такой как C #), такой как:
(A > B ? A : B)
A 2 > 7 ? (A   2) : 

У меня штатные операторы работают нормально (>,

private Parser Operator(string op, ExpressionType opType)
        => Parse.String(op).Token().Return(opType);
Но, конечно, все регулярные операторы используют одну строку (например: "
{Expression} ? {Expression} : {Expression}
Итак, я попытался объединить Parser ExpressionType следующим образом, но, конечно, я не могу понять синтаксис совершенно правильно:
Parser Conditional = Parse.Ref(() => Expr)
                  .String("?")
                  .Parse.Ref(() => Expr)
                  .String(":")
                  .Parse.Ref(() => Expr)
                  .Token().Return(ExpressionType.Conditional);
И затем, как только я это выясню, передам ли я это Условие в метод Parse.ChainOperator вместе с другими операторами? Ни один из других операторов не ссылается на выражения по обе стороны от их определения, поэтому я думаю, что нет. Я также попытался создать отдельное выражение Parser, подобное этому (но я не думаю, что это будет работать таким образом, чтобы позволить условному синтаксису появляться в любом месте строки (а не только как выражение верхнего уровня, единственное в своем роде) :
    Conditional = from test in Expr
                  from q in Parse.String("?")
                  from ifTrue in Expr
                  from c in Parse.String(":")
                  from ifFalse in Expr
                  select (Expression)Expression.Condition(test, ifTrue, ifFalse, typeof(RawResult));
Все это указывает на то, что оператор Conditional является особенным во многих отношениях. Предложения приветствуются. Спасибо за любой вклад, который вы можете предоставить.              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.
...