public static GroupExpression Parse(ExpressionWalker ew, ExpressionToken left, ExpressionToken right) { ew.IsCurrentOrThrow(left); ew.NextOrThrow(); if (ew.Current.Token == right) { throw new UnexpectedTokenException($"Expected an expression, found end of group of type {right}"); } var expr = ParseExpression(ew, typeof(GroupExpression)); var grp = new GroupExpression() { _matchLeft = AttributeExtensions.GetAttribute <ExpressionTokenAttribute>(left).Emit.AsResult(), _matchRight = AttributeExtensions.GetAttribute <ExpressionTokenAttribute>(right).Emit.AsResult() }; if (ew.IsCurrent(ExpressionToken.Or)) { grp.InnerExpression = TernaryExpression.Parse(ew, expr); } else { grp.InnerExpression = expr; } ew.IsCurrentOrThrow(right); ew.Next(); return(grp); }
public static List <TokenMatch> Tokenize(string codeStr, params ExpressionToken[] exceptFor) { var code = new StringBuilder(codeStr); var allTokens = new List <(string Regex, ExpressionToken Token, List <ExpressionToken> Swallows, int Order)>( Enum.GetValues(typeof(ExpressionToken)).Cast <ExpressionToken>() .Where(t => AttributeExtensions.GetAttribute <ManuallySearchedAttribute>(t) == null) .Select(t => { List <ExpressionToken> DetermineSwallows(ExpressionToken tkn, List <ExpressionToken> @return) { @return = @return ?? new List <ExpressionToken>(); List <ExpressionToken> swlws = tkn.GetAttributes <SwallowsAttribute>().SelectMany(sw => sw.Targets).Distinct().ToList(); foreach (var set in swlws) { @return.Add(set); return(DetermineSwallows(set, @return)); } return(@return); } var attr = AttributeExtensions.GetAttribute <ExpressionTokenAttribute>(t); if (attr == null) { return(default);
static ReferenceIdentity() { _literalRegex = AttributeExtensions.GetAttribute <ExpressionTokenAttribute>(ExpressionToken.Literal).Regex; }