次のような式を解析したい
- 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と、テストがハングします。再帰の問題によるものだと思います。
しかし、何が問題で、どうすれば解決できるのでしょうか?