| File: Expressions\Cpp2\Cpp2StyleEvaluatorDefinition.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Core\Microsoft.TemplateEngine.Core.csproj (Microsoft.TemplateEngine.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Concurrent; using System.Text; using Microsoft.TemplateEngine.Core.Contracts; using Microsoft.TemplateEngine.Core.Expressions.Shared; using Microsoft.TemplateEngine.Core.Util; namespace Microsoft.TemplateEngine.Core.Expressions.Cpp2 { public class Cpp2StyleEvaluatorDefinition : SharedEvaluatorDefinition<Cpp2StyleEvaluatorDefinition, Cpp2StyleEvaluatorDefinition.Tokens> { private static readonly ConcurrentDictionary<Encoding, ITokenTrie> TokenCache = new(); public enum Tokens { And = 0, Or = 1, Not = 2, GreaterThan = 3, GreaterThanOrEqualTo = 4, LessThan = 5, LessThanOrEqualTo = 6, EqualTo = 7, NotEqualTo = 8, OpenBrace = 9, CloseBrace = 10, Space = 11, Tab = 12, WindowsEOL = 13, UnixEOL = 14, LegacyMacEOL = 15, Quote = 16, LeftShift = 17, RightShift = 18, Add = 19, Subtract = 20, Multiply = 21, Divide = 22, BitwiseAnd = 23, BitwiseOr = 24, SingleQuote = 25, DoubleQuote = 26, Literal = 27 } protected override bool DereferenceInLiterals => false; protected override string NullTokenValue => "null"; protected override IOperatorMap<Operators, Tokens> GenerateMap() => new OperatorSetBuilder<Tokens>(CppStyleConverters.Encode, CppStyleConverters.Decode) .And(Tokens.And) .Or(Tokens.Or) .Not(Tokens.Not) .GreaterThan(Tokens.GreaterThan, evaluate: (x, y) => Compare(x, y) > 0) .GreaterThanOrEqualTo(Tokens.GreaterThanOrEqualTo, evaluate: (x, y) => Compare(x, y) >= 0) .LessThan(Tokens.LessThan, evaluate: (x, y) => Compare(x, y) < 0) .LessThanOrEqualTo(Tokens.LessThanOrEqualTo, evaluate: (x, y) => Compare(x, y) <= 0) .EqualTo(Tokens.EqualTo, evaluate: (x, y) => Compare(x, y) == 0) .NotEqualTo(Tokens.NotEqualTo, evaluate: (x, y) => Compare(x, y) != 0) .Ignore(Tokens.Space, Tokens.Tab) .LiteralBoundsMarkers(Tokens.Quote) .OpenGroup(Tokens.OpenBrace) .CloseGroup(Tokens.CloseBrace) .TerminateWith(Tokens.WindowsEOL, Tokens.UnixEOL, Tokens.LegacyMacEOL) .LeftShift(Tokens.LeftShift) .RightShift(Tokens.RightShift) .Add(Tokens.Add) .Subtract(Tokens.Subtract) .Multiply(Tokens.Multiply) .Divide(Tokens.Divide) .BitwiseAnd(Tokens.BitwiseAnd) .BitwiseOr(Tokens.BitwiseOr) .Literal(Tokens.Literal) .LiteralBoundsMarkers(Tokens.SingleQuote, Tokens.DoubleQuote) .TypeConverter<Cpp2StyleEvaluatorDefinition>(CppStyleConverters.ConfigureConverters); protected override ITokenTrie GetSymbols(IProcessorState processor) { if (!TokenCache.TryGetValue(processor.Encoding, out ITokenTrie tokens)) { TokenTrie trie = new(); // Logic trie.AddToken(processor.Encoding.GetBytes("&&")); trie.AddToken(processor.Encoding.GetBytes("||")); trie.AddToken(processor.Encoding.GetBytes("!")); trie.AddToken(processor.Encoding.GetBytes(">")); trie.AddToken(processor.Encoding.GetBytes(">=")); trie.AddToken(processor.Encoding.GetBytes("<")); trie.AddToken(processor.Encoding.GetBytes("<=")); trie.AddToken(processor.Encoding.GetBytes("==")); trie.AddToken(processor.Encoding.GetBytes("!=")); // Braces trie.AddToken(processor.Encoding.GetBytes("(")); trie.AddToken(processor.Encoding.GetBytes(")")); // Whitespace trie.AddToken(processor.Encoding.GetBytes(" ")); trie.AddToken(processor.Encoding.GetBytes("\t")); // EOLs trie.AddToken(processor.Encoding.GetBytes("\r\n")); trie.AddToken(processor.Encoding.GetBytes("\n")); trie.AddToken(processor.Encoding.GetBytes("\r")); // quotes trie.AddToken(processor.Encoding.GetBytes("'")); // Shifts trie.AddToken(processor.Encoding.GetBytes("<<")); trie.AddToken(processor.Encoding.GetBytes(">>")); // Math operators trie.AddToken(processor.Encoding.GetBytes("+")); trie.AddToken(processor.Encoding.GetBytes("-")); trie.AddToken(processor.Encoding.GetBytes("*")); trie.AddToken(processor.Encoding.GetBytes("/")); // Bitwise operators trie.AddToken(processor.Encoding.GetBytes("&")); trie.AddToken(processor.Encoding.GetBytes("|")); // quotes trie.AddToken(processor.Encoding.GetBytes("'")); trie.AddToken(processor.Encoding.GetBytes("\"")); TokenCache[processor.Encoding] = tokens = trie; } return tokens; } } }