Advertisement
Guest User

Untitled

a guest
Oct 21st, 2014
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.64 KB | None | 0 0
  1. %%{
  2.   machine FQL;
  3.  
  4.   action markStart{
  5.     tokenStartPos = p;
  6.   }
  7.  
  8.   action OnParseError{
  9.     throw new ParseErrorException("Parse error at index:" + p);
  10.   }
  11.  
  12.   action OnPropertyEnd{
  13.     currentOperatorPropertyName = data.Substring(tokenStartPos, p-tokenStartPos);
  14.     //var bop = currentOperator as BinaryOperator;
  15.     //if(bop!=null) bop.LeftOperand = new OperandProperty(token);
  16.     //else ((InOperator)currentOperator).LeftOperand = new OperandProperty(token);
  17.   }
  18.  
  19.   action OnOperatorEnd{
  20.   //OnOperatorEnd
  21.     if(rv==null) rv = currentOperator;
  22.     else ((BinaryOperator)rv).RightOperand = currentOperator;
  23.     currentOperator = null;
  24.   }
  25.  
  26.   action OnInOperandFloatEnd{
  27.     string token = data.Substring(tokenStartPos, p-tokenStartPos-1);
  28.     ((InOperator)currentOperator).Operands.Add(new OperandValue(float.Parse(token, CultureInfo.InvariantCulture)));
  29.   }
  30.   action OnInOperandDecimalEnd{
  31.     string token = data.Substring(tokenStartPos, p-tokenStartPos-1);
  32.     ((InOperator)currentOperator).Operands.Add(new OperandValue(decimal.Parse(token, CultureInfo.InvariantCulture)));
  33.   }
  34.   action OnInOperandDoubleEnd{
  35.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  36.     ((InOperator)currentOperator).Operands.Add(new OperandValue(double.Parse(token, CultureInfo.InvariantCulture)));
  37.   }
  38.   action OnInOperandNumberEnd{
  39.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  40.     ((InOperator)currentOperator).Operands.Add(new OperandValue(int.Parse(token, CultureInfo.InvariantCulture)));
  41.   }  
  42.   action OnInOperandQStringEnd{
  43.     string token = data.Substring(tokenStartPos+1, p-tokenStartPos-2);
  44.     ((InOperator)currentOperator).Operands.Add(new OperandValue(token));
  45.   }
  46.   action OnInOperandDateTimeEnd{
  47.     string token = data.Substring(tokenStartPos+1, p-tokenStartPos-2);
  48.     ((InOperator)currentOperator).Operands.Add(new OperandValue(DateTime.ParseExact(token, "o", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)));
  49.   }
  50.   action OnInOperandGuidEnd{
  51.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  52.     ((InOperator)currentOperator).Operands.Add(new OperandValue(Guid.ParseExact(token, "B")));
  53.   }  
  54.  
  55.   action OnInQueryStart{
  56.     var opIn = new InOperator();
  57.     opIn.LeftOperand = new OperandProperty(currentOperatorPropertyName);
  58.     currentOperator = opIn;
  59.   }
  60.  
  61.  
  62.   action OnBinaryQueryStart{
  63.     var opBinary = new BinaryOperator();
  64.     opBinary.LeftOperand = new OperandProperty(currentOperatorPropertyName);
  65.     currentOperator = opBinary;
  66.   }
  67.  
  68.   action OnBinaryOperatorAndEnd{
  69.     rv = new BinaryOperator(rv, null, BinaryOperatorType.And);
  70.     currentOperator = null;
  71.   }
  72.  
  73.   action OnBinaryOperatorEqualEnd{
  74.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.Equal;
  75.   }
  76.   action OnBinaryOperatorNotEqualEnd{
  77.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.NotEqual;
  78.   }
  79.   action OnBinaryOperatorLessOrEqualEnd{
  80.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.LessOrEqual;
  81.   }  
  82.   action OnBinaryOperatorGreaterOrEqualEnd{
  83.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.GreaterOrEqual;
  84.   }
  85.   action OnBinaryOperatorLessEnd{
  86.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.Less;
  87.   }
  88.   action OnBinaryOperatorGreaterEnd{
  89.     ((BinaryOperator)currentOperator).OperatorType = BinaryOperatorType.Greater;
  90.   }
  91.  
  92.   action OnBinaryOperandFloatEnd{
  93.     string token = data.Substring(tokenStartPos, p-tokenStartPos-1);
  94.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(float.Parse(token, CultureInfo.InvariantCulture));
  95.   }
  96.   action OnBinaryOperandDecimalEnd{
  97.     string token = data.Substring(tokenStartPos, p-tokenStartPos-1);
  98.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(decimal.Parse(token, CultureInfo.InvariantCulture));
  99.   }
  100.   action OnBinaryOperandDoubleEnd{
  101.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  102.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(double.Parse(token, CultureInfo.InvariantCulture));
  103.   }
  104.   action OnBinaryOperandNumberEnd{
  105.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  106.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(int.Parse(token, CultureInfo.InvariantCulture));
  107.   }  
  108.   action OnBinaryOperandQStringEnd{
  109.     string token = data.Substring(tokenStartPos+1, p-tokenStartPos-2);
  110.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(token);
  111.   }
  112.   action OnBinaryOperandDateTimeEnd{
  113.     string token = data.Substring(tokenStartPos+1, p-tokenStartPos-2);
  114.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(DateTime.ParseExact(token, "o", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal));
  115.   }
  116.   action OnBinaryOperandGuidEnd{
  117.     string token = data.Substring(tokenStartPos, p-tokenStartPos);
  118.     ((BinaryOperator)currentOperator).RightOperand = new OperandValue(Guid.ParseExact(token, "B"));
  119.   }
  120.  
  121.  
  122.   IDENTIFIER = [a-zA-Z0-9_]+;
  123.   K_AND = "and"i;
  124.   K_IN = "in"i;
  125.   EQ = "=";
  126.   NOT_EQ = "!=";
  127.   LESS_OR_EQUAL = "<=";
  128.   GREATER_OR_EQUAL = ">=";
  129.   LESS = "<";
  130.   GREATER = ">";
  131.   F = "f"i;
  132.   M = "m"i;
  133.   NUMBER = ( "+" | "-" )? digit+;
  134.   FLOAT_NUMBER = ( "+" | "-" )? digit+ "." digit+ F;
  135.   DOUBLE_NUMBER= ( "+" | "-" )? digit+ "." digit+;
  136.   DECIMAL_NUMBER=( "+" | "-" )? digit+ "." digit+ M;
  137.   DQSTRING = "\"" [^"\""]* "\"";
  138.   QSTRING = "\'" [^"\'"]* "\'";
  139.  
  140.   DIGIT4 = digit{4};
  141.   DIGIT2 = digit{2};
  142.   DIGIT7 = digit{7};
  143.   DATETIME = "#" DIGIT4 "-" DIGIT2 "-" DIGIT2 "T" DIGIT2 ":" DIGIT2 ":" DIGIT2 "." DIGIT7 ("Z" | (("+"|"-") DIGIT2 ":" DIGIT2)) "#";
  144.  
  145.   HEXDIG8 = xdigit{8};
  146.   HEXDIG4 = xdigit{4};
  147.   HEXDIG12 = xdigit{12};
  148.   GUID = "{" HEXDIG8 "-" HEXDIG4 "-" HEXDIG4 "-" HEXDIG4 "-" HEXDIG12 "}";
  149.  
  150.   binary_queryProperty = (IDENTIFIER) >markStart %OnPropertyEnd;
  151.   binary_queryOperator = (
  152.                              EQ                 %OnBinaryQueryStart %OnBinaryOperatorEqualEnd
  153.                             |NOT_EQ             %OnBinaryQueryStart %OnBinaryOperatorNotEqualEnd
  154.                             |LESS_OR_EQUAL      %OnBinaryQueryStart %OnBinaryOperatorLessOrEqualEnd
  155.                             |GREATER_OR_EQUAL   %OnBinaryQueryStart %OnBinaryOperatorGreaterOrEqualEnd
  156.                             |LESS               %OnBinaryQueryStart %OnBinaryOperatorLessEnd
  157.                             |GREATER            %OnBinaryQueryStart %OnBinaryOperatorGreaterEnd
  158.                         )  >markStart;
  159.   binary_queryOperand = (
  160.                              FLOAT_NUMBER       %OnBinaryOperandFloatEnd
  161.                             |DECIMAL_NUMBER     %OnBinaryOperandDecimalEnd
  162.                             |DOUBLE_NUMBER      %OnBinaryOperandDoubleEnd
  163.                             |NUMBER             %OnBinaryOperandNumberEnd
  164.                             |DQSTRING           %OnBinaryOperandQStringEnd
  165.                             |QSTRING            %OnBinaryOperandQStringEnd
  166.                             |DATETIME           %OnBinaryOperandDateTimeEnd
  167.                             |GUID               %OnBinaryOperandGuidEnd
  168.                         )  >markStart;
  169.  
  170.   binary_query = (binary_queryProperty space* binary_queryOperator space* binary_queryOperand) %OnOperatorEnd;
  171.  
  172.   in_queryProperty = (IDENTIFIER)  >markStart %OnPropertyEnd;
  173.   in_queryOperator = (
  174.                         K_IN    %OnInQueryStart
  175.                      );
  176.   in_queryOperand = (
  177.                              FLOAT_NUMBER       %OnInOperandFloatEnd
  178.                             |DECIMAL_NUMBER     %OnInOperandDecimalEnd
  179.                             |DOUBLE_NUMBER      %OnInOperandDoubleEnd
  180.                             |NUMBER             %OnInOperandNumberEnd
  181.                             |DQSTRING           %OnInOperandQStringEnd
  182.                             |QSTRING            %OnInOperandQStringEnd
  183.                             |DATETIME           %OnInOperandDateTimeEnd
  184.                             |GUID               %OnInOperandGuidEnd
  185.                     )   >markStart;
  186.  
  187.   in_query = (in_queryProperty space+ in_queryOperator space* "(" space* in_queryOperand (space* "," space* in_queryOperand)* ")") %OnOperatorEnd;
  188.  
  189.   query =  binary_query | in_query;
  190.  
  191.   main := (query? (space+ (K_AND %OnBinaryOperatorAndEnd) space+ query)*) $err(OnParseError);
  192. }%%
  193.  
  194. /*
  195.  
  196. THIS FILE WAS AUTOGENERATED BY Ragel (http://www.complang.org/ragel/).
  197. See lang description in: FQL.rl file
  198.  
  199. You can contact me if you have a problem: mailto:afanasiev.dmitry@gmail.com
  200.  
  201. */
  202. #pragma warning disable 162
  203. namespace Efir.DataHub.Filtering.QL
  204. {
  205.     using System;
  206.     using System.Diagnostics;
  207.     using System.Globalization;
  208.     using System.Collections.Generic;
  209.     using Efir.DataHub.Filtering;
  210.  
  211.     internal static class FQLParserStaticRagel
  212.     {
  213.         #region data
  214.         %% write data;
  215.         #endregion
  216.  
  217.         static FQLParserStaticRagel() {}
  218.  
  219.         public static CriteriaOperator Parse(string data)
  220.         {
  221.           if (string.IsNullOrEmpty(data)) return null;
  222.           try
  223.           {
  224.             int tokenStartPos = 0;
  225.             CriteriaOperator rv = null;
  226.  
  227.             CriteriaOperator currentOperator = null;
  228.             string currentOperatorPropertyName = null;
  229.  
  230.             int cs;
  231.            
  232.             int p = 0;
  233.             int pe = data.Length;
  234.             int eof = data.Length;
  235.            
  236.             #region init
  237.             %% write init;
  238.             #endregion
  239.  
  240.             #region exec
  241.             %% write exec;
  242.             #endregion
  243.            
  244.             return rv;
  245.           }
  246.           catch(ParseErrorException) {throw;}
  247.           catch(Exception ex) {throw new ParseErrorException(ex.ToString());}
  248.         }
  249.     }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement