Дерево унарных операторов
Я хочу разобрать выражения как
- ++
- 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
парсер, тест зависает. Я полагаю, что это связано с проблемой рекурсии.
Но в чем проблема и как ее решить?
Спасибо!