Дерево унарных операторов - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу разобрать выражения типа

  • a
  • ++ a
  • a ++
  • ++ a ++
  • ++ a ++++

Оператор предварительного увеличения имеет приоритет над оператором постинкремента.

У меня есть следующие анализаторы:

public static readonly TokenListParser<LangToken, UnaryOperator> Increment = Token.EqualTo(LangToken.DoublePlus).Select(x => UnaryOperators.Increment);
public static readonly TokenListParser<LangToken, UnaryOperator> Decrement = Token.EqualTo(LangToken.DoubleMinus).Select(x => UnaryOperators.Decrement);

public static readonly TokenListParser<LangToken, Expression> Identifier = Token.EqualTo(LangToken.Identifier).Select(x => (Expression)new Id(x.ToStringValue()));

public static readonly TokenListParser<LangToken, Expression> A =
    from c in Parse.Ref(() => Expression)
    from op in Increment.Or(Decrement)
    select (Expression)new OpNode(op, c);

public static readonly TokenListParser<LangToken, Expression> B =
    from op in Increment.Or(Decrement)
    from c in Parse.Ref(() => Expression)
    select (Expression)new OpNode(op, c);

public static readonly TokenListParser<LangToken, Expression> Expression = A.Or(B).Or(Identifier);

Однако,когда я анализирую простое выражение типа "a ++" с помощью синтаксического анализатора Expression, тест зависает.Я предполагаю, что это связано с проблемой рекурсии.

Но в чем проблема и как ее решить?

...