コード例 #1
0
        FilterStringGrammar()
        {
            var propertyName = new IdentifierTerminal("propertyName");
            var compareOp    = new NonTerminal("compareOp");

            compareOp.Rule = ToTerm(QueryComparisons.Equal) | ToTerm(QueryComparisons.NotEqual)
                             | ToTerm(QueryComparisons.LessThan) | ToTerm(QueryComparisons.LessThanOrEqual)
                             | ToTerm(QueryComparisons.GreaterThan) | ToTerm(QueryComparisons.GreaterThanOrEqual);
            var stringLiteral  = new StringLiteral("stringLiteral", "'", StringOptions.AllowsDoubledQuote);
            var booleanLiteral = new ConstantTerminal("booleanLiteral");

            booleanLiteral.Add("true", true);
            booleanLiteral.Add("false", false);
            var literal = new NonTerminal("literal");

            literal.Rule    = stringLiteral | booleanLiteral;
            comparison      = new NonTerminal("comparison");
            comparison.Rule = propertyName + compareOp + literal;
            var booleanOp = new NonTerminal("booleanOp");

            booleanOp.Rule = ToTerm(TableOperators.And) | ToTerm(TableOperators.Or);
            var booleanExpr = new NonTerminal("booleanExpr");

            booleanOpExpr      = new NonTerminal("booleanOpExpr");
            booleanOpExpr.Rule = "(" + booleanExpr + ")" + booleanOp + "(" + booleanExpr + ")";
            booleanExpr.Rule   = comparison | booleanOpExpr;
            Root = booleanExpr;
        }
コード例 #2
0
        public MainGrammar() : base(false)
        {
            #region Terminals

            var lK = ToTerm("[");
            var rK = ToTerm("]");
            var lP = ToTerm("(");
            var rP = ToTerm(")");

            var equal  = ToTerm("=");
            var dollar = ToTerm("$");
            var comma  = ToTerm(",");

            var div   = ToTerm("/");
            var plus  = ToTerm("+");
            var less  = ToTerm("-");
            var times = ToTerm("*");

            #endregion Terminals

            #region SpecialTerminals
            var ids  = new IdentifierTerminal("id", "_");
            var strs = new StringLiteral("string", "\"");
            var nums = new NumberLiteral("int", NumberOptions.NoDotAfterInt, typeof(Int32));



            #endregion
        }
コード例 #3
0
        protected virtual void ConstructNameAndTypeRules()
        {
            Name = new IdentifierTerminal("Name");
            Name.StartCharCategories.AddRange(new[] {
                UnicodeCategory.UppercaseLetter,
                UnicodeCategory.LowercaseLetter,
                UnicodeCategory.TitlecaseLetter,
                UnicodeCategory.ModifierLetter,
                UnicodeCategory.OtherLetter,
                UnicodeCategory.LetterNumber
            });
            Name.CharCategories.AddRange(Name.StartCharCategories);
            Name.CharCategories.AddRange(new[] {
                UnicodeCategory.DecimalDigitNumber,
                UnicodeCategory.ConnectorPunctuation,
                UnicodeCategory.SpacingCombiningMark,
                UnicodeCategory.NonSpacingMark,
                UnicodeCategory.Format
            });

            DotSeparatedName = NonTerminalThatIsNotAstElement("DotSeparatedName", n => new CompositeName(n.ChildNodes.Select(c => c.Token.Text).ToArray()));

            TypeReference         = NonTerminalWithSpecificType("TypeReference", n => (IAstTypeReference) new AstUnknownType(n.Child(Name).Token.Text)); // WIP
            TypeReferenceListPlus = new NonTerminal("TypeReferenceListPlus");
        }
コード例 #4
0
ファイル: ExpressionGrammar.cs プロジェクト: yangbodevp/irony
        /// <summary>
        /// Initializes a new instance of the <see cref="ExpressionGrammar"/> class.
        /// </summary>
        public ExpressionGrammar() : base(false)
        {
            var number = new NumberLiteral("Number");

            number.DefaultIntTypes  = new TypeCode[] { TypeCode.Int16, TypeCode.Int32, TypeCode.Int64 };
            number.DefaultFloatType = TypeCode.Single;

            var identifier = new IdentifierTerminal("Identifier");
            var comma      = ToTerm(",");

            var BinOp   = new NonTerminal("BinaryOperator", "operator");
            var ParExpr = new NonTerminal("ParenthesisExpression");
            var BinExpr = new NonTerminal("BinaryExpression", typeof(BinaryOperationNode));
            var Expr    = new NonTerminal("Expression");
            var Term    = new NonTerminal("Term");

            var Program = new NonTerminal("Program", typeof(StatementListNode));

            Expr.Rule = Term | ParExpr | BinExpr;
            Term.Rule = number | identifier;

            ParExpr.Rule = "(" + Expr + ")";
            BinExpr.Rule = Expr + BinOp + Expr;
            BinOp.Rule   = ToTerm("+") | "-" | "*" | "/";

            RegisterOperators(10, "+", "-");
            RegisterOperators(20, "*", "/");

            MarkPunctuation("(", ")");
            RegisterBracePair("(", ")");
            MarkTransient(Expr, Term, BinOp, ParExpr);

            this.Root = Expr;
        }
コード例 #5
0
        static IdentifierTerminal createConstIdentifier()
        {
            var Id = new IdentifierTerminal("identifier");

            Id.CaseRestriction = CaseRestriction.FirstUpper;
            return(Id);
        }
コード例 #6
0
            public ExpressionGrammar()
            {
                var Number = new NumberLiteral("Number");
                var Var = new IdentifierTerminal("Var");
                var conditional_expression = new NonTerminal("conditional_expression");

                //conditional_expression.Rule = expression + PreferShiftHere() + qmark + expression + colon + expression;
                //NonTerminal DataType = new NonTerminal("DataType");

                NonTerminal DecSt = new NonTerminal("DecSt");
                DecSt.Rule = "int" + Var + "=" + Number + ";" | "int" + Var + ";";

                NonTerminal PrintSt = new NonTerminal("PrintSt");
                PrintSt.Rule = "cout <<" + Var;

                //NonTerminal IF = new NonTerminal("IF");
                //IF.Rule = "if( + ;

                NonTerminal stmt = new NonTerminal("stmt");
                stmt.Rule = PrintSt | DecSt;

                NonTerminal stmt1 = new NonTerminal("stmt");
                stmt1.Rule = "begin{" + stmt + "}end;";

                this.Root = DecSt;
            }
コード例 #7
0
        public static IdentifierTerminal CreateNounId(string name)
        {
            IdentifierTerminal id = new IdentifierTerminal(name, IdOptions.AllowsEscapes | IdOptions.CanStartWithEscape);

            id.CaseRestriction = CaseRestriction.FirstUpper;
            //id.AddPrefix(":", IdOptions.IsNotKeyword | IdOptions.NameIncludesPrefix);
            //From spec:
            //Start char is "_" or letter-character, which is a Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
            id.StartCharCategories.AddRange(new UnicodeCategory[] {
                UnicodeCategory.UppercaseLetter, //Ul
                //UnicodeCategory.LowercaseLetter, //Ll
                UnicodeCategory.TitlecaseLetter, //Lt
                UnicodeCategory.ModifierLetter,  //Lm
                UnicodeCategory.OtherLetter,     //Lo
                UnicodeCategory.LetterNumber     //Nl
            });
            //Internal chars

            /* From spec:
             * identifier-part-character: letter-character | decimal-digit-character | connecting-character |  combining-character |
             *  formatting-character
             */
            id.CharCategories.AddRange(id.StartCharCategories); //letter-character categories
            id.CharCategories.AddRange(new UnicodeCategory[] {
                UnicodeCategory.LowercaseLetter,                //Ll
                UnicodeCategory.DecimalDigitNumber,             //Nd
                UnicodeCategory.ConnectorPunctuation,           //Pc
                UnicodeCategory.SpacingCombiningMark,           //Mc
                UnicodeCategory.NonSpacingMark,                 //Mn
                UnicodeCategory.Format                          //Cf
            });
            //Chars to remove from final identifier
            id.CharsToRemoveCategories.Add(UnicodeCategory.Format);
            return(id);
        }
コード例 #8
0
ファイル: TerminalFactory.cs プロジェクト: TheByte/sones
 public static IdentifierTerminal CreateCSharpIdentifier(String name)
 {
     IdentifierTerminal id = new IdentifierTerminal(name, IdFlags.AllowsEscapes | IdFlags.CanStartWithEscape);
       id.AddPrefix("@", IdFlags.IsNotKeyword);
       //From spec:
       //Start char is "_" or letter-character, which is a Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
       id.StartCharCategories.AddRange(new UnicodeCategory[] {
      UnicodeCategory.UppercaseLetter, //Ul
      UnicodeCategory.LowercaseLetter, //Ll
      UnicodeCategory.TitlecaseLetter, //Lt
      UnicodeCategory.ModifierLetter,  //Lm
      UnicodeCategory.OtherLetter,     //Lo
      UnicodeCategory.LetterNumber     //Nl
       });
       //Internal chars
       /* From spec:
       identifier-part-character: letter-character | decimal-digit-character | connecting-character |  combining-character |
       formatting-character
     */
       id.CharCategories.AddRange(id.StartCharCategories); //letter-character categories
       id.CharCategories.AddRange(new UnicodeCategory[] {
     UnicodeCategory.DecimalDigitNumber, //Nd
     UnicodeCategory.ConnectorPunctuation, //Pc
     UnicodeCategory.SpacingCombiningMark, //Mc
     UnicodeCategory.NonSpacingMark,       //Mn
     UnicodeCategory.Format                //Cf
       });
       //Chars to remove from final identifier
       id.CharsToRemoveCategories.Add(UnicodeCategory.Format);
       return id;
 }
コード例 #9
0
ファイル: E2Grammar.cs プロジェクト: itsbth/E2Edit
        public E2Grammar()
        {
            LineTerminators = "\r\n";
            var program = new NonTerminal("Program");
            var directiveList = new NonTerminal("DirectiveList");
            var directive = new NonTerminal("Directive");
            var directiveName = new IdentifierTerminal("DirectiveName");
            var directiveBody = new NonTerminal("DirectiveBody");
            var statementList = new NonTerminal("StatementList");
            var statement = new NonTerminal("Statement");
            var assignment = new NonTerminal("Assignment");
            var expression = new NonTerminal("Expression");
            var parenExpression = new NonTerminal("ParenExpression");
            var methodCall = new NonTerminal("MethodCall");
            var argumentList = new NonTerminal("ArgumentList");
            var argumentTail = new NonTerminal("ArgumentTail");
            var @operator = new NonTerminal("Operator");
            var operation = new NonTerminal("Operation");
            var identifier = new IdentifierTerminal("Identifier");
            var @string = new StringLiteral("String", "\"");
            var number = new NumberLiteral("Number");
            var ifStatement = new NonTerminal("IfStatement");
            var whileStatement = new NonTerminal("WhileStatement");
            var comment = new CommentTerminal("comment", "#", new[] {"\n"});
            var dcom = new CommentTerminal("commentCheat", "@", new[] {"\n"});

            Root = program;

            NonGrammarTerminals.Add(comment);
            NonGrammarTerminals.Add(dcom);

            RegisterBracePair("{", "}");

            program.Rule = /* directiveList + */statementList;

            //directiveList.Rule = MakePlusRule(directiveList, null, directive);
            //directiveBody.Rule = new CommentTerminal()
            //directive.Rule = ToTerm("@") + directiveName + directiveBody;

            statementList.Rule = MakePlusRule(statementList, null, statement);
            statement.Rule = methodCall | assignment;

            expression.Rule = operation | @string | number | methodCall | identifier;

            parenExpression.Rule = ToTerm("(") + expression + ")";

            methodCall.Rule = expression + ":" + identifier + "(" + argumentList + ")";

            argumentList.Rule = MakeStarRule(argumentList, ToTerm(","), expression);

            operation.Rule = expression + @operator + expression;

            @operator.Rule = ToTerm("+") | "-" | "*" | "/" | "&" | "|";

            assignment.Rule = identifier + "=" + expression;

            ifStatement.Rule = ToTerm("if") + parenExpression + "{" + statementList + "}";

            whileStatement.Rule = ToTerm("while") + parenExpression + "{" + statementList + "}";
        }
コード例 #10
0
        public GramaticaUSQL() : base(caseSensitive: false)
        {
            #region EXPRESIONES REGULARES
            RegexBasedTerminal numero = new RegexBasedTerminal("numero", "[0-9]+");
            IdentifierTerminal id     = new IdentifierTerminal("id");
            #endregion

            #region TERMINALES
            var plus  = ToTerm("+");
            var minus = ToTerm("-");
            var mult  = ToTerm("*");
            var div   = ToTerm("/");
            #endregion

            #region NO TERMINALES
            NonTerminal S = new NonTerminal("S"),
                        E = new NonTerminal("E");
            #endregion

            #region GRAMATICA
            S.Rule = E;
            E.Rule = E + plus + E
                     | E + minus + E
                     | E + mult + E
                     | E + div + E
                     | numero
                     | id;
            #endregion

            #region PREFERENCIAS
            this.Root = S;
            #endregion
        }
コード例 #11
0
ファイル: Parser.cs プロジェクト: mirhagk/TSharp
        public TuringGrammar()
        {
            //Expr -> n | v | Expr BinOp Expr | UnOP Expr | ( Expr )
            //BinOp -> + | - | * | / | **
            //UnOp -> -
            //ExprLine -> Expr EOF

            //1. Terminals
            Terminal n = new NumberLiteral("number");
            Terminal v = new IdentifierTerminal("variable");

            //2. Non-Terminals
            NonTerminal Expr     = new NonTerminal("Expr");
            NonTerminal BinOp    = new NonTerminal("BinOp");
            NonTerminal UnOp     = new NonTerminal("UnOp");
            NonTerminal ExprLine = new NonTerminal("ExprLine");

            //3. BNF rules
            Expr.Rule     = n | v | Expr + BinOp + Expr | UnOp + Expr | "(" + Expr + ")";
            BinOp.Rule    = new ImpliedSymbolTerminal("+") | "-" | "*" | "/" | "**";
            UnOp.Rule     = "-";
            ExprLine.Rule = Expr + Eof;
            this.Root     = ExprLine;

            //4. Set operator precenednce and associativity
            RegisterOperators(1, "+", "-");
            RegisterOperators(2, "*", "/");
            RegisterOperators(3, Associativity.Right, "**");

            //5. Register Parenthesis as punctuation symbols so they will not appear in the syntax tree
            MarkPunctuation("(", ")");
        }
コード例 #12
0
        public UmbracoQueryGrammar() : base(false)
        {
            var contentTypeAlias = new IdentifierTerminal("contentType");
            var route            = new StringLiteral("route", "'");

            var number = new NumberLiteral("number");

            var query         = new NonTerminal("query");
            var limitModifier = new NonTerminal("limitModifier", typeof(LimitModifierNode));
            var orderModifier = new NonTerminal("orderModifier", typeof(OrderModifierNode));

            var contentType    = new NonTerminal("contentType");
            var content        = new NonTerminal("content", typeof(ContentNode));
            var limitedContent = new NonTerminal("limitedContent", typeof(LimitedContentNode));
            var orderedContent = new NonTerminal("orderedContent", typeof(OrderedContentNode));

            var source = new NonTerminal("source", typeof(SourceNode));

            orderedContent.Rule = orderModifier + content | orderModifier + limitedContent;
            limitedContent.Rule = limitModifier + content;

            source.Rule = "from" + route;

            content.Rule       = contentType | contentType + source;
            contentType.Rule   = contentTypeAlias;
            limitModifier.Rule = number;

            query.Rule = content | limitedContent | orderedContent;

            orderModifier.Rule = ToTerm("latest");

            Root = query;

            MarkTransient(contentType, query);
        }
コード例 #13
0
        public XmlGrammar()
            : base(false)
        {
            //Terminals
            Terminal comment = new CommentTerminal("comment", "<!--", "-->");

            NonGrammarTerminals.Add(comment);
            StringLiteral stringLiteral          = new StringLiteral("string", "\"", StringOptions.None);
            Terminal      stringContent          = new ToTerminatorTerminal("StringContent", '<');
            KeyTerm       elementOpener          = ToTerm("<");
            KeyTerm       closeElementOpener     = ToTerm("</");
            KeyTerm       elementCloser          = ToTerm(">");
            KeyTerm       openCloseElementCloser = ToTerm("/>");
            KeyTerm       equals       = ToTerm("=");
            KeyTerm       xmlDeclOpen  = ToTerm("<?");
            KeyTerm       xmlDeclClose = ToTerm("?>");

            IdentifierTerminal attributeIdentifier      = new IdentifierTerminal(AttributeIdentifier, ".", ".");
            IdentifierTerminal elementIdentifier        = new IdentifierTerminal(ElementIdentifier, ".-", ".-");
            KeyTerm            xmlDeclarationIdentifier = ToTerm("xml");

            //Non Terminals
            NonTerminal document               = new NonTerminal("document");
            NonTerminal elementStart           = new NonTerminal("ElementStart");
            NonTerminal elementEnd             = new NonTerminal("ElementEnd");
            NonTerminal openCloseElement       = new NonTerminal("OpenCloseElement");
            NonTerminal element                = new NonTerminal("Element");
            NonTerminal requiredElements       = new NonTerminal("RequiredElements");
            NonTerminal innerContent           = new NonTerminal("InnerContent");
            NonTerminal content                = new NonTerminal("Content");
            NonTerminal attribute              = new NonTerminal("Attribute");
            NonTerminal optionalAttribute      = new NonTerminal("OptionalAttribute");
            NonTerminal xmlDeclaration         = new NonTerminal("XmlDeclaration");
            NonTerminal optionalXmlDeclaration = new NonTerminal("OptionalXmlDeclaration");

            //Rules
            this.Root = document;

            innerContent.Rule = element | stringContent;
            content.Rule      = MakeStarRule(content, innerContent);

            attribute.Rule         = attributeIdentifier + equals + stringLiteral;
            optionalAttribute.Rule = MakeStarRule(optionalAttribute, attribute);

            elementStart.Rule     = elementOpener + elementIdentifier + optionalAttribute + elementCloser;
            elementEnd.Rule       = closeElementOpener + elementIdentifier + elementCloser;
            openCloseElement.Rule = elementOpener + elementIdentifier + optionalAttribute + openCloseElementCloser;

            element.Rule          = (elementStart + content + elementEnd) | openCloseElement;
            requiredElements.Rule = MakePlusRule(requiredElements, element);

            xmlDeclaration.Rule         = xmlDeclOpen + xmlDeclarationIdentifier + optionalAttribute + xmlDeclClose;
            optionalXmlDeclaration.Rule = MakeStarRule(optionalXmlDeclaration, xmlDeclaration);

            document.Rule = optionalXmlDeclaration + requiredElements;

            MarkPunctuation(elementOpener, elementCloser, closeElementOpener, openCloseElementCloser, equals, xmlDeclOpen, xmlDeclClose);
            MarkTransient(innerContent);
        }
コード例 #14
0
ファイル: KISGrammer.cs プロジェクト: Myvar/PashOS
        public KISGrammer()
        {
            var number = new NumberLiteral("number");
            var text = new StringLiteral("string", "\"");

            number.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            var identifier = new IdentifierTerminal("identifier");
            var comment = new CommentTerminal("comment", "#", "\n", "\r");
            base.NonGrammarTerminals.Add(comment);

            var Code = new NonTerminal("code");
            var Statments = new NonTerminal("statments");
            var Value = new NonTerminal("value");
            var ValueString = TerminalFactory.CreateCSharpString("valuestring");

            var SetStmt = new NonTerminal("setstmt");
            var CallStmt = new NonTerminal("callstmt");
            var FnStmt = new NonTerminal("fnstmt");

            var CallPath = new NonTerminal("callpath");
            var CallPerams = new NonTerminal("callperams");

            var fullstop = new NonTerminal("fullstop");
            var comma = new NonTerminal("comma");
            var openb = new NonTerminal("openb");
            var closeb = new NonTerminal("closeb");
            openb.Rule = "{";
            closeb.Rule = "}";
            fullstop.Rule = ".";
            comma.Rule = ",";

            CallPath.Rule = MakePlusRule(CallPath, fullstop, identifier);
            CallPerams.Rule = MakePlusRule(CallPerams, comma, Value);

            var Semicolon = ToTerm(";");

            //StateMents:
            SetStmt.Rule = identifier + "=" + Value + Semicolon;
            CallStmt.Rule = (CallPath | identifier) + "(" + (CallPerams | Empty) + ")" + Semicolon;
            FnStmt.Rule = "function" + identifier + "(" + (CallPerams | Empty) + ")";

            Statments.Rule = SetStmt | CallStmt | FnStmt | openb | closeb | Empty;

            var Exspr = new NonTerminal("exspr");
            var Operator = new NonTerminal("operator");
            var ExsprStmt = new NonTerminal("exsprstmt");

            Operator.Rule = ToTerm("/") | "*" | "-" | "+";

            ExsprStmt.Rule = Value + Operator + Value;

            Exspr.Rule = MakePlusRule(Exspr, Operator, ExsprStmt);

            Value.Rule = number | ValueString | identifier | "true" | "false" | Exspr /* | text */;
            Code.Rule = MakePlusRule(Code, NewLine, Statments);
            LanguageFlags = LanguageFlags.NewLineBeforeEOF;
            //code := Statment {statment}
            this.Root = Code;
        }
コード例 #15
0
        /// <summary>
        /// Class constructor and grammar definition
        /// </summary>
        public FtpGrammar()
            : base(false)
        {
            // declare keywords
            var openKeyword = ToTerm("open");
            var changeDirKeyword = ToTerm("cd");
            var dirKeyword = ToTerm("dir");
            var listKeyword = ToTerm("ls");
            var closeKeyword = ToTerm("close");
            var getKeyword = ToTerm("get");
            var byeKeyword = ToTerm("bye");
            var backfolderKeyword = ToTerm("..");
            var rootfolderKeyword = ToTerm(@"\");

            // declare non-terminals
            var program = new NonTerminal("program");
            var commandList = new NonTerminal("commandList");
            var command = new NonTerminal("command");
            var openCommand = new NonTerminal("open");
            var changeDirCommand = new NonTerminal("cd");
            var dirCommand = new NonTerminal("dir");
            var closeCommand = new NonTerminal("close");
            var getCommand = new NonTerminal("get");
            var byeCommand = new NonTerminal("byeCommand");
            var url = new NonTerminal("url");
            var folderName = new NonTerminal("folderName");

            var quotedUrl = new StringLiteral("quotedUrl", "\"");
            var unquotedUrl = new IdentifierTerminal("unquotedUrl");
            var quotedIdentifier = new StringLiteral("quotedIdentifier", "\"");
            var unquotedIdentifier = new IdentifierTerminal("unquotedIdentifier");
            var filename = new RegexBasedTerminal("filename", @"[a-zA-Z0-9\.\-_]+"); // note: space not allowed.

            // grammar rules
            program.Rule = commandList;
            commandList.Rule = this.MakePlusRule(commandList, null, command);
            command.Rule = openCommand | changeDirCommand | dirCommand | closeCommand | getCommand | byeCommand;

            openCommand.Rule = openKeyword + url + this.NewLine; // string_literal + string_literal +
            changeDirCommand.Rule = changeDirKeyword + rootfolderKeyword + this.NewLine | changeDirKeyword + backfolderKeyword + this.NewLine | changeDirKeyword + folderName + this.NewLine;
            dirCommand.Rule = (dirKeyword | listKeyword) + this.NewLine;
            closeCommand.Rule = closeKeyword + this.NewLine;
            getCommand.Rule = getKeyword + unquotedIdentifier + this.NewLine; // vai ser preciso usar uma regex para o nome do ficheiro
            byeCommand.Rule = byeKeyword + this.NewLine;

            //// string regex = @"^[a-zA-Z0-9\.-_ ]+$" (cuidado com ., .., ...) e os espaços
            //// inválidos: \/:*?"<>|

            url.Rule = quotedUrl | unquotedUrl;
            folderName.Rule = quotedIdentifier | filename;

            // remove these notes as children in the AST
            this.MarkPunctuation("open", "dir", "ls", "close", "get", "cd", "bye");
            this.Root = program;

            // LanguageFlags |= LanguageFlags.CreateAst;
        }
コード例 #16
0
        static IdentifierTerminal createClassInstanceVarName()
        {
            var ClassInstanceVarName = new IdentifierTerminal("ClassInstanceVarName");

            ClassInstanceVarName.AllFirstChars = "@@";
            ClassInstanceVarName.AddPrefix("@", IdOptions.NameIncludesPrefix);

            return(ClassInstanceVarName);
        }
コード例 #17
0
        static IdentifierTerminal createSymbolId()
        {
            var SymbolId = new IdentifierTerminal("SymbolId");

            SymbolId.AllFirstChars = ":";
            SymbolId.AddPrefix(":", IdOptions.NameIncludesPrefix);

            return(SymbolId);
        }
コード例 #18
0
        static IdentifierTerminal createIdentifier()
        {
            var Id = new IdentifierTerminal("identifier");

            Id.CaseRestriction = CaseRestriction.FirstLower;
            Id.AddSuffix("?");
            Id.AddSuffix("!");
            return(Id);
        }
コード例 #19
0
ファイル: SqlGrammarBase.cs プロジェクト: meikeric/deveeldb
        private void MakeSimpleId()
        {
            Identifier = new IdentifierTerminal("simple_id");
            var idStringLiteral = new StringLiteral("simple_id_quoted");

            idStringLiteral.AddStartEnd("\"", StringOptions.NoEscapes);
            idStringLiteral.AstConfig.NodeType = typeof(IdentifierNode);
            idStringLiteral.SetOutputTerminal(this, Identifier);
        }
コード例 #20
0
        /// <summary>
        /// Create the term that represents an Entity identifier.
        /// </summary>
        public IdentifierTerminal CreateIdentifierTerm(string name)
        {
            var id   = new IdentifierTerminal(name, IdOptions.IsNotKeyword);
            var term = new StringLiteral(name + "_quoted");

            term.AddStartEnd("[", "]", StringOptions.AllowsDoubledQuote);
            term.SetOutputTerminal(this, id);
            return(id);
        }
コード例 #21
0
        /*public static IdentifierTerminal CreatePropertyId(string name)
         * {
         *  IdentifierTerminal id = CreateId(name);
         *  //id.AddPrefix(":", IdOptions.IsNotKeyword | IdOptions.NameIncludesPrefix);
         *  id.AllFirstChars = ":";
         *  return id;
         * }*/
        public static IdentifierTerminal CreateVariableId(string name)
        {
            IdentifierTerminal id = CreateId(name);

            //id.AddPrefix("$", IdOptions.IsNotKeyword | IdOptions.NameIncludesPrefix);
            //id.AddPrefix("$", IdOptions.None);
            id.AllFirstChars = "$";
            return(id);
        }
コード例 #22
0
        /// <summary>
        /// Class constructor and grammar definition
        /// </summary>
        public FtpGrammar() : base(false)
        {
            // declare keywords
            var openKeyword       = ToTerm("open");
            var changeDirKeyword  = ToTerm("cd");
            var dirKeyword        = ToTerm("dir");
            var listKeyword       = ToTerm("ls");
            var closeKeyword      = ToTerm("close");
            var getKeyword        = ToTerm("get");
            var byeKeyword        = ToTerm("bye");
            var backfolderKeyword = ToTerm("..");
            var rootfolderKeyword = ToTerm(@"\");

            // declare non-terminals
            var program          = new NonTerminal("program");
            var commandList      = new NonTerminal("commandList");
            var command          = new NonTerminal("command");
            var openCommand      = new NonTerminal("open");
            var changeDirCommand = new NonTerminal("cd");
            var dirCommand       = new NonTerminal("dir");
            var closeCommand     = new NonTerminal("close");
            var getCommand       = new NonTerminal("get");
            var byeCommand       = new NonTerminal("byeCommand");
            var url        = new NonTerminal("url");
            var folderName = new NonTerminal("folderName");

            var quotedUrl          = new StringLiteral("quotedUrl", "\"");
            var unquotedUrl        = new IdentifierTerminal("unquotedUrl");
            var quotedIdentifier   = new StringLiteral("quotedIdentifier", "\"");
            var unquotedIdentifier = new IdentifierTerminal("unquotedIdentifier");
            var filename           = new RegexBasedTerminal("filename", @"[a-zA-Z0-9\.\-_]+"); // note: space not allowed.

            // grammar rules
            program.Rule     = commandList;
            commandList.Rule = this.MakePlusRule(commandList, null, command);
            command.Rule     = openCommand | changeDirCommand | dirCommand | closeCommand | getCommand | byeCommand;

            openCommand.Rule      = openKeyword + url + this.NewLine; // string_literal + string_literal +
            changeDirCommand.Rule = changeDirKeyword + rootfolderKeyword + this.NewLine | changeDirKeyword + backfolderKeyword + this.NewLine | changeDirKeyword + folderName + this.NewLine;
            dirCommand.Rule       = (dirKeyword | listKeyword) + this.NewLine;
            closeCommand.Rule     = closeKeyword + this.NewLine;
            getCommand.Rule       = getKeyword + unquotedIdentifier + this.NewLine; // vai ser preciso usar uma regex para o nome do ficheiro
            byeCommand.Rule       = byeKeyword + this.NewLine;

            //// string regex = @"^[a-zA-Z0-9\.-_ ]+$" (cuidado com ., .., ...) e os espaços
            //// inválidos: \/:*?"<>|

            url.Rule        = quotedUrl | unquotedUrl;
            folderName.Rule = quotedIdentifier | filename;

            // remove these notes as children in the AST
            this.MarkPunctuation("open", "dir", "ls", "close", "get", "cd", "bye");
            this.Root = program;

            // LanguageFlags |= LanguageFlags.CreateAst;
        }
コード例 #23
0
        public ExpressionEvaluatorGrammar()
        {
            // 1. Terminals
            var number = new NumberLiteral("number");

            //Let's allow big integers (with unlimited number of digits):
            number.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            var identifier = new IdentifierTerminal("identifier");
            var comment    = new CommentTerminal("comment", "#", "\n", "\r");

            //comment must to be added to NonGrammarTerminals list; it is not used directly in grammar rules,
            // so we add it to this list to let Scanner know that it is also a valid terminal.
            base.NonGrammarTerminals.Add(comment);
            // 2. Non-terminals
            var Expr           = new NonTerminal("Expr");
            var Term           = new NonTerminal("Term");
            var BinExpr        = new NonTerminal("BinExpr", typeof(BinExprNode));
            var ParExpr        = new NonTerminal("ParExpr");
            var UnExpr         = new NonTerminal("UnExpr", typeof(UnExprNode));
            var UnOp           = new NonTerminal("UnOp");
            var BinOp          = new NonTerminal("BinOp", "operator");
            var PostFixExpr    = new NonTerminal("PostFixExpr", typeof(UnExprNode));
            var PostFixOp      = new NonTerminal("PostFixOp");
            var AssignmentStmt = new NonTerminal("AssignmentStmt", typeof(AssigmentNode));
            var AssignmentOp   = new NonTerminal("AssignmentOp", "assignment operator");
            var Statement      = new NonTerminal("Statement");
            var ProgramLine    = new NonTerminal("ProgramLine");
            var Program        = new NonTerminal("Program", typeof(StatementListNode));

            // 3. BNF rules
            Expr.Rule           = Term | UnExpr | BinExpr | PostFixExpr;
            Term.Rule           = number | ParExpr | identifier;
            ParExpr.Rule        = "(" + Expr + ")";
            UnExpr.Rule         = UnOp + Term;
            UnOp.Rule           = ToTerm("+") | "-" | "++" | "--";
            BinExpr.Rule        = Expr + BinOp + Expr;
            BinOp.Rule          = ToTerm("+") | "-" | "*" | "/" | "**";
            PostFixExpr.Rule    = Term + PostFixOp;
            PostFixOp.Rule      = ToTerm("++") | "--";
            AssignmentStmt.Rule = identifier + AssignmentOp + Expr;
            AssignmentOp.Rule   = ToTerm("=") | "+=" | "-=" | "*=" | "/=";
            Statement.Rule      = AssignmentStmt | Expr | Empty;
            ProgramLine.Rule    = Statement + NewLine;
            Program.Rule        = MakeStarRule(Program, ProgramLine);
            this.Root           = Program; // Set grammar root
            // 4. Operators precedence
            RegisterOperators(1, "+", "-");
            RegisterOperators(2, "*", "/");
            RegisterOperators(3, Associativity.Right, "**");
            // 5. Punctuation and transient terms
            RegisterPunctuation("(", ")");
            RegisterBracePair("(", ")");
            MarkTransient(Term, Expr, Statement, BinOp, UnOp, PostFixOp, AssignmentOp, ProgramLine, ParExpr);
            //automatically add NewLine before EOF so that our BNF rules work correctly when there's no final line break in source
            this.LanguageFlags = LanguageFlags.CreateAst | LanguageFlags.NewLineBeforeEOF | LanguageFlags.CanRunSample;
        }
コード例 #24
0
        private BnfTerm CreateSqlExtIdentifier(string name)
        {
            var identifierTerminal = new IdentifierTerminal(name, null, "@");
            var stringLiteral      = new StringLiteral(name + "_quoted");

            stringLiteral.AddStartEnd("[", "]", StringOptions.NoEscapes);
            stringLiteral.AddStartEnd("\"", StringOptions.NoEscapes);
            stringLiteral.SetOutputTerminal(this, identifierTerminal);
            return(identifierTerminal);
        }
コード例 #25
0
        public SearchGrammar()
        {
            // Terminals
            var Term = new IdentifierTerminal("Term", "!@#$%^*_'.?", "!@#$%^*_'.?0123456789");
            // The following is not very imporant, but makes scanner recognize "or" and "and" as operators, not Terms
            // The "or" and "and" operator symbols found in grammar get higher priority in scanning and are checked
            // first, before the Term terminal, so Scanner produces operator token, not Term. For our purposes it does
            // not matter, we get around without it.
            Term.Priority = Terminal.LowestPriority;
            var Phrase = new StringLiteral("Phrase");

            // NonTerminals
            var OrExpression = new NonTerminal("OrExpression");
            var OrOperator = new NonTerminal("OrOperator");
            var AndExpression = new NonTerminal("AndExpression");
            var AndOperator = new NonTerminal("AndOperator");
            var ExcludeOperator = new NonTerminal("ExcludeOperator");
            var PrimaryExpression = new NonTerminal("PrimaryExpression");
            var ThesaurusExpression = new NonTerminal("ThesaurusExpression");
            var ThesaurusOperator = new NonTerminal("ThesaurusOperator");
            var ExactOperator = new NonTerminal("ExactOperator");
            var ExactExpression = new NonTerminal("ExactExpression");
            var ParenthesizedExpression = new NonTerminal("ParenthesizedExpression");
            var ProximityExpression = new NonTerminal("ProximityExpression");
            var ProximityList = new NonTerminal("ProximityList");

            this.Root = OrExpression;
            OrExpression.Rule = AndExpression
                              | OrExpression + OrOperator + AndExpression;
            OrOperator.Rule = Symbol("or") | "|";
            AndExpression.Rule = PrimaryExpression
                               | AndExpression + AndOperator + PrimaryExpression;
            AndOperator.Rule = Empty
                             | "and"
                             | "&"
                             | ExcludeOperator;
            ExcludeOperator.Rule = Symbol("-");
            PrimaryExpression.Rule = Term
                                   | ThesaurusExpression
                                   | ExactExpression
                                   | ParenthesizedExpression
                                   | Phrase
                                   | ProximityExpression;
            ThesaurusExpression.Rule = ThesaurusOperator + Term;
            ThesaurusOperator.Rule = Symbol("~");
            ExactExpression.Rule = ExactOperator + Term
                                 | ExactOperator + Phrase;
            ExactOperator.Rule = Symbol("+");
            ParenthesizedExpression.Rule = "(" + OrExpression + ")";
            ProximityExpression.Rule = "<" + ProximityList + ">";

            MakePlusRule(ProximityList, Term);

            RegisterPunctuation("<", ">", "(", ")");
        }
コード例 #26
0
      public ErrorRecoveryGrammar() {
        var id = new IdentifierTerminal("id");
        var expr = new NonTerminal("expr");
        var stmt = new NonTerminal("stmt");
        var stmtList = new NonTerminal("stmt");

        base.Root = stmtList;
        stmtList.Rule = MakeStarRule(stmtList, stmt);
        stmt.Rule = id + "=" + expr + ";";
        stmt.ErrorRule = SyntaxError + ";";
        expr.Rule = id | id + "+" + id; 
      }
コード例 #27
0
    public GrammarEx446() {
      // A' is augmented root
      NonTerminal S = new NonTerminal("S");
      NonTerminal L = new NonTerminal("L");
      NonTerminal R = new NonTerminal("R");
      Terminal id = new IdentifierTerminal("id");

      S.Rule = L + "=" + R | R;
      L.Rule = "*" + R | id;
      R.Rule = L;
      this.Root = S;
    }//method
コード例 #28
0
ファイル: Gramatica2.cs プロジェクト: cramptonrage/Compilador
        public Gramatica2() : base(caseSensitive: false)
        {
            #region ER
            RegexBasedTerminal numero = new RegexBasedTerminal("numero", "[0-9]+");
            IdentifierTerminal id     = new IdentifierTerminal("id");
            #endregion

            #region Terminales
            var mas   = ToTerm("+");
            var menos = ToTerm("-");
            var por   = ToTerm("*");
            var div   = ToTerm("/");
            #endregion

            #region No Terminales
            NonTerminal S = new NonTerminal("S"),
                        E = new NonTerminal("E"),
                        T = new NonTerminal("T"),
                        F = new NonTerminal("F");

            #endregion

            #region Gramatica

            S.Rule = E;
            E.Rule = E + mas + E
                     | E + menos + E
                     | E + por + E
                     | E + div + E
                     | ToTerm("(") + E + ToTerm(")")
                     | ToTerm("(") + E + ToTerm(")") + ToTerm("^") + E
                     | numero + ToTerm("^") + E
                     | numero
                     | id;

            /* //Gramatica no ambigua
             * S.Rule = E;
             * E.Rule = E + mas + T
             | E + menos + T
             | T;
             | T.Rule = T + por + F
             | T + div + F
             | F;
             | F.Rule = id
             | numero;*/

            #endregion

            #region Preferencias
            this.Root = S;
            #endregion
        }
コード例 #29
0
            public ErrorRecoveryGrammar()
            {
                var id       = new IdentifierTerminal("id");
                var expr     = new NonTerminal("expr");
                var stmt     = new NonTerminal("stmt");
                var stmtList = new NonTerminal("stmt");

                base.Root      = stmtList;
                stmtList.Rule  = MakeStarRule(stmtList, stmt);
                stmt.Rule      = id + "=" + expr + ";";
                stmt.ErrorRule = SyntaxError + ";";
                expr.Rule      = id | id + "+" + id;
            }
コード例 #30
0
        public GrammarEx446()
        {
            // A' is augmented root
            NonTerminal S  = new NonTerminal("S");
            NonTerminal L  = new NonTerminal("L");
            NonTerminal R  = new NonTerminal("R");
            Terminal    id = new IdentifierTerminal("id");

            S.Rule    = L + "=" + R | R;
            L.Rule    = "*" + R | id;
            R.Rule    = L;
            this.Root = S;
        }//method
コード例 #31
0
ファイル: lpGrammar.cs プロジェクト: taesiri/lpSolver
        public LinearProgrammingGrammar()
        {
            var comment = new CommentTerminal("comment", "#", "\n", "\r");
            NonGrammarTerminals.Add(comment);

            var identifier = new IdentifierTerminal("appIdentifier");
            var variable = new IdentifierTerminal("variable");

            var number = new NumberLiteral("number", NumberOptions.AllowSign);

            var lpProgram = new NonTerminal("lpApp");
            var lpAppName = new NonTerminal("lpAppName");
            var lpModel = new NonTerminal("lpModel");

            var lpGoal = new NonTerminal("lpGoal");
            var lpPolynomial = new NonTerminal("lpPolynomial");
            var lpConstraints = new NonTerminal("lpConstraints");
            var lpConstraint = new NonTerminal("lpConstraints");
            var lpOperator = new NonTerminal("lpOperator", "lp Operation symbol");
            var lpBinOp = new NonTerminal("lpBinOp", "lp Binary Operation symbol");
            var lpMonomial = new NonTerminal("Monomial");
            var lpNumber = new NonTerminal("lpNumber");

            lpProgram.Rule = lpAppName + "{" + lpModel + "}" + ";";

            lpAppName.Rule = ToTerm("lpmodel") + identifier;

            lpModel.Rule = lpGoal + ToTerm("subject to") +":" + lpConstraints;

            lpGoal.Rule = ToTerm("max") + lpPolynomial | ToTerm("min") + lpPolynomial;

            lpConstraints.Rule = MakePlusRule(lpConstraints, null, lpConstraint);

            //ReduceHere();
            lpConstraint.Rule = lpPolynomial + lpOperator + lpPolynomial + ";";

            lpOperator.Rule = ToTerm("<") | "==" | ">" | "<=" | ">=";

            lpPolynomial.Rule = lpMonomial | lpMonomial + lpBinOp + lpPolynomial  | lpNumber |
                                lpNumber + lpBinOp + lpPolynomial;

            lpMonomial.Rule = variable | lpNumber + ToTerm("*") + variable;

            lpBinOp.Rule = ToTerm("+") | "-";
            lpNumber.Rule = number | lpBinOp + number;

            MarkReservedWords("max", "min", "lpmodel", "subject to");

               // ReduceIf("");
            Root = lpProgram;
        }
コード例 #32
0
        public Portugol()
            : base(false)
        {
            LanguageFlags = LanguageFlags.CreateAst;

            var numero = new NumberLiteral("Numero", NumberOptions.AllowSign);
            var identificador = new IdentifierTerminal("Identificador");

            var expressao = new NonTerminal("Expressao", typeof (AstNode));
            var termo = new NonTerminal("Termo", typeof (AstNode));
            var chamadaFuncao = new NonTerminal("Chamada funcao", typeof (ChamadaDeFuncao));
            var operacaoBinaria = new NonTerminal("Operacao binaria", typeof (OperacaoBinaria));
            var operacaoComParentese = new NonTerminal("Operacao com parentese", typeof (AstNode));
            var se = new NonTerminal("Se", typeof (CondicaoSe));
            var operador = new NonTerminal("Operador", typeof(AstNode));
            var operadorLogico = new NonTerminal("Operador logico", typeof (AstNode));
            var argumentos = new NonTerminal("Argumentos", typeof (AstNode));
            var sePart = new NonTerminal("Se parte", typeof (AstNode));
            var entaoPart = new NonTerminal("Entao parte", typeof (AstNode));
            var senaoPart = new NonTerminal("Senao parte", typeof (AstNode));

            NonGrammarTerminals.Add(new CommentTerminal("comment1", "/*", "*/"));

            expressao.Rule = operacaoBinaria | operacaoComParentese | se | chamadaFuncao | termo;
            termo.Rule = numero;
            operacaoComParentese.Rule = ToTerm("(") + expressao + ")";
            operacaoBinaria.Rule = expressao + operador + expressao;
            operador.Rule = ToTerm("+") | "-" | "*" | "/" | "^" | "%" | "=" | "<" | ">" | "<=" | ">=" | "<>" | "E" | "OU";

            sePart.Rule = ToTerm("Se");
            entaoPart.Rule = ToTerm("Entao");
            senaoPart.Rule = ToTerm("Senao");

            se.Rule = sePart + expressao + entaoPart + expressao + senaoPart + expressao;

            argumentos.Rule = MakePlusRule(argumentos, ToTerm(","), expressao);

            chamadaFuncao.Rule = identificador | identificador + "(" + argumentos + ")";

            RegisterOperators(1, "E", "OU");
            RegisterOperators(5, "=", "<", ">", "<=", ">=", "<>");
            RegisterOperators(10, "+", "-");
            RegisterOperators(20, "*", "/", "%", "^");
            MarkPunctuation("(", ")");
            RegisterBracePair("(", ")");

            MarkTransient(expressao, operador, termo, operadorLogico, operacaoComParentese);
            Root = expressao;
            LanguageFlags = LanguageFlags.CreateAst;
        }
コード例 #33
0
        public NumericalSchemeGrammar()
        {
            this.GrammarComments = "";

            //Symbols
            var whitespace = new NonTerminal("WhiteSpace", Empty | " " | "\t");
            // Comments
            var singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var multiLineComment  = new CommentTerminal("DelimitedComment", "/*", "*/");

            NonGrammarTerminals.Add(singleLineComment);
            NonGrammarTerminals.Add(multiLineComment);

            //Terminals
            var semicolon    = ToTerm(";", "Semicolon");
            var ofString     = new StringLiteral("String", "\"");
            var ofNumber     = new NumberLiteral("Number", NumberOptions.AllowSign);
            var ofIdentifier = TerminalFactory.CreateCSharpIdentifier("Identifier");
            var ofArrayTerm  = new IdentifierTerminal("SchemeTerm", "(),|*.+-/%^~!&");

            //Non-terminals
            var ofValue = new NonTerminal("Value");

            var ofDictionary               = new NonTerminal("Dictionary");
            var ofDictionaryContent        = new NonTerminal("DictionaryContent");
            var ofDictionaryContentWrapper = new NonTerminal("DictionaryContentWrapper");
            var ofDictEntry = new NonTerminal("DictEntry");

            var ofArrayEntry   = new NonTerminal("ArrayEntry");
            var ofArray        = new NonTerminal("Array");
            var ofArrayWrapper = new NonTerminal("ArrayWrapper");

            //BNF
            ofValue.Rule = ofIdentifier | ofArrayTerm | ofString | ofNumber;

            ofDictEntry.Rule                = ofArrayWrapper | ofDictionary;
            ofDictionaryContent.Rule        = MakeStarRule(ofDictionaryContent, whitespace, ofDictEntry);
            ofDictionaryContentWrapper.Rule = "{" + ofDictionaryContent + "}";
            ofDictionary.Rule               = ofIdentifier + whitespace + ofDictionaryContentWrapper;

            ofArrayEntry.Rule   = ofValue;
            ofArray.Rule        = MakeStarRule(ofArray, whitespace, ofArrayEntry);
            ofArrayWrapper.Rule = ofArray + semicolon;

            //Set grammar root
            this.Root = ofDictionaryContent;
            MarkPunctuation("{", "}");
            MarkTransient(ofValue, ofDictionaryContentWrapper);
        }
コード例 #34
0
        public NumericalSchemeGrammar()
        {
            this.GrammarComments = "";

            //Symbols
            var whitespace = new NonTerminal("WhiteSpace", Empty | " " | "\t");
            // Comments
            var singleLineComment = new CommentTerminal("SingleLineComment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var multiLineComment = new CommentTerminal("DelimitedComment", "/*", "*/");
            NonGrammarTerminals.Add(singleLineComment);
            NonGrammarTerminals.Add(multiLineComment);

            //Terminals
            var semicolon = ToTerm(";", "Semicolon");
            var ofString = new StringLiteral("String", "\"");
            var ofNumber = new NumberLiteral("Number", NumberOptions.AllowSign);
            var ofIdentifier = TerminalFactory.CreateCSharpIdentifier("Identifier");
            var ofArrayTerm = new IdentifierTerminal("SchemeTerm", "(),|*.+-/%^~!&");

            //Non-terminals
            var ofValue = new NonTerminal("Value");

            var ofDictionary = new NonTerminal("Dictionary");
            var ofDictionaryContent = new NonTerminal("DictionaryContent");
            var ofDictionaryContentWrapper = new NonTerminal("DictionaryContentWrapper");
            var ofDictEntry = new NonTerminal("DictEntry");

            var ofArrayEntry = new NonTerminal("ArrayEntry");
            var ofArray = new NonTerminal("Array");
            var ofArrayWrapper = new NonTerminal("ArrayWrapper");

            //BNF
            ofValue.Rule = ofIdentifier | ofArrayTerm | ofString | ofNumber;

            ofDictEntry.Rule = ofArrayWrapper | ofDictionary;
            ofDictionaryContent.Rule = MakeStarRule(ofDictionaryContent, whitespace, ofDictEntry);
            ofDictionaryContentWrapper.Rule = "{" + ofDictionaryContent + "}";
            ofDictionary.Rule = ofIdentifier + whitespace + ofDictionaryContentWrapper;

            ofArrayEntry.Rule = ofValue;
            ofArray.Rule = MakeStarRule(ofArray, whitespace, ofArrayEntry);
            ofArrayWrapper.Rule = ofArray + semicolon;

            //Set grammar root
            this.Root = ofDictionaryContent;
            MarkPunctuation("{", "}");
            MarkTransient(ofValue, ofDictionaryContentWrapper);
        }
コード例 #35
0
        public ExpressionEvaluatorGrammar()
        {
            // 1. Terminals
              var number = new NumberLiteral("number");
              var identifier = new IdentifierTerminal("identifier");
              var comment = new CommentTerminal("comment", "#", "\n", "\r");
              base.NonGrammarTerminals.Add(comment);

              // 2. Non-terminals
              var Variable = new NonTerminal("Variable", typeof(VarRefNode));
              var Expr = new NonTerminal("Expr");
              var Term = new NonTerminal("Term");
              var BinExpr = new NonTerminal("BinExpr", typeof(BinExprNode));
              var ParExpr = new NonTerminal("ParExpr");
              var UnExpr = new NonTerminal("UnExpr", typeof(UnExprNode));
              var UnOp = new NonTerminal("UnOp");
              var BinOp = new NonTerminal("BinOp");
              var AssignmentStmt = new NonTerminal("AssignmentStmt", typeof(AssigmentNode));
              var Statement = new NonTerminal("Statement");
              var ProgramLine = new NonTerminal("ProgramLine");
              var Program = new NonTerminal("Program", typeof(StatementListNode));

              // 3. BNF rules
              Variable.Rule = identifier;
              Expr.Rule = Term | UnExpr | BinExpr;
              Term.Rule = number | ParExpr | Variable;
              ParExpr.Rule = "(" + Expr + ")";
              UnExpr.Rule = UnOp + Term;
              UnOp.Rule = Symbol("+") | "-";
              BinExpr.Rule =  Expr + BinOp + Expr;
              BinOp.Rule = Symbol("+") | "-" | "*" | "/" | "**";
              AssignmentStmt.Rule = Variable + "=" + Expr;
              Statement.Rule = AssignmentStmt | Expr | Empty;
              ProgramLine.Rule = Statement + NewLine;
              Program.Rule = MakeStarRule(Program, ProgramLine);
              this.Root = Program;       // Set grammar root

              // 4. Operators precedence
              RegisterOperators(1, "+", "-");
              RegisterOperators(2, "*", "/");
              RegisterOperators(3, Associativity.Right, "**");

              RegisterPunctuation( "(", ")");
              MarkTransient(Term, Expr, Statement);

              //automatically add NewLine before EOF so that our BNF rules work correctly when there's no final line break in source
              this.LanguageFlags |= LanguageFlags.NewLineBeforeEOF | LanguageFlags.SupportsInterpreter;
        }
コード例 #36
0
ファイル: Kbtter3QueryGrammar.cs プロジェクト: kb10uy/Kbtter4
        /// <summary>
        /// 使うな
        /// </summary>
        public Kbtter3QueryGrammar()
            : base()
        {
            //コメント
            var comment = new CommentTerminal("Comment", "/*", "*/");
            NonGrammarTerminals.Add(comment);

            //リテラル
            var number = new NumberLiteral("Number", NumberOptions.AllowSign | NumberOptions.AllowStartEndDot);
            var str = new StringLiteral("String", "\"");
            var regex = new RegexLiteral("Regex", '/', '\\');
            var ident = new IdentifierTerminal("Identifer");

            //非終端
            var Value = new NonTerminal("Value");
            var Term = new NonTerminal("Term");
            var Expression = new NonTerminal("Expression");
            var BinExpression = new NonTerminal("BinExpression");
            var ParExpression = new NonTerminal("ParExpression");
            var PostfixExpression = new NonTerminal("PostfixExpression");
            var Operator = new NonTerminal("Operator");

            //非終端定義
            Value.Rule = number | str | ident | regex | "null" | "true" | "false";
            Term.Rule = Value | ParExpression;
            Operator.Rule = ToTerm("==") | "!=" | ">" | "<" | ">=" | "<=" | "match" | "&&" | "||" | "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | ".";
            BinExpression.Rule = Expression + Operator + Expression;
            PostfixExpression.Rule = (ToTerm("+") + Term) | ("-" + Term) | ("!" + Term);
            Expression.Rule = BinExpression | Term | PostfixExpression;
            ParExpression.Rule = ToTerm("(") + Expression + ")";

            RegisterOperators(10, ".");
            RegisterOperators(9, "*", "/", "%");
            RegisterOperators(8, "+", "-");
            RegisterOperators(7, ">", "<", ">=", "<=", "match");
            RegisterOperators(6, "==", "!=");
            RegisterOperators(5, "&");
            RegisterOperators(4, "^");
            RegisterOperators(3, "|");
            RegisterOperators(2, "&&");
            RegisterOperators(1, "||");

            Root = Expression;
            MarkPunctuation("(", ")");
            MarkTransient(Expression, ParExpression, Value, Operator, Term);
        }
コード例 #37
0
        public WikiText_Template_Grammar()
        {
            // Terminals
            //var text = new WikiTextTerminal("text");
            var pipeChar      = ToTerm("|");
            var identifier    = new IdentifierTerminal("identifier"); //,"","");
            var variableName  = new DsvLiteral("variableName", TypeCode.String, "=");
            var variableValue = new DsvLiteral("variableValue", TypeCode.String, "\n");

            // Non-terminals
            var wikiTemplate = new NonTerminal("wikiElement");
            var templateData = new NonTerminal("templateData");
            var includeOnly  = new WikiBlockTerminal("includeOnly", WikiBlockType.EscapedText, "<includeonly>", "</includeonly>", "includeOnly");
            var noInclude    = new WikiBlockTerminal("includeOnly", WikiBlockType.EscapedText, "<noinclude>", "</noinclude>", "includeOnly");

            //var wikiText = new NonTerminal("wikiText");
            var templateDetails = new NonTerminal("templateDetails");
            var row             = new NonTerminal("row");
            var emptyRow        = new NonTerminal("emptyRow");
            var dataRow         = new NonTerminal("dataRow");
            var rows            = new NonTerminal("rows");

            //var drive = new NonTerminal("drive");

            // BNF rules
            templateDetails.Rule = identifier + ":" + includeOnly + noInclude;
            dataRow.Rule         = pipeChar + variableName + variableValue;
            row.Rule             = emptyRow | dataRow;
            emptyRow.Rule        = ToTerm("|-") + NewLine;
            rows.Rule            = MakePlusRule(rows, row);
            templateData.Rule    = templateDetails + NewLine + rows;
            wikiTemplate.Rule    = ToTerm("{{") + templateData + "}}"; // + ToTerm("}}");
            //wikiText.Rule = "{{ " + MakeStarRule(wikiText, wikiElement)  + "}}" ;
            //wikiText.Rule = MakeStarRule(wikiText, wikiElement) ;
            // config
            //this.Root =  wikiText;
            this.Root = wikiTemplate;

            //this.WhitespaceChars = string.Empty;
            MarkTransient(row);
            MarkPunctuation(pipeChar);
            //NewLine.SetFlag(TermFlags.IsPunctuation, true);
            this.LanguageFlags = LanguageFlags.NewLineBeforeEOF;
            //this.LanguageFlags |= LanguageFlags.DisableScannerParserLink | LanguageFlags.NewLineBeforeEOF | LanguageFlags.CanRunSample
            //					| LanguageFlags.CreateAst ;
        }
コード例 #38
0
        public Kbtter3QueryGrammar() : base(false)
        {
            //コメント
            var comment = new CommentTerminal("Comment", "/*", "*/");

            NonGrammarTerminals.Add(comment);

            //リテラル
            var number = new NumberLiteral("Number", NumberOptions.AllowSign | NumberOptions.AllowStartEndDot);
            var str    = new StringLiteral("String", "\"");
            var regex  = new RegexLiteral("Regex", '/', '\\');
            var ident  = new IdentifierTerminal("Identifer");

            //非終端
            var Value             = new NonTerminal("Value");
            var Term              = new NonTerminal("Term");
            var Expression        = new NonTerminal("Expression");
            var BinExpression     = new NonTerminal("BinExpression");
            var ParExpression     = new NonTerminal("ParExpression");
            var PostfixExpression = new NonTerminal("PostfixExpression");
            var Operator          = new NonTerminal("Operator");

            //非終端定義
            Value.Rule             = number | str | ident | regex | "null" | "true" | "false";
            Term.Rule              = Value | ParExpression;
            Operator.Rule          = ToTerm("==") | "!=" | ">" | "<" | ">=" | "<=" | "match" | "&&" | "||" | "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | ".";
            BinExpression.Rule     = Expression + Operator + Expression;
            PostfixExpression.Rule = (ToTerm("+") + Term) | ("-" + Term) | ("!" + Term);
            Expression.Rule        = BinExpression | Term | PostfixExpression;
            ParExpression.Rule     = ToTerm("(") + Expression + ")";

            RegisterOperators(10, ".");
            RegisterOperators(9, "*", "/", "%");
            RegisterOperators(8, "+", "-");
            RegisterOperators(7, ">", "<", ">=", "<=", "match");
            RegisterOperators(6, "==", "!=");
            RegisterOperators(5, "&");
            RegisterOperators(4, "^");
            RegisterOperators(3, "|");
            RegisterOperators(2, "&&");
            RegisterOperators(1, "||");

            Root = Expression;
            MarkPunctuation("(", ")");
            MarkTransient(Expression, ParExpression, Value, Operator, Term);
        }
コード例 #39
0
        private NonTerminal Identifier()
        {
            var idSimple = new IdentifierTerminal("Identifier")
            {
                AllFirstChars = validChars,
                AllChars      = validChars + "1234567890"
            };

            idSimple.SetFlag(TermFlags.NoAstNode);

            var id = NonTerminal("identifier", null, n => new Identifier
            {
                Value = n.ChildNodes.Select(x => x.Token.ValueString).JoinStrings(".")
            });

            id.Rule = MakePlusRule(id, ToTerm("."), idSimple);
            return(id);
        }
コード例 #40
0
        public ConflictResolutionTestGrammar2() : base(true)
        {
            var name = new IdentifierTerminal("id");

            var definition    = new NonTerminal("definition");
            var fieldDef      = new NonTerminal("fieldDef");
            var propDef       = new NonTerminal("propDef");
            var fieldModifier = new NonTerminal("fieldModifier");
            var propModifier  = new NonTerminal("propModifier");

            definition.Rule    = fieldDef | propDef;
            fieldDef.Rule      = fieldModifier + name + name + ";";
            propDef.Rule       = propModifier + name + name + "{" + "}";
            fieldModifier.Rule = ToTerm("public") + ReduceIf(";", comesBefore: "{") | "private" + ReduceIf(";", comesBefore: "{") | "readonly";
            propModifier.Rule  = ToTerm("public") | "private" | "override";

            Root = definition;
        }
コード例 #41
0
    public ConflictGrammarWithHintsInRules()  : base(true) {
      var name = new IdentifierTerminal("id");

      var definition = new NonTerminal("definition");
      var fieldDef = new NonTerminal("fieldDef");
      var propDef = new NonTerminal("propDef");
      var fieldModifier = new NonTerminal("fieldModifier");
      var propModifier = new NonTerminal("propModifier");

      definition.Rule = fieldDef | propDef;
      fieldDef.Rule = fieldModifier + name + name + ";";
      propDef.Rule = propModifier + name + name + "{" + "}";
      var fieldHint = ReduceIf(";", comesBefore: "{");
      fieldModifier.Rule = "public" + fieldHint | "private" + fieldHint | "readonly";
      propModifier.Rule = ToTerm("public") | "private" | "override";

      Root = definition;
    }
コード例 #42
0
ファイル: Grammar.cs プロジェクト: molihub/LiveGeometry
        public ExpressionGrammar()
        {
            this.GrammarComments = @"Arithmetical expressions for dynamic geometry.";

            // 1. Terminals
            var number     = new NumberLiteral("number");
            var identifier = new IdentifierTerminal("identifier");

            // 2. Non-terminals
            var Expr           = new NonTerminal("Expr");
            var Term           = new NonTerminal("Term");
            var BinExpr        = new NonTerminal("BinExpr");
            var ParExpr        = new NonTerminal("ParExpr");
            var UnExpr         = new NonTerminal("UnExpr");
            var UnOp           = new NonTerminal("UnOp");
            var BinOp          = new NonTerminal("BinOp", "operator");
            var PropertyAccess = new NonTerminal("PropertyAccess");
            var FunctionCall   = new NonTerminal("FunctionCall");
            var CommaSeparatedIdentifierList = new NonTerminal("PointArgumentList");
            var ArgumentList = new NonTerminal("ArgumentList");

            // 3. BNF rules
            Expr.Rule           = Term | UnExpr | BinExpr;
            Term.Rule           = number | identifier | ParExpr | FunctionCall | PropertyAccess;
            UnExpr.Rule         = UnOp + Term;
            UnOp.Rule           = ToTerm("-");
            BinExpr.Rule        = Expr + BinOp + Expr;
            BinOp.Rule          = ToTerm("+") | "-" | "*" | "/" | "^";
            PropertyAccess.Rule = identifier + "." + identifier;
            FunctionCall.Rule   = identifier + "(" + ArgumentList + ")";
            ArgumentList.Rule   = Expr | CommaSeparatedIdentifierList;
            ParExpr.Rule        = "(" + Expr + ")";
            CommaSeparatedIdentifierList.Rule = MakePlusRule(CommaSeparatedIdentifierList, ToTerm(","), identifier);

            this.Root = Expr;

            // 4. Operators precedence
            RegisterOperators(1, "+", "-");
            RegisterOperators(2, "*", "/");
            RegisterOperators(3, Associativity.Right, "^");

            MarkPunctuation("(", ")", ".", ",");
            MarkTransient(Term, Expr, BinOp, UnOp, ParExpr, ArgumentList, CommaSeparatedIdentifierList);
        }
コード例 #43
0
ファイル: Grammar.cs プロジェクト: ondrej11/o106
        public ExpressionGrammar()
        {
            this.GrammarComments = @"Arithmetical expressions for dynamic geometry.";

            // 1. Terminals
            var number = new NumberLiteral("number");
            var identifier = new IdentifierTerminal("identifier");

            // 2. Non-terminals
            var Expr = new NonTerminal("Expr");
            var Term = new NonTerminal("Term");
            var BinExpr = new NonTerminal("BinExpr");
            var ParExpr = new NonTerminal("ParExpr");
            var UnExpr = new NonTerminal("UnExpr");
            var UnOp = new NonTerminal("UnOp");
            var BinOp = new NonTerminal("BinOp", "operator");
            var PropertyAccess = new NonTerminal("PropertyAccess");
            var FunctionCall = new NonTerminal("FunctionCall");
            var CommaSeparatedIdentifierList = new NonTerminal("PointArgumentList");
            var ArgumentList = new NonTerminal("ArgumentList");

            // 3. BNF rules
            Expr.Rule = Term | UnExpr | BinExpr;
            Term.Rule = number | identifier | ParExpr | FunctionCall | PropertyAccess;
            UnExpr.Rule = UnOp + Term;
            UnOp.Rule = ToTerm("-");
            BinExpr.Rule = Expr + BinOp + Expr;
            BinOp.Rule = ToTerm("+") | "-" | "*" | "/" | "^";
            PropertyAccess.Rule = identifier + "." + identifier;
            FunctionCall.Rule = identifier + "(" + ArgumentList + ")";
            ArgumentList.Rule = Expr | CommaSeparatedIdentifierList;
            ParExpr.Rule = "(" + Expr + ")";
            CommaSeparatedIdentifierList.Rule = MakePlusRule(CommaSeparatedIdentifierList, ToTerm(","), identifier);

            this.Root = Expr;

            // 4. Operators precedence
            RegisterOperators(1, "+", "-");
            RegisterOperators(2, "*", "/");
            RegisterOperators(3, Associativity.Right, "^");

            MarkPunctuation("(", ")", ".", ",");
            MarkTransient(Term, Expr, BinOp, UnOp, ParExpr, ArgumentList, CommaSeparatedIdentifierList);
        }
コード例 #44
0
        public ConflictGrammarWithHintsOnTerms()
            : base(true)
        {
            var name = new IdentifierTerminal("id");

            var stmt               = new NonTerminal("Statement");
            var stmtList           = new NonTerminal("StatementList");
            var fieldModifier      = new NonTerminal("fieldModifier");
            var propModifier       = new NonTerminal("propModifier");
            var methodModifier     = new NonTerminal("methodModifier");
            var fieldModifierList  = new NonTerminal("fieldModifierList");
            var propModifierList   = new NonTerminal("propModifierList");
            var methodModifierList = new NonTerminal("methodModifierList");
            var fieldDef           = new NonTerminal("fieldDef");
            var propDef            = new NonTerminal("propDef");
            var methodDef          = new NonTerminal("methodDef");

            //Rules
            Root                    = stmtList;
            stmtList.Rule           = MakePlusRule(stmtList, stmt);
            stmt.Rule               = fieldDef | propDef | methodDef;
            fieldDef.Rule           = fieldModifierList + name + name + ";";
            propDef.Rule            = propModifierList + name + name + "{" + "}";
            methodDef.Rule          = methodModifierList + name + name + "(" + ")" + "{" + "}";
            fieldModifierList.Rule  = MakeStarRule(fieldModifierList, fieldModifier);
            propModifierList.Rule   = MakeStarRule(propModifierList, propModifier);
            methodModifierList.Rule = MakeStarRule(methodModifierList, methodModifier);

            fieldModifier.Rule  = ToTerm("public") | "private" | "readonly" | "volatile";
            propModifier.Rule   = ToTerm("public") | "private" | "readonly" | "override";
            methodModifier.Rule = ToTerm("public") | "private" | "override";

            // conflict resolution
            var fieldHint = new TokenPreviewHint(PreferredActionType.Reduce, ";", "(", "{");

            fieldModifier.AddHintToAll(fieldHint);
            fieldModifierList.AddHintToAll(fieldHint);
            var propHint = new TokenPreviewHint(PreferredActionType.Reduce, "{", ";", "(");

            propModifier.AddHintToAll(propHint);
            propModifierList.AddHintToAll(propHint);

            MarkReservedWords("public", "private", "readonly", "volatile", "override");
        }
コード例 #45
0
        public FreightGrammar()
            : base(caseSensitive: false)
        {
            // define all the non-terminals
            var program = new NonTerminal("program");
            var statementList = new NonTerminal("statementList");
            var statement = new NonTerminal("statement");
            var ifStatement = new NonTerminal("ifStatement",typeof(FreightLanguage.code_generation.IfStatementNode));
            var freightDeclaration = new NonTerminal("freightDeclaration");
            var setVariable = new NonTerminal("setVariable");
            var orderLoop = new NonTerminal("orderLoop");
            var expression = new NonTerminal("expression",typeof(FreightLanguage.code_generation.ExpressionNode));
            var variable = new IdentifierTerminal("variable");
            //variable.AddKeywords("set", "to", "if", "freight", "cost", "is", "loop", "through", "order");

            var binaryOperator = new NonTerminal("binaryOperator");
            // define the grammar
            //<BinaryOperator> ::= "+" | "-" | "*" | "/" | "<" | ">" | "<=" | ">=" | "is"

            binaryOperator.Rule = ToTerm("+") | "-" | "*" | "/" | "<" | ">" | "<=" | ">=" | "is";
            //<Program> ::= <StatementList> <FreightDeclaration>
            program.Rule = statementList + freightDeclaration;
            //<StatementList> ::= <Statement>*
            statementList.Rule = MakeStarRule(statementList, null, statement);
            //<Statement> ::= <SetVariable> ";" | <IfStatement> | <OrderLoop> | <Expression> ";"
            statement.Rule = setVariable + ";" | ifStatement | orderLoop | expression + ";";
            //<SetVariable> ::= "set" <variable> "to" <Expression>
            setVariable.Rule = ToTerm("set") + variable + "to" + expression;
            //<IfStatement> ::= "if" <Expression> "[" <StatementList> "]"
            ifStatement.Rule = ToTerm("if") + expression + "[" + statementList + "]";
            //<OrderLoop> ::= "loop" "through" "order" "[" <StatementList> "]"
            orderLoop.Rule = ToTerm("loop") + "through" + "order" + "[" + statementList + "]";
            //<FreightDeclaration> ::= "freight" "cost" "is" <Expression> ";"
            freightDeclaration.Rule = ToTerm("freight") + "cost" + "is" + expression + ";";
            //<Expression> ::= <number> | <variable> | <string> |<Expression> <BinaryOperator> <Expression> | "(" <Expression> ")"
            var number = new NumberLiteral("number");
            //TEST
            number.DefaultIntTypes = number.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            var stringLiteral = new StringLiteral("stringType", "\"");
            expression.Rule = number | variable | stringLiteral | expression + binaryOperator + expression | "(" + expression + ")";
            this.Root = program;
            MarkPunctuation("[", "]", ";");
        }
コード例 #46
0
ファイル: SearchGrammar.cs プロジェクト: androdev4u/XLParser
 //Creates extended identifier terminal that allows international characters
 // Following the pattern used for c# identifier terminal in TerminalFactory.CreateCSharpIdentifier method;
 private IdentifierTerminal CreateTerm(string name) {
   IdentifierTerminal term = new IdentifierTerminal(name,   "!@#$%^*_'.?-", "!@#$%^*_'.?0123456789");
   term.CharCategories.AddRange(new UnicodeCategory[] {
      UnicodeCategory.UppercaseLetter, //Ul
      UnicodeCategory.LowercaseLetter, //Ll
      UnicodeCategory.TitlecaseLetter, //Lt
      UnicodeCategory.ModifierLetter,  //Lm
      UnicodeCategory.OtherLetter,     //Lo
      UnicodeCategory.LetterNumber,     //Nl
      UnicodeCategory.DecimalDigitNumber, //Nd
      UnicodeCategory.ConnectorPunctuation, //Pc
      UnicodeCategory.SpacingCombiningMark, //Mc
      UnicodeCategory.NonSpacingMark,       //Mn
      UnicodeCategory.Format                //Cf
   });
   //StartCharCategories are the same
   term.StartCharCategories.AddRange(term.CharCategories); 
   return term;
 }
コード例 #47
0
        public ConflictResolutionTestGrammar4() : base(true)
        {
            var name = new IdentifierTerminal("id");

            var stmt               = new NonTerminal("Statement");
            var stmtList           = new NonTerminal("StatementList");
            var fieldModifier      = new NonTerminal("fieldModifier");
            var propModifier       = new NonTerminal("propModifier");
            var methodModifier     = new NonTerminal("methodModifier");
            var fieldModifierList  = new NonTerminal("fieldModifierList");
            var propModifierList   = new NonTerminal("propModifierList");
            var methodModifierList = new NonTerminal("methodModifierList");
            var fieldDef           = new NonTerminal("fieldDef");
            var propDef            = new NonTerminal("propDef");
            var methodDef          = new NonTerminal("methodDef");

            //Rules
            this.Root               = stmtList;
            stmtList.Rule           = MakePlusRule(stmtList, stmt);
            stmt.Rule               = fieldDef | propDef | methodDef;
            fieldDef.Rule           = fieldModifierList + name + name + ";";
            propDef.Rule            = propModifierList + name + name + "{" + "}";
            methodDef.Rule          = methodModifierList + name + name + "(" + ")" + "{" + "}";
            fieldModifierList.Rule  = MakeStarRule(fieldModifierList, fieldModifier);
            propModifierList.Rule   = MakeStarRule(propModifierList, propModifier);
            methodModifierList.Rule = MakeStarRule(methodModifierList, methodModifier);

            // That's the key of the problem: 3 modifiers have common members
            //   so parser automaton has hard time deciding which modifiers list to produce -
            //   is it a field, prop or method we are beginning to parse?
            fieldModifier.Rule  = ToTerm("public") | "private" | "readonly" | "volatile";
            propModifier.Rule   = ToTerm("public") | "private" | "readonly" | "override";
            methodModifier.Rule = ToTerm("public") | "private" | "override";

            // conflict resolution
            fieldModifier.ReduceIf(thisSymbol: ";", comesBefore: new string[] { "(", "{" });
            propModifier.ReduceIf(thisSymbol: "{", comesBefore: new string[] { ";", "(" });
            fieldModifierList.ReduceIf(thisSymbol: ";", comesBefore: new string[] { "(", "{" });
            propModifierList.ReduceIf(thisSymbol: "{", comesBefore: new string[] { ";", "(" });


            MarkReservedWords("public", "private", "readonly", "volatile", "override");
        }
コード例 #48
0
      public OperatorGrammar()  {
        var id = new IdentifierTerminal("id");
        var binOp = new NonTerminal("binOp");
        var unOp = new NonTerminal("unOp");
        var expr = new NonTerminal("expr");
        var binExpr = new NonTerminal("binExpr");
        var unExpr = new NonTerminal("unExpr");

        base.Root = expr;
        expr.Rule = id | binExpr | unExpr;
        binExpr.Rule = expr + binOp + expr; 
        binOp.Rule = ToTerm("+") | "-" | "*" | "/";
        unExpr.Rule = unOp + expr;
        unOp.Rule = ToTerm("+") | "-";

        RegisterOperators(10, "+", "-");
        RegisterOperators(20, "*", "/");
        MarkTransient(expr, binOp, unOp);
      }
コード例 #49
0
        public ConflictResolutionTestGrammar4()
            : base(true)
        {
            var name = new IdentifierTerminal("id");

              var stmt = new NonTerminal("Statement");
              var stmtList = new NonTerminal("StatementList");
              var fieldModifier = new NonTerminal("fieldModifier");
              var propModifier = new NonTerminal("propModifier");
              var methodModifier = new NonTerminal("methodModifier");
              var fieldModifierList = new NonTerminal("fieldModifierList");
              var propModifierList = new NonTerminal("propModifierList");
              var methodModifierList = new NonTerminal("methodModifierList");
              var fieldDef = new NonTerminal("fieldDef");
              var propDef = new NonTerminal("propDef");
              var methodDef = new NonTerminal("methodDef");

              //Rules
              this.Root = stmtList;
              stmtList.Rule = MakePlusRule(stmtList, stmt);
              stmt.Rule = fieldDef | propDef | methodDef;
              fieldDef.Rule = fieldModifierList + name + name + ";";
              propDef.Rule = propModifierList + name + name + "{" + "}";
              methodDef.Rule = methodModifierList + name + name + "(" + ")" + "{" + "}";
              fieldModifierList.Rule = MakeStarRule(fieldModifierList, fieldModifier);
              propModifierList.Rule = MakeStarRule(propModifierList, propModifier);
              methodModifierList.Rule = MakeStarRule(methodModifierList, methodModifier);

              // That's the key of the problem: 3 modifiers have common members
              //   so parser automaton has hard time deciding which modifiers list to produce -
              //   is it a field, prop or method we are beginning to parse?
              fieldModifier.Rule = ToTerm("public") | "private" | "readonly" | "volatile";
              propModifier.Rule = ToTerm("public") | "private" | "readonly" | "override";
              methodModifier.Rule = ToTerm("public") | "private" | "override";

              // conflict resolution
              fieldModifier.ReduceIf(thisSymbol: ";", comesBefore: new string[] { "(", "{"});
              propModifier.ReduceIf(thisSymbol: "{", comesBefore: new string[] { ";", "(" });
              fieldModifierList.ReduceIf(thisSymbol: ";", comesBefore: new string[] { "(", "{" });
              propModifierList.ReduceIf(thisSymbol: "{", comesBefore: new string[] { ";", "(" });

              MarkReservedWords("public", "private", "readonly", "volatile", "override");
        }
コード例 #50
0
      public OperatorGrammarHintsOnNonTerms() {
        var id = new IdentifierTerminal("id");
        var binOp = new NonTerminal("binOp");
        var unOp = new NonTerminal("unOp");
        var expr = new NonTerminal("expr");
        var binExpr = new NonTerminal("binExpr");
        var unExpr = new NonTerminal("unExpr");

        base.Root = expr;
        expr.Rule = id | binExpr | unExpr;
        binExpr.Rule = expr + binOp + expr;
        binOp.Rule = ToTerm("+") | "-" | "*" | "/";
        var unOpHint = ImplyPrecedenceHere(30); // Force higher precedence than multiplication precedence
        unExpr.Rule = unOpHint + unOp + expr;
        unOp.Rule = ToTerm("+") | "-";
        RegisterOperators(10, "+", "-");
        RegisterOperators(20, "*", "/");
        MarkTransient(expr, binOp, unOp);
      }
コード例 #51
0
        public ConflictResolutionTestGrammar1()
            : base(true)
        {
            var name = new IdentifierTerminal("id");

              var definition = new NonTerminal("definition");
              var fieldDef = new NonTerminal("fieldDef");
              var propDef = new NonTerminal("propDef");
              var fieldModifier = new NonTerminal("fieldModifier");
              var propModifier = new NonTerminal("propModifier");

              definition.Rule = fieldDef | propDef;
              fieldDef.Rule = fieldModifier + name + name + ";";
              propDef.Rule = propModifier + name + name + "{" + "}";
              fieldModifier.Rule = ToTerm("public") | "private" | "readonly";
              propModifier.Rule = ToTerm("public") | "private" | "override";

              Root = definition;
        }
コード例 #52
0
        public ConflictGrammarWithHintsOnTerms()
          : base(true)
        {
            var name = new IdentifierTerminal("id");

            var stmt = new NonTerminal("Statement");
            var stmtList = new NonTerminal("StatementList");
            var fieldModifier = new NonTerminal("fieldModifier");
            var propModifier = new NonTerminal("propModifier");
            var methodModifier = new NonTerminal("methodModifier");
            var fieldModifierList = new NonTerminal("fieldModifierList");
            var propModifierList = new NonTerminal("propModifierList");
            var methodModifierList = new NonTerminal("methodModifierList");
            var fieldDef = new NonTerminal("fieldDef");
            var propDef = new NonTerminal("propDef");
            var methodDef = new NonTerminal("methodDef");

            //Rules
            this.Root = stmtList;
            stmtList.Rule = MakePlusRule(stmtList, stmt);
            stmt.Rule = fieldDef | propDef | methodDef;
            fieldDef.Rule = fieldModifierList + name + name + ";";
            propDef.Rule = propModifierList + name + name + "{" + "}";
            methodDef.Rule = methodModifierList + name + name + "(" + ")" + "{" + "}";
            fieldModifierList.Rule = MakeStarRule(fieldModifierList, fieldModifier);
            propModifierList.Rule = MakeStarRule(propModifierList, propModifier);
            methodModifierList.Rule = MakeStarRule(methodModifierList, methodModifier);

            fieldModifier.Rule = ToTerm("public") | "private" | "readonly" | "volatile";
            propModifier.Rule = ToTerm("public") | "private" | "readonly" | "override";
            methodModifier.Rule = ToTerm("public") | "private" | "override";

            // conflict resolution
            var fieldHint = new TokenPreviewHint(PreferredActionType.Reduce, thisSymbol: ";", comesBefore: new string[] { "(", "{" });
            fieldModifier.AddHintToAll(fieldHint);
            fieldModifierList.AddHintToAll(fieldHint);
            var propHint = new TokenPreviewHint(PreferredActionType.Reduce, thisSymbol: "{", comesBefore: new string[] { ";", "(" });
            propModifier.AddHintToAll(propHint);
            propModifierList.AddHintToAll(propHint);

            MarkReservedWords("public", "private", "readonly", "volatile", "override");
        }
コード例 #53
0
ファイル: ZestGrammar.cs プロジェクト: TuxMulder/zest
        public ZestGrammar()
        {
            this.GrammarComments = "A grammar for Zest";
            //Terminals
            StringLiteral stringTerm = new StringLiteral("<String>", "\"");
            IdentifierTerminal identifier = new IdentifierTerminal("<Identifier>");
            RegexBasedTerminal number = new RegexBasedTerminal("number", "[0-9]+");

            //Non terminals
            NonTerminal program = new NonTerminal("<Program>");
            NonTerminal testSpecification = new NonTerminal("<TestSpecification>");
            NonTerminal definition = new NonTerminal("<Definition>");
            NonTerminal specificationDeclaration = new NonTerminal("<SpecificationDeclaration>");
            NonTerminal testDeclaration = new NonTerminal("<TestDeclaration>");
            NonTerminal end = new NonTerminal("<End>");
            NonTerminal testHeader = new NonTerminal("<TestHeader>");
            NonTerminal testBody = new NonTerminal("<TestBody>");
            NonTerminal becauseStatement = new NonTerminal("<BecauseStatement>");
            NonTerminal shouldStatement = new NonTerminal("<ShouldStatement>", typeof(ShouldNode));
            NonTerminal identifierList = new NonTerminal("<IdentifierList>");
            NonTerminal returnExpr = new NonTerminal("<ReturnExpr>");
            NonTerminal valueList = new NonTerminal("<valueList>");
            NonTerminal op = new NonTerminal("<Operator>");
            //bnf rules
            program.Rule = testSpecification;
            testSpecification.Rule = definition + ToTerm("sut") + specificationDeclaration + MakeStarRule(testDeclaration, testDeclaration) + end;//not sure the makeplus rule is correct
            definition.Rule = ToTerm("def");
            specificationDeclaration.Rule = identifier | identifier + ToTerm(":") + identifier;
            testDeclaration.Rule = definition + testHeader + MakePlusRule(testBody, testBody) + end;
            end.Rule = ToTerm("end");
            testHeader.Rule = ToTerm("when") + stringTerm;
            testBody.Rule = "because" + becauseStatement | "should" + shouldStatement;
            becauseStatement.Rule = identifier + ToTerm("(") + identifierList + ")" | "csut" + "(" + MakeStarRule(identifierList, identifier) + ")" | identifier + ToTerm("(") + valueList + ")";
            shouldStatement.Rule = ToTerm("return") + returnExpr | "throw" + identifier;
            identifierList.Rule = identifier | MakePlusRule(identifierList, ToTerm(","), identifier);
            valueList.Rule = MakeStarRule(valueList, ToTerm(","), number) | MakeStarRule(valueList, ToTerm(","), stringTerm);
            returnExpr.Rule = number | stringTerm | identifier + op + identifier;
            op.Rule = ToTerm("*") | "+" | "-" | "/";
            this.Root = program;
            this.LanguageFlags = LanguageFlags.CreateAst;
            MarkPunctuation("def", "when", "sut", "(", ")", "csut", "because", "should", "throw", "return", "end", ":");
        }
コード例 #54
0
        public static IdentifierTerminal CreateCSharpIdentifier(string name)
        {
            IdentifierTerminal id = new IdentifierTerminal(name);
              id.SetOption(TermOptions.CanStartWithEscape);
              string strKeywords =
            "abstract as base bool break byte case catch char checked " +
            "class	const	continue decimal default delegate  do double else enum event explicit extern false finally " +
            "fixed float for foreach goto if implicit in int interface internal is lock long namespace " +
            "new null object operator out override params private protected public " +
            "readonly ref return sbyte sealed short sizeof stackalloc static string " +
            "struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void " +
            "volatile while";
              id.AddKeywordList(strKeywords);

              id.AddPrefixFlag("@", ScanFlags.IsNotKeyword | ScanFlags.DisableEscapes);
              //From spec:
              //Start char is "_" or letter-character, which is a Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
              id.StartCharCategories.AddRange(new UnicodeCategory[] {
             UnicodeCategory.UppercaseLetter, //Ul
             UnicodeCategory.LowercaseLetter, //Ll
             UnicodeCategory.TitlecaseLetter, //Lt
             UnicodeCategory.ModifierLetter,  //Lm
             UnicodeCategory.OtherLetter,     //Lo
             UnicodeCategory.LetterNumber     //Nl
              });
              //Internal chars
              /* From spec:
              identifier-part-character: letter-character | decimal-digit-character | connecting-character |  combining-character |
              formatting-character
            */
              id.CharCategories.AddRange(id.StartCharCategories); //letter-character categories
              id.CharCategories.AddRange(new UnicodeCategory[] {
            UnicodeCategory.DecimalDigitNumber, //Nd
            UnicodeCategory.ConnectorPunctuation, //Pc
            UnicodeCategory.SpacingCombiningMark, //Mc
            UnicodeCategory.NonSpacingMark,       //Mn
            UnicodeCategory.Format                //Cf
              });
              //Chars to remove from final identifier
              id.CharsToRemoveCategories.Add(UnicodeCategory.Format);
              return id;
        }
コード例 #55
0
        private IdentifierTerminal CreateIdentifier(string name)
        {
            var term = new IdentifierTerminal(name);
            term.AddPrefix("@", IdOptions.IsNotKeyword);

            term.StartCharCategories.AddRange(new UnicodeCategory[] {
                UnicodeCategory.LowercaseLetter,
                UnicodeCategory.UppercaseLetter,
                UnicodeCategory.TitlecaseLetter,
                UnicodeCategory.ModifierLetter,
                UnicodeCategory.OtherLetter,
                UnicodeCategory.LetterNumber
            });

            term.CharCategories.AddRange(term.StartCharCategories);
            term.CharCategories.AddRange(new UnicodeCategory[] {
                UnicodeCategory.DecimalDigitNumber
            });

            term.CharsToRemoveCategories.Add(UnicodeCategory.Format);
            return term;
        }
コード例 #56
0
        public void TestIdentifier_CaseRestrictions()
        {
            Parser parser; Token token;

            var id = new IdentifierTerminal("identifier");
            id.CaseRestriction = CaseRestriction.None;
            parser = TestHelper.CreateParser(id);

            token = parser.ParseInput("aAbB");
            Assert.True(token != null, "Failed to scan an identifier aAbB.");

            id.CaseRestriction = CaseRestriction.FirstLower;
            parser = TestHelper.CreateParser(id);
            token = parser.ParseInput("BCD");
            Assert.True(token.IsError(), "Erroneously recognized an identifier BCD with FirstLower restriction.");
            token = parser.ParseInput("bCd ");
            Assert.True(token != null && token.ValueString == "bCd", "Failed to scan identifier bCd with FirstLower restriction.");

            id.CaseRestriction = CaseRestriction.FirstUpper;
            parser = TestHelper.CreateParser(id);
            token = parser.ParseInput("cDE");
            Assert.True(TokenCategory.Error == token.Category, "Erroneously recognized an identifier cDE with FirstUpper restriction.");
            token = parser.ParseInput("CdE");
            Assert.True(token != null && token.ValueString == "CdE", "Failed to scan identifier CdE with FirstUpper restriction.");

            id.CaseRestriction = CaseRestriction.AllLower;
            parser = TestHelper.CreateParser(id);
            token = parser.ParseInput("DeF");
            Assert.True(token.IsError(), "Erroneously recognized an identifier DeF with AllLower restriction.");
            token = parser.ParseInput("def");
            Assert.True(token != null && token.ValueString == "def", "Failed to scan identifier def with AllLower restriction.");

            id.CaseRestriction = CaseRestriction.AllUpper;
            parser = TestHelper.CreateParser(id);
            token = parser.ParseInput("EFg ");
            Assert.True(token.IsError(), "Erroneously recognized an identifier EFg with AllUpper restriction.");
            token = parser.ParseInput("EFG");
            Assert.True(token != null && token.ValueString == "EFG", "Failed to scan identifier EFG with AllUpper restriction.");
        }//method
コード例 #57
0
ファイル: IdentifierTerminalTests.cs プロジェクト: cubean/CG
        public void TestIdentifierCaseRestrictions()
        {
            var id = new IdentifierTerminal("identifier");
              id.CaseRestriction = CaseRestriction.None;
              SetTerminal(id);

              TryMatch("aAbB");
              Assert.IsTrue(_token != null, "Failed to scan an identifier aAbB.");

              id.CaseRestriction = CaseRestriction.FirstLower;
              SetTerminal(id);
              TryMatch("BCD");
              Assert.IsTrue(_token == null, "Erroneously recognized an identifier BCD with FirstLower restriction.");
              TryMatch("bCd ");
              Assert.IsTrue(_token != null && _token.ValueString == "bCd", "Failed to scan identifier bCd with FirstLower restriction.");

              id.CaseRestriction = CaseRestriction.FirstUpper;
              SetTerminal(id);
              TryMatch("cDE");
              Assert.IsTrue(_token == null, "Erroneously recognized an identifier cDE with FirstUpper restriction.");
              TryMatch("CdE");
              Assert.IsTrue(_token != null && _token.ValueString == "CdE", "Failed to scan identifier CdE with FirstUpper restriction.");

              id.CaseRestriction = CaseRestriction.AllLower;
              SetTerminal(id);
              TryMatch("DeF");
              Assert.IsTrue(_token == null, "Erroneously recognized an identifier DeF with AllLower restriction.");
              TryMatch("def");
              Assert.IsTrue(_token != null && _token.ValueString == "def", "Failed to scan identifier def with AllLower restriction.");

              id.CaseRestriction = CaseRestriction.AllUpper;
              SetTerminal(id);
              TryMatch("EFg ");
              Assert.IsTrue(_token == null, "Erroneously recognized an identifier EFg with AllUpper restriction.");
              TryMatch("EFG");
              Assert.IsTrue(_token != null && _token.ValueString == "EFG", "Failed to scan identifier EFG with AllUpper restriction.");
        }
コード例 #58
0
        /// <summary>
        /// 使うな
        /// </summary>
        public Kbtter4CommandlineGrammar()
            : base()
        {
            var Number = new NumberLiteral("Number");
            Number.DefaultIntTypes = new[] { TypeCode.Int32, TypeCode.Int64 };
            Number.DefaultFloatType = TypeCode.Double;
            var String = new StringLiteral("String", "\"", StringOptions.AllowsAllEscapes);
            var Identifer = new IdentifierTerminal("Identifer");

            var Value = new NonTerminal("Value");
            var Parameter = new NonTerminal("Parameter");
            var Parameters = new NonTerminal("Parameters");
            var Command = new NonTerminal("Command");

            Value.Rule = Number | String | "true" | "false";
            Parameter.Rule = Identifer + "=>" + Value;
            Parameters.Rule = MakeStarRule(Parameters, ToTerm(","), Parameter);
            Command.Rule = Identifer + Parameters;

            Root = Command;

            MarkTransient(Parameters, Value);
            MarkPunctuation("=>");
        }
コード例 #59
0
		public RefalGrammar() : base(true) // case sensitive
		{
			GrammarComments = "Refal-5 language interpreter based on Irony toolkit.";

			// Terminals
			var Number = new NumberLiteral("Number");
			Number.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
			Number.AddPrefix("0x", NumberOptions.Hex);
			Number.AddSuffix("u", TypeCode.UInt32);
			Number.AddSuffix("l", TypeCode.Int64);
			Number.AddSuffix("ul", TypeCode.UInt64);
			Number.Options |= NumberOptions.IntOnly;

			var CharLiteral = new StringLiteral("Char", "'", StringOptions.AllowsAllEscapes);
			var StringLiteral = new StringLiteral("String", "\"", StringOptions.AllowsAllEscapes);
			var Identifier = new IdentifierTerminal("Identifier", "_-", "");

			var LineComment = new CommentTerminal("LineComment", "*", "\n", "\r");
			LineComment.ValidateToken += LineComment_ValidateToken;

			var BlockComment = new CommentTerminal("BlockComment", "/*", "*/");
			NonGrammarTerminals.Add(LineComment);
			NonGrammarTerminals.Add(BlockComment);

			// Non-terminals
			var Program = new NonTerminal("Program", typeof(Program));
			var Definition = new NonTerminal("Definition");
			var Function = new NonTerminal("Function", typeof(DefinedFunction));
			var External = new NonTerminal("External", typeof(AuxiliaryNode));
			var IdentifierList = new NonTerminal("Identifier+", typeof(AuxiliaryNode));
			var Block = new NonTerminal("Block", typeof(Block));
			var Sentence = new NonTerminal("Sentence", typeof(Sentence));
			var RSentence = new NonTerminal("RSentence", typeof(AuxiliaryNode));
			var SentenceList = new NonTerminal("Sentence+", typeof(AuxiliaryNode));
			var Pattern = new NonTerminal("Pattern", typeof(Pattern));
			var PatternItem = new NonTerminal("PatternItem");
			var PatternInParentheses = new NonTerminal("(Pattern)", typeof(ExpressionInBraces));
			var Expression = new NonTerminal("Expression", typeof(Expression));
			var ExpressionItem = new NonTerminal("ExpressionItem");
			var ExpressionInParentheses = new NonTerminal("(Expression)", typeof(ExpressionInBraces));
			var Var = new NonTerminal("Variable", Variable.CreateVariableNode);
			var VarPrefix = new NonTerminal("VariablePrefix");
			var VarIndex = new NonTerminal("VariableIndex");
			var Symbol = new NonTerminal("Symbol", LiteralValueNodeHelper.InitNode);
			var Call = new NonTerminal("Call", typeof(FunctionCall));
			var FunctionName = new NonTerminal("FunctionName", typeof(AuxiliaryNode));
			var WhereOrWithClause = new NonTerminal("WhereOrWithClause", typeof(Conditions));
			var CommaOrAmpersand = new NonTerminal("CommaOrAmpersand");
			var RWhereOrWithClause = new NonTerminal("RWhereOrWithClause", typeof(AuxiliaryNode));
			var RExpressionOrWhereOrWithClause = new NonTerminal("RExpressionOrWhereOrWithClause");

			var SemicolonOpt = new NonTerminal("[;]", Empty | ";");
			var EntryOpt = new NonTerminal("[ENTRY]", Empty | "$ENTRY");
			var Extern = new NonTerminal("Extern", ToTerm("$EXTRN") | "$EXTERN" | "$EXTERNAL");

			// Rules
			Root = Program;

			Program.Rule = MakePlusRule(Program, Definition);
			Definition.Rule = Function | External;
			External.Rule = Extern + IdentifierList + ";";
			IdentifierList.Rule = MakePlusRule(IdentifierList, ToTerm(","), Identifier);

			Function.Rule = EntryOpt + Identifier + Block + SemicolonOpt;
			Block.Rule = "{" + SentenceList + SemicolonOpt + "}";
			SentenceList.Rule = MakePlusRule(SentenceList, ToTerm(";"), Sentence);

			Sentence.Rule = Pattern + RSentence;
			RSentence.Rule = "=" + Expression | WhereOrWithClause;
			Pattern.Rule = MakeStarRule(Pattern, PatternItem);
			PatternItem.Rule = Var | Symbol | PatternInParentheses;
			PatternInParentheses.Rule = "(" + Pattern + ")";
			Expression.Rule = MakeStarRule(Expression, ExpressionItem);
			ExpressionItem.Rule = Call | Var | Symbol | ExpressionInParentheses;
			ExpressionInParentheses.Rule = "(" + Expression + ")";

			Var.Rule = VarPrefix + "." + VarIndex;
			VarPrefix.Rule = ToTerm("e") | "s" | "t";
			VarIndex.Rule = Number | Identifier;
			Symbol.Rule = StringLiteral | CharLiteral | Number | "True" | "False" | Identifier;
			Call.Rule = "<" + FunctionName + Expression + ">";
			FunctionName.Rule = Identifier | "+" | "-" | "*" | "/";

			WhereOrWithClause.Rule = CommaOrAmpersand + Expression + ":" + RWhereOrWithClause;
			CommaOrAmpersand.Rule = ToTerm(",") | "&";
			RWhereOrWithClause.Rule = Block // with-clause
				| Pattern + RExpressionOrWhereOrWithClause; // where-clause
			RExpressionOrWhereOrWithClause.Rule = ToTerm("=") + Expression | WhereOrWithClause;

			// Punctuation, braces, transient terms, options
			MarkPunctuation("(", ")");
			MarkPunctuation("{", "}");
			MarkPunctuation("<", ">");
			MarkPunctuation("=", ",", "&", ";");

			RegisterBracePair("(", ")");
			RegisterBracePair("<", ">");
			RegisterBracePair("{", "}");

			MarkTransient(Definition, PatternItem, ExpressionItem, SemicolonOpt, EntryOpt, Extern, CommaOrAmpersand, VarPrefix, VarIndex, RExpressionOrWhereOrWithClause);
			LanguageFlags = LanguageFlags.CreateAst | LanguageFlags.SupportsBigInt | LanguageFlags.TailRecursive;
		}
コード例 #60
0
ファイル: SonesGQLGrammar.cs プロジェクト: cosh/sones
        public SonesGQLGrammar(IGraphDB iGraphDb)
            : base(false)
        {
            _iGraphDB = iGraphDb;

            #region SetLanguageFlags

            base.LanguageFlags |= LanguageFlags.CreateAst;
            //this.SetLanguageFlags(LanguageFlags.CreateAst);
            //this.SetLanguageFlags(LanguageFlags.AutoDetectTransient, false);

            #endregion

            #region Terminals

            #region Comments

            //Terminals
            var comment = new CommentTerminal("comment", "/*", "*/");
            var lineComment = new CommentTerminal("line_comment", "--", "\n", "\r\n");
            //TODO: remove block comment, added for testing LUA-style comments
            var blockComment = new CommentTerminal("block_comment", "--[[", "]]");
            NonGrammarTerminals.Add(comment);
            NonGrammarTerminals.Add(lineComment);
            NonGrammarTerminals.Add(blockComment);

            #endregion

            #region Available value defs: Number, String, Name

            var number = new NumberLiteral("number", NumberOptions.AllowSign | NumberOptions.DisableQuickParse);
            number.DefaultIntTypes = new TypeCode[] { TypeCode.UInt64, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            var string_literal = new StringLiteral("string", "'", StringOptions.AllowsDoubledQuote | StringOptions.AllowsLineBreak);
            var location_literal = new StringLiteral("file", "'", StringOptions.AllowsDoubledQuote | StringOptions.AllowsLineBreak | StringOptions.NoEscapes);

            var name = new IdentifierTerminal("name", "ִײ�הצ��0123456789_", "ִײ�הצ�0123456789$_");

            #endregion

            //var name_ext            = TerminalFactory.CreateSqlExtIdentifier("name_ext"); //removed, because we do not want to hav types or sth else with whitespaces, otherwise it conflicts with tupleSet

            #region Symbols

            S_CREATE = ToTerm("CREATE");
            S_comma = ToTerm(",");
            S_dot = ToTerm(".");
            S_ASTERISK = ToTerm("*");
            S_EQUALS = ToTerm("=");
            S_QUESTIONMARK_EQUALS = ToTerm("?=");

            S_colon = ToTerm(":");
            S_BRACKET_LEFT = ToTerm(TERMINAL_BRACKET_LEFT);
            S_BRACKET_RIGHT = ToTerm(TERMINAL_BRACKET_RIGHT);
            S_TUPLE_BRACKET_LEFT = ToTerm("[");
            S_TUPLE_BRACKET_RIGHT = ToTerm("]");
            S_edgeInformationDelimiterSymbol = ToTerm(SonesGQLConstants.EdgeInformationDelimiterSymbol);
            S_edgeTraversalDelimiter = ToTerm(SonesGQLConstants.EdgeTraversalDelimiterSymbol);
            S_NULL = ToTerm("NULL");
            S_NOT = ToTerm("NOT");
            S_UNIQUE = ToTerm("UNIQUE");
            S_WITH = ToTerm("WITH");
            S_ALTER = ToTerm("ALTER");
            S_ADD = ToTerm("ADD");
            S_TO = ToTerm("TO");
            S_COLUMN = ToTerm("COLUMN");
            S_DROP = ToTerm("DROP");
            S_RENAME = ToTerm("RENAME");
            S_CONSTRAINT = ToTerm("CONSTRAINT");
            S_INDEX = ToTerm("INDEX");
            S_INDICES = ToTerm("INDICES");
            S_ON = ToTerm("ON");
            S_KEY = ToTerm("KEY");
            S_INSERT = ToTerm("INSERT");
            S_INTO = ToTerm("INTO");
            S_UPDATE = ToTerm("UPDATE");
            S_INSERTORUPDATE = ToTerm("INSERTORUPDATE");
            S_INSERTORREPLACE = ToTerm("INSERTORREPLACE");
            S_REPLACE = ToTerm("REPLACE");
            S_SET = ToTerm(TERMINAL_SET);
            S_REMOVE = ToTerm("REMOVE");
            S_VALUES = ToTerm("VALUES");
            S_DELETE = ToTerm("DELETE");
            S_SELECT = ToTerm("SELECT");
            S_FROM = ToTerm("FROM");
            S_AS = ToTerm("AS");
            S_COUNT = ToTerm("COUNT");
            S_JOIN = ToTerm("JOIN");
            S_BY = ToTerm("BY");
            S_WHERE = ToTerm("WHERE");
            S_TYPE = ToTerm("TYPE");
            S_TYPES = ToTerm("TYPES");
            S_VERTEX = ToTerm("VERTEX");
            S_VERTICES = ToTerm("VERTICES");
            S_EDITION = ToTerm("EDITION");
            S_INDEXTYPE = ToTerm("INDEXTYPE");
            S_LIST = ToTerm(TERMINAL_LIST);
            S_ListTypePrefix = ToTerm(TERMINAL_LT);
            S_ListTypePostfix = ToTerm(TERMINAL_GT);
            S_EXTENDS = ToTerm("EXTENDS");
            S_ATTRIBUTES = ToTerm("ATTRIBUTES");
            S_LIMIT = ToTerm("LIMIT");
            S_DEPTH = ToTerm("DEPTH");
            S_REFERENCE = ToTerm("REFERENCE");
            S_REF = ToTerm("REF");
            S_REFUUID = ToTerm("REFUUID");
            S_REFERENCEUUID = ToTerm("REFERENCEUUID");
            S_LISTOF = ToTerm(SonesGQLConstants.LISTOF);
            S_SETOF = ToTerm(SonesGQLConstants.SETOF);
            S_SETOFUUIDS = ToTerm(SonesGQLConstants.SETOFUUIDS);
            S_UUID = ToTerm("VertexID");
            S_OFFSET = ToTerm("OFFSET");
            S_TRUNCATE = ToTerm("TRUNCATE");
            S_TRUE = ToTerm(TERMINAL_TRUE);
            S_FALSE = ToTerm(TERMINAL_FALSE);
            S_ASC = ToTerm(TERMINAL_ASC);
            S_DESC = ToTerm(TERMINAL_DESC);
            S_QUEUESIZE = ToTerm(TERMINAL_QUEUESIZE);
            S_WEIGHTED = ToTerm(TERMINAL_WEIGHTED);
            S_GET = ToTerm("GET");
            S_ATTRIBUTE = ToTerm("ATTRIBUTE");
            S_DEFAULT = ToTerm("DEFAULT");
            S_INCOMINGEDGE = ToTerm(SonesGQLConstants.INCOMINGEDGE);
            S_INCOMINGEDGES = ToTerm(SonesGQLConstants.INCOMINGEDGES);
            S_DESCRIBE = ToTerm("DESCRIBE");
            S_FUNCTION = ToTerm("FUNCTION");
            S_FUNCTIONS = ToTerm("FUNCTIONS");
            S_AGGREGATE = ToTerm("AGGREGATE");
            S_AGGREGATES = ToTerm("AGGREGATES");
            S_INDICES = ToTerm("INDICES");
            S_EDGE = ToTerm("EDGE");
            S_EDGES = ToTerm("EDGES");
            S_MANDATORY = ToTerm("MANDATORY");
            S_ABSTRACT = ToTerm("ABSTRACT");
            S_BEGIN = ToTerm("BEGIN");
            S_TRANSACTION = ToTerm("TRANSACTION");
            S_TRANSACTDISTRIBUTED = ToTerm(SonesGQLConstants.TRANSACTION_DISTRIBUTED);
            S_TRANSACTLONGRUNNING = ToTerm(SonesGQLConstants.TRANSACTION_LONGRUNNING);
            S_TRANSACTISOLATION = ToTerm(SonesGQLConstants.TRANSACTION_ISOLATION);
            S_TRANSACTNAME = ToTerm(SonesGQLConstants.TRANSACTION_NAME);
            S_TRANSACTTIMESTAMP = ToTerm(SonesGQLConstants.TRANSACTION_TIMESTAMP);
            S_TRANSACTROLLBACK = ToTerm(SonesGQLConstants.TRANSACTION_ROLLBACK);
            S_TRANSACTCOMMIT = ToTerm(SonesGQLConstants.TRANSACTION_COMMIT);
            S_TRANSACTCOMROLLASYNC = ToTerm(SonesGQLConstants.TRANSACTION_COMROLLASYNC);
            S_ADDTOLIST = ToTerm("+=");
            S_REMOVEFROMLIST = ToTerm("-=");
            S_DUMP = ToTerm("DUMP");
            S_EXPORT = ToTerm("EXPORT");
            S_ALL = ToTerm("ALL");
            S_GDDL = ToTerm("GDDL");
            S_GDML = ToTerm("GDML");
            S_GQL = ToTerm("GQL");
            S_CSV = ToTerm("CSV");
            S_COMMENT = ToTerm("COMMENT");
            S_REBUILD = ToTerm("REBUILD");
            S_DEFINE = ToTerm("DEFINE");
            S_UNDEFINE = ToTerm("UNDEFINE");
            S_VIA = ToTerm("VIA");
            S_LINK = ToTerm("LINK");
            S_UNLINK = ToTerm("UNLINK");
            S_USE = ToTerm("USE");

            #region IMPORT

            S_IMPORT = ToTerm("IMPORT");
            S_COMMENTS = ToTerm("COMMENTS");
            S_PARALLELTASKS = ToTerm("PARALLELTASKS");
            S_VERBOSITY = ToTerm("VERBOSITY");
            S_FORMAT = ToTerm("FORMAT");

            #endregion

            #region options

            S_OPTIONS = ToTerm("OPTIONS");

            #endregion

            #endregion

            #endregion

            #region Non-Terminals

            #region ID related

            NT_Id = new NonTerminal("Id", CreateIDNode);
            var Id_simple = new NonTerminal("id_simple", typeof(AstNode));
            var id_typeAndAttribute = new NonTerminal("id_typeAndAttribute");
            var idlist = new NonTerminal("idlist");
            var id_simpleList = new NonTerminal("id_simpleList");
            var id_simpleDotList = new NonTerminal("id_simpleDotList");
            var IdOrFunc = new NonTerminal("IdOrFunc");
            var IdOrFuncList = new NonTerminal("IdOrFuncList", CreateIDNode);
            var IDOrFuncDelimiter = new NonTerminal("IDOrFuncDelimiter");
            var dotWrapper = new NonTerminal("dotWrapper", CreateDotDelimiter);
            var edgeAccessorWrapper = new NonTerminal("edgeAccessorWrapper", CreateEdgeAccessorDelimiter);
            var EdgeInformation = new NonTerminal("EdgeInformation", CreateEdgeInformation);
            var EdgeTraversalWithFunctions = new NonTerminal("EdgeTraversalWithFunctions", CreateEdgeTraversal);
            var EdgeTraversalWithOutFunctions = new NonTerminal("EdgeTraversalWithOutFunctions", CreateEdgeTraversal);

            #endregion

            #region AStatements

            var singlestmt = new NonTerminal("singlestmt");
            var createIndexStmt = new NonTerminal("createIndexStmt", CreateCreateIndexStatementNode);
            var alterVertexTypeStmt = new NonTerminal("alterVertexTypeStmt", CreateAlterVertexTypeStmNode);
            var alterEdgeTypeStmt = new NonTerminal("alterEdgeTypeStmt", CreateAlterEdgeTypeStmNode);
            var dropVertexTypeStmt = new NonTerminal("dropVertexTypeStmt", CreateDropVertexTypeStmNode);
            var dropEdgeTypeStmt = new NonTerminal("dropEdgeTypeStmt", CreateDropEdgeTypeStmNode);
            var dropIndexStmt = new NonTerminal("dropIndexStmt", CreateDropIndexStmNode);
            var InsertStmt = new NonTerminal("InsertStmt", CreateInsertStatementNode);
            var updateStmt = new NonTerminal("updateStmt", CreateUpdateStatementNode);
            var updateEdgesStmt = new NonTerminal("updateStmt", CreateUpdateEdgesStatementNode);
            var deleteStmt = new NonTerminal("deleteStmt", CreateDeleteStatementNode);
            var SelectStmtGraph = new NonTerminal("SelectStmtGraph", CreateSelectStatementNode);
            var parSelectStmt = new NonTerminal("parSelectStmt", CreatePartialSelectStmtNode);
            var createTypesStmt = new NonTerminal("createTypesStmt", CreateCreateVertexTypesStatementNode);
            var createEdgeTypesStmt = new NonTerminal("createEdgeTypeStmt", CreateCreateEdgeTypesStatementNode);
            var insertorupdateStmt = new NonTerminal("insertorupdateStmt", CreateInsertOrUpdateStatementNode);
            var insertorreplaceStmt = new NonTerminal("insertorreplaceStmt", CreateInsertOrReplaceStatementNode);
            var replaceStmt = new NonTerminal("replaceStmt", CreateReplaceStatementNode);
            var transactStmt = new NonTerminal("transactStmt", CreateTransActionStatementNode);
            var commitRollBackTransactStmt = new NonTerminal("commitRollBackTransactStmt", CreateCommitRollbackTransActionNode);
            var linkStmt = new NonTerminal("linkStmt", CreateLinkStmtNode);
            var unlinkStmt = new NonTerminal("unlinkStmt", CreateUnlinkStmt);

            #endregion

            var deleteStmtMember = new NonTerminal("deleteStmtMember");
            var uniqueOpt = new NonTerminal("uniqueOpt", typeof(UniqueOptNode));
            var IndexAttributeList = new NonTerminal("IndexAttributeList", typeof(IndexAttributeListNode));
            var IndexAttributeMember = new NonTerminal("IndexAttributeMember", typeof(IndexAttributeNode));
            var IndexAttributeType = new NonTerminal("IndexAttributeType");
            var orderByAttributeList = new NonTerminal("orderByAttributeList");
            var orderByAttributeListMember = new NonTerminal("orderByAttributeListMember");
            var AttributeOrderDirectionOpt = new NonTerminal("AttributeOrderDirectionOpt");
            NT_IndexTypeOpt = new NonTerminal("indexTypeOpt", typeof(IndexTypeOptNode));
            var indexNameOpt = new NonTerminal("indextNameOpt", typeof(IndexNameOptNode));
            var editionOpt = new NonTerminal("editionOpt", typeof(EditionOptNode));
            var alterVertexTypeCmd = new NonTerminal("alterVertexTypeCmd", typeof(AlterVertexTypeCommandNode));
            var alterVertexTypeCmdList = new NonTerminal("alterVertexTypeCmdList");
            var alterEdgeTypeCmd = new NonTerminal("alterEdgeTypeCmd", typeof(AlterEdgeTypeCommandNode));
            var alterEdgeTypeCmdList = new NonTerminal("alterEdgeTypeCmdList");
            var insertData = new NonTerminal("insertData");
            var intoOpt = new NonTerminal("intoOpt");
            var assignList = new NonTerminal("assignList");
            NT_whereClauseOpt = new NonTerminal("whereClauseOpt", CreateWhereExpressionNode);
            var extendsOpt = new NonTerminal("extendsOpt");
            var abstractOpt = new NonTerminal("abstractOpt");
            var commentOpt = new NonTerminal("CommentOpt");
            var bulkVertexTypeList = new NonTerminal("bulkVertexTypeList");
            var bulkEdgeTypeList = new NonTerminal("bulkEdgeTypeList");
            var vertexTypeAttributesOpt = new NonTerminal("vertexTypeAttributesOpt");
            var edgeTypeAttributesOpt = new NonTerminal("edgeTypeAttributesOpt");
            var insertValuesOpt = new NonTerminal("insertValuesOpt");
            NT_UseIndex = new NonTerminal("useIndexOpt", CreateUseIndexNode);

            #region Expression

            NT_Expression = new NonTerminal("expression", typeof(ExpressionNode));
            var expressionOfAList = new NonTerminal("expressionOfAList", typeof(ExpressionOfAListNode));
            var BNF_ExprList = new NonTerminal("exprList");
            var unExpr = new NonTerminal("unExpr", CreateUnExpressionNode);
            var unOp = new NonTerminal("unOp");
            var binExpr = new NonTerminal("binExpr", CreateBinaryExpressionNode);
            var binOp = new NonTerminal("binOp");
            var inExpr = new NonTerminal("inExpr");

            #endregion

            #region Select

            var selList = new NonTerminal("selList");
            var fromClauseOpt = new NonTerminal("fromClauseOpt");
            var groupClauseOpt = new NonTerminal("groupClauseOpt");
            var havingClauseOpt = new NonTerminal("havingClauseOpt", typeof(HavingExpressionNode));
            var orderClauseOpt = new NonTerminal("orderClauseOpt", typeof(OrderByNode));
            var selectionList = new NonTerminal("selectionList");
            var selectionListElement = new NonTerminal("selectionListElement", typeof(SelectionListElementNode));
            var aliasOpt = new NonTerminal("aliasOpt");
            var aliasOptName = new NonTerminal("aliasOptName");
            var selectOutputOpt = new NonTerminal("selectOutputOpt", typeof(SelectOutputOptNode));

            #endregion

            #region Aggregates & Functions

            NT_Aggregate = new NonTerminal("aggregate", CreateAggregateNode);
            NT_AggregateArg = new NonTerminal("aggregateArg");
            var function = new NonTerminal("function", CreateFunctionCallNode);
            var functionName = new NonTerminal("functionName");
            NT_FunArgs = new NonTerminal("funArgs");
            NT_FuncCall = new NonTerminal("funCall", CreateFunctionCallNode);

            #endregion

            #region Tuple

            var tuple = new NonTerminal("tuple", typeof(TupleNode));
            var bracketLeft = new NonTerminal(SonesGQLConstants.BracketLeft);
            var bracketRight = new NonTerminal(SonesGQLConstants.BracketRight);

            #endregion

            var term = new NonTerminal("term");
            var notOpt = new NonTerminal("notOpt");

            var VertexType = new NonTerminal(SonesGQLConstants.VertexType, CreateVertexTypeNode);
            var EdgeType = new NonTerminal(SonesGQLConstants.EdgeType, CreateEdgeTypeNode);
            var VertexTypeAttributeList = new NonTerminal("VertexTypeAttributeList");
            var VertexTypeAttrDefinition = new NonTerminal("VertexTypeAttrDefinition", CreateVertexTypeAttributeDefinitionNode);
            var EdgeTypeAttributeList = new NonTerminal("EdgeTypeAttributeList");
            var EdgeTypeAttrDefinition = new NonTerminal("EdgeTypeAttrDefinition", CreateEdgeTypeAttributeDefinitionNode);
            var ResultObject = new NonTerminal("ResultObject");
            var ResultList = new NonTerminal("ResultList");
            var PrefixOperation = new NonTerminal("PrefixOperation");
            var ParameterList = new NonTerminal("ParameterList");
            var VertexTypeList = new NonTerminal("TypeList", CreateVertexTypeListNode);
            NT_AType = new NonTerminal("AType", CreateATypeNode);
            NT_VertexType = new NonTerminal("AType", CreateATypeNode);
            var VertexTypeWrapper = new NonTerminal("TypeWrapper");

            #region Attribute changes

            var AttrAssignList = new NonTerminal("AttrAssignList", CreateAttrAssignListNode);
            var AttrUpdateList = new NonTerminal("AttrUpdateList", typeof(AttributeUpdateOrAssignListNode));
            var EdgeAttrUpdateList = new NonTerminal("EdgeAttrUpdateList", typeof(EdgeAttributeUpdateListNode));
            var AttrAssign = new NonTerminal("AttrAssign", typeof(AttributeAssignNode));
            var AttrRemove = new NonTerminal("AttrRemove", typeof(AttributeRemoveNode));
            var ListAttrUpdate = new NonTerminal("AttrUpdate");
            var AddToListAttrUpdate = new NonTerminal("AddToListAttrUpdate", typeof(AddToListAttrUpdateNode));
            var AddToListAttrUpdateAddTo = new NonTerminal("AddToListAttrUpdateAddTo", CreateAddToListAttrUpdateAddToNode);
            var AddToListAttrUpdateOperator = new NonTerminal("AddToListAttrUpdateOperator", CreateAddToListAttrUpdateOperatorNode);
            var RemoveFromListAttrUpdateAddToRemoveFrom = new NonTerminal("RemoveFromListAttrUpdateAddToRemoveFrom", CreateRemoveFromListAttrUpdateAddToRemoveFromNode);
            var RemoveFromListAttrUpdateAddToOperator = new NonTerminal("RemoveFromListAttrUpdateAddToOperator", CreateRemoveFromListAttrUpdateAddToOperatorNode);
            var RemoveFromListAttrUpdateScope = new NonTerminal("RemoveFromListAttrUpdateScope", CreateRemoveFromListAttrUpdateScope);
            var EdgeAttrUpdate = new NonTerminal("EdgeAttrUpdate", typeof(EdgeAttributeUpdateNode));
            var AttrUpdateOrAssign = new NonTerminal("AttrUpdateOrAssign");
            var CollectionOfDBObjects = new NonTerminal("ListOfDBObjects", typeof(CollectionOfDBObjectsNode));
            var CollectionOfEdges = new NonTerminal("ListOfEdges", typeof(CollectionOfEdgesNode));
            var CollectionOfBasicDBObjects = new NonTerminal("ListOfBasicDBObjects", typeof(CollectionOfBasicDBObjectsNode));
            var VertexTypeVertexIDCollection = new NonTerminal("VertexTypeVertexIDCollection", CreateVertexTypeVertexIDCollection);
            var VertexTypeVertexElement = new NonTerminal("VertexTypeVertexElement", CreateVertexTypeVertexElement);
            var CollectionTuple = new NonTerminal("CollectionTuple", typeof(TupleNode));
            var ExtendedExpressionList = new NonTerminal("ExtendedExpressionList");
            var ExtendedExpression = new NonTerminal("ExtendedExpression", typeof(ExpressionOfAListNode));

            #endregion

            var Reference = new NonTerminal("REFERENCE", typeof(SetRefNode));
            var offsetOpt = new NonTerminal("offsetOpt", typeof(OffsetNode));
            var resolutionDepthOpt = new NonTerminal("resolutionDepthOpt");
            var limitOpt = new NonTerminal("limitOpt", typeof(LimitNode));
            var SimpleIdList = new NonTerminal("SimpleIdList");
            var bulkVertexTypeListMember = new NonTerminal("bulkVertexTypeListMember", CreateBulkVertexTypeListMemberNode);
            var bulkEdgeTypeListMember = new NonTerminal("bulkEdgeTypeListMember", CreateBulkEdgeTypeListMemberNode);
            var bulkVertexType = new NonTerminal("bulVertexkType", CreateBulkVertexTypeNode);
            var bulkEdgeType = new NonTerminal("bulkEdgeType", CreateBulkEdgeTypeNode);
            var truncateStmt = new NonTerminal("truncateStmt", CreateTruncateStmNode);
            var uniquenessOpt = new NonTerminal("UniquenessOpt", typeof(UniqueAttributesOptNode));
            var mandatoryOpt = new NonTerminal("MandatoryOpt", typeof(MandatoryOptNode));

            #region Transactions

            var TransactOptions = new NonTerminal("TransactOptions");
            var TransactAttributes = new NonTerminal("TransactAttributes");
            var TransactIsolation = new NonTerminal("TransactIsolation");
            var TransactName = new NonTerminal("TransactName");
            var TransactTimestamp = new NonTerminal("TransactTimestamp");
            var TransactCommitRollbackOpt = new NonTerminal("TransactCommitRollbackOpt");
            var TransactCommitRollbackType = new NonTerminal("TransactCommitRollbackType");

            #endregion

            var KeyValuePair = new NonTerminal("KeyValuePair", CreateKeyValuePairNode);
            NT_KeyValueList = new NonTerminal("ValueList", CreateKeyValueListNode);
            var BooleanVal = new NonTerminal("BooleanVal");
            var Values = new NonTerminal("Values");
            NT_Options = new NonTerminal("Options", CreateOptionsNode);
            var ExtKeyValuePair = new NonTerminal("ExtKeyValuePair", CreateExtendedKeyValuePairNode);
            NT_ExtKeyValueList = new NonTerminal("ExtValueList", CreateExtendedKeyValueListNode);

            var ListType = new NonTerminal("ListType");
            var ListParametersForExpression = new NonTerminal("ListParametersForExpression", typeof(ParametersNode));
            var LinkCondition = new NonTerminal("LinkCondition");

            #region EdgeType

            var EdgeTypeDef = new NonTerminal("EdgeTypeDef", CreateEdgeTypeDefNode);
            var SingleEdgeTypeDef = new NonTerminal("EdgeTypeDef", CreateSingleEdgeTypeDefNode);
            var DefaultValueDef = new NonTerminal("DefaultValueDef", typeof(DefaultValueDefNode));
            var EdgeTypeParams = new NonTerminal("EdgeTypeParams", typeof(EdgeTypeParamsNode));
            var EdgeTypeParam = new NonTerminal("EdgeTypeParamNode", typeof(EdgeTypeParamNode));
            var EdgeType_Sorted = new NonTerminal("ListPropertyAssign_Sorted", typeof(EdgeType_SortedNode));
            var EdgeType_SortedMember = new NonTerminal("ListPropertyAssign_SortedMember");
            var AttrDefaultOpValue = new NonTerminal("AttrDefaultOpValue", CreateAttrDefaultValueNode);

            #endregion

            #region IncomingEdges

            var incomingEdgesOpt = new NonTerminal("IncomingEdges", CreateIncomingEdgesNode);
            var IncomingEdgesSingleDef = new NonTerminal("IncomingEdgesSingleDef", CreateBackwardEdgeNode);
            var IncomingEdgesList = new NonTerminal("IncomingEdgesList");

            #endregion

            #region Index

            var indexOptOnCreateType = new NonTerminal("IndexOptOnCreateType");
            var indexOnCreateType = new NonTerminal("indexOnCreateType", CreateIndexOnCreateType);
            var IndexOptOnCreateTypeMember = new NonTerminal("IndexOptOnCreateTypeMember", CreateIndexOptOnCreateTypeMemberNode);
            var IndexOptOnCreateTypeMemberList = new NonTerminal("IndexOptOnCreateTypeMemberList");
            var IndexDropOnAlterType = new NonTerminal("IndexDropOnAlterType", CreateDropIndicesNode);
            var IndexDropOnAlterTypeMember = new NonTerminal("IndexDropOnAlterTypeMember");
            var IndexDropOnAlterTypeMemberList = new NonTerminal("IndexDropOnAlterTypeMemberList");

            #endregion

            #region Dump/Export

            var dumpStmt = new NonTerminal("Dump", CreateDumpNode);
            var dumpType = new NonTerminal("dumpType", CreateDumpTypeNode);
            var dumpFormat = new NonTerminal("dumpFormat", CreateDumpFormatNode);
            var typeOptionalList = new NonTerminal("typeOptionalList");
            var dumpDestination = new NonTerminal("dumpDestination");

            #endregion

            #region Describe

            var DescrInfoStmt = new NonTerminal("DescrInfoStmt", CreateDescribeNode);
            var DescrArgument = new NonTerminal("DescrArgument");
            var DescrFuncStmt = new NonTerminal("DescrFuncStmt", CreateDescrFunc);
            var DescrFunctionsStmt = new NonTerminal("DescrFunctionsStmt", CreateDescrFunctions);
            var DescrAggrStmt = new NonTerminal("DescrAggrStmt", CreateDescrAggr);
            var DescrAggrsStmt = new NonTerminal("DescrAggrsStmt", CreateDescrAggrs);
            var DescrTypeStmt = new NonTerminal("DescrTypeStmt", CreateDescrType);
            var DescrTypesStmt = new NonTerminal("DescrTypesStmt", CreateDescrTypes);
            var DescrIdxStmt = new NonTerminal("DescrIdxStmt", CreateDescrIdx);
            var DescrIdxsStmt = new NonTerminal("DescrIdxsStmt", CreateDescrIdxs);
            var DescrIdxEdtStmt = new NonTerminal("DescrIdxEdtStmt");
            var DescrDedicatedIdxStmt = new NonTerminal("DescrDedicatedIdxStmt");
            var DescrEdgeStmt = new NonTerminal("DescrEdgeStmt", CreateDescrEdge);
            var DescrEdgesStmt = new NonTerminal("DescrEdgesStmt", CreateDescrEdges);

            #endregion

            #region REBUILD INDICES

            var rebuildIndicesStmt = new NonTerminal("rebuildIndicesStmt", CreateRebuildIndicesNode);
            var rebuildIndicesTypes = new NonTerminal("rebuildIndiceTypes");

            #endregion

            #region Import

            NT_ImportFormat = new NonTerminal("importFormat");
            NT_ImportStmt = new NonTerminal("import", CreateImportNode);
            var paramParallelTasks = new NonTerminal("parallelTasks", CreateParallelTaskNode);
            var paramComments = new NonTerminal("comments", CreateCommentsNode);
            var verbosity = new NonTerminal("verbosity", CreateVerbosityNode);
            var verbosityTypes = new NonTerminal("verbosityTypes");

            #endregion

            #endregion

            #region Statements

            #region GQL root

            //BNF Rules
            this.Root = singlestmt;

            singlestmt.Rule = SelectStmtGraph
                            | InsertStmt
                            | alterVertexTypeStmt
                            | alterEdgeTypeStmt
                            | updateStmt
                            | updateEdgesStmt
                            | dropVertexTypeStmt
                            | dropEdgeTypeStmt
                            | dropIndexStmt
                            | createIndexStmt
                            | createTypesStmt
                            | createEdgeTypesStmt
                            | deleteStmt
                            | truncateStmt
                            | DescrInfoStmt
                            | insertorupdateStmt
                            | insertorreplaceStmt
                            | replaceStmt
                            | dumpStmt
                            | transactStmt
                            | commitRollBackTransactStmt
                            | rebuildIndicesStmt
                            | NT_ImportStmt
                            | linkStmt
                            | unlinkStmt;

            #endregion

            #region misc

            #region ID

            #region wo functions

            Id_simple.Rule = name;

            EdgeTraversalWithOutFunctions.Rule = dotWrapper + Id_simple;

            NT_Id.SetFlag(TermFlags.IsList);
            NT_Id.Rule = Id_simple
                        | NT_Id + EdgeTraversalWithOutFunctions;
            //old
            //Id.Rule = MakePlusRule(Id, dotWrapper, Id_simple);

            idlist.Rule = MakePlusRule(idlist, S_comma, NT_Id);
            id_simpleList.Rule = MakePlusRule(id_simpleList, S_comma, Id_simple);
            id_simpleDotList.Rule = MakePlusRule(id_simpleDotList, S_dot, Id_simple);
            id_typeAndAttribute.Rule = VertexTypeWrapper + S_dot + NT_Id;

            #endregion

            #region ID_or_Func

            IdOrFunc.Rule = name
                            | NT_FuncCall;

            dotWrapper.Rule = S_edgeTraversalDelimiter;

            edgeAccessorWrapper.Rule = S_edgeInformationDelimiterSymbol;

            //IDOrFuncDelimiter.Rule =        dotWrapper
            //                            |   edgeAccessorWrapper;

            EdgeTraversalWithFunctions.Rule = dotWrapper + IdOrFunc;

            EdgeInformation.Rule = edgeAccessorWrapper + Id_simple;

            IdOrFuncList.SetFlag(TermFlags.IsList);
            IdOrFuncList.Rule = IdOrFunc
                                    | IdOrFuncList + EdgeInformation
                                    | IdOrFuncList + EdgeTraversalWithFunctions;

            //old
            //IdOrFuncList.Rule = MakePlusRule(IdOrFuncList, IDOrFuncDelimiter, IdOrFunc);

            #endregion

            #endregion

            #region typeList

            VertexTypeList.Rule = MakePlusRule(VertexTypeList, S_comma, NT_AType);

            NT_AType.Rule = Id_simple + Id_simple
                        | Id_simple;

            NT_VertexType.Rule = Id_simple;

            //AType.Rule = Id + Id_simple
            //                | Id;

            VertexTypeWrapper.Rule = NT_AType;

            #endregion

            #region CreateIndexAttribute

            IndexAttributeList.Rule = MakePlusRule(IndexAttributeList, S_comma, IndexAttributeMember);

            IndexAttributeMember.Rule = IndexAttributeType;// + AttributeOrderDirectionOpt;

            IndexAttributeType.Rule = IdOrFuncList;// Id_simple | id_typeAndAttribute;

            #endregion

            #region OrderDirections

            AttributeOrderDirectionOpt.Rule = Empty
                                                | S_ASC
                                                | S_DESC;

            #endregion

            #region Boolean

            BooleanVal.Rule = S_TRUE | S_FALSE;

            #endregion

            #region KeyValue

            KeyValuePair.Rule = Id_simple + "=" + string_literal
                                | Id_simple + "=" + number
                                | Id_simple + "=" + BooleanVal;

            NT_KeyValueList.Rule = MakePlusRule(NT_KeyValueList, S_comma, KeyValuePair);

            #endregion

            #region ExtendedKeyValue

            ExtKeyValuePair.Rule = Id_simple + "=" + string_literal
                                    | Id_simple + "=" + number
                                    | Id_simple + "=" + BooleanVal
                                    | Id_simple + "=" + CollectionOfBasicDBObjects;

            NT_ExtKeyValueList.Rule = MakePlusRule(NT_ExtKeyValueList, S_comma, ExtKeyValuePair);

            CollectionOfBasicDBObjects.Rule = Empty
                                              | S_SETOF + CollectionTuple
                                              | S_LISTOF + CollectionTuple;

            #endregion

            #region ListType

            ListType.Rule = S_LIST;

            ListParametersForExpression.Rule = Empty
                                         | S_colon + S_BRACKET_LEFT + NT_ExtKeyValueList + S_BRACKET_RIGHT;

            EdgeType_SortedMember.Rule = S_ASC | S_DESC;
            EdgeType_Sorted.Rule = S_SORTED + "=" + EdgeType_SortedMember;

            #endregion

            #region GraphType

            //                 SET<                   WEIGHTED  (Double, DEFAULT=2, SORTED=DESC)<   [idsimple]  >>
            //EdgeTypeDef.Rule = S_SET + S_ListTypePrefix + Id_simple + S_BRACKET_LEFT + EdgeTypeParams + S_BRACKET_RIGHT + S_ListTypePrefix + Id_simple + S_ListTypePostfix + S_ListTypePostfix;
            //                 SET     <                  USER        (                WEIGHTED    )                 >
            EdgeTypeDef.Rule = S_SET + S_ListTypePrefix + Id_simple + S_BRACKET_LEFT + Id_simple + S_BRACKET_RIGHT + S_ListTypePostfix;

            //                       COUNTED        (Integer, DEFAULT=2)                   <   [idsimple]  >
            //SingleEdgeTypeDef.Rule = Id_simple + S_BRACKET_LEFT + EdgeTypeParams + S_BRACKET_RIGHT + S_ListTypePrefix + Id_simple + S_ListTypePostfix;

            //                       USER        (                COUNTED     )
            SingleEdgeTypeDef.Rule = Id_simple + S_BRACKET_LEFT + Id_simple + S_BRACKET_RIGHT;

            EdgeTypeParams.Rule = MakeStarRule(EdgeTypeParams, S_comma, EdgeTypeParam);
            EdgeTypeParam.Rule = Id_simple
                               | DefaultValueDef
                               | EdgeType_Sorted
                               | string_literal;

            EdgeTypeParam.SetFlag(TermFlags.IsTransient, false);

            DefaultValueDef.Rule = S_DEFAULT + "=" + KeyValuePair;

            VertexType.Rule = Id_simple
                                   | S_LIST + S_ListTypePrefix + Id_simple + S_ListTypePostfix
                                   | S_SET + S_ListTypePrefix + Id_simple + S_ListTypePostfix
                                   | EdgeTypeDef
                                   | SingleEdgeTypeDef;

            EdgeType.Rule = Id_simple
                                   | S_LIST + S_ListTypePrefix + Id_simple + S_ListTypePostfix
                                   | S_SET + S_ListTypePrefix + Id_simple + S_ListTypePostfix;

            #endregion

            #region TypeAttributeList

            VertexTypeAttributeList.Rule = MakePlusRule(VertexTypeAttributeList, S_comma, VertexTypeAttrDefinition);

            VertexTypeAttrDefinition.Rule = VertexType + Id_simple + AttrDefaultOpValue;

            EdgeTypeAttributeList.Rule = MakePlusRule(EdgeTypeAttributeList, S_comma, EdgeTypeAttrDefinition);

            EdgeTypeAttrDefinition.Rule = EdgeType + Id_simple + AttrDefaultOpValue;

            #endregion

            #region IncomingEdgesList

            IncomingEdgesList.Rule = MakePlusRule(IncomingEdgesList, S_comma, IncomingEdgesSingleDef);

            IncomingEdgesSingleDef.Rule = Id_simple + S_dot + Id_simple + Id_simple;
            //| Id_simple + S_dot + Id_simple + S_ListTypePrefix + Id_simple + S_BRACKET_LEFT + EdgeTypeParams + S_BRACKET_RIGHT + S_ListTypePostfix + Id_simple;

            #endregion

            #region id_simple list

            SimpleIdList.Rule = MakePlusRule(SimpleIdList, S_comma, Id_simple);

            #endregion

            #region expression

            //Expression
            BNF_ExprList.Rule = MakeStarRule(BNF_ExprList, S_comma, NT_Expression);

            NT_Expression.Rule = term
                                | unExpr
                                | binExpr;

            expressionOfAList.Rule = NT_Expression + ListParametersForExpression;

            term.Rule = IdOrFuncList              //d.Name
                            | string_literal      //'lala'
                            | number              //10
                //|   funcCall          //EXISTS ( SelectStatement )
                            | NT_Aggregate        //COUNT ( SelectStatement )
                            | tuple               //(d.Name, 'Henning', (SelectStatement))
                            | parSelectStmt       //(FROM User u Select u.Name)
                            | S_TRUE
                            | S_FALSE;

            #region Tuple

            tuple.Rule = bracketLeft + expressionOfAList + bracketRight;

            bracketLeft.Rule = S_BRACKET_LEFT | S_TUPLE_BRACKET_LEFT;
            bracketRight.Rule = S_BRACKET_RIGHT | S_TUPLE_BRACKET_RIGHT;

            #endregion

            parSelectStmt.Rule = S_BRACKET_LEFT + SelectStmtGraph + S_BRACKET_RIGHT;

            unExpr.Rule = unOp + term;

            unOp.Rule = S_NOT
                            | "+"
                            | "-"
                            | "~";

            binExpr.Rule = NT_Expression + binOp + NT_Expression
                            | NT_Expression + binOp + NT_Expression + PreferShiftHere() + S_USE + Id_simple;

            NT_UseIndex.Rule = S_USE + Id_simple;

            binOp.Rule = ToTerm("+")
                            | "-"
                            | "*"
                            | "/"
                            | "%" //arithmetic
                            | "&"
                            | "|"
                            | "="
                            | ">"
                            | "<"
                            | ">="
                            | "<="
                            | "<>"
                            | "!="
                            | "AND"
                            | "OR"
                            | "INRANGE"
                            | "LIKE";

            notOpt.Rule = Empty
                            | S_NOT;

            #endregion

            #region Functions & Aggregates

            //funcCall covers some psedo-operators and special forms like ANY(...), SOME(...), ALL(...), EXISTS(...), IN(...)
            //funcCall.Rule = BNF_FuncCallName + S_BRACKET_LEFT + funArgs + S_BRACKET_RIGHT;

            // The grammar will be created by IExtendableGrammer methods
            //BNF_Aggregate.Rule = Empty;
            //BNF_FuncCall.Rule = Empty;

            NT_FunArgs.Rule = SelectStmtGraph
                            | BNF_ExprList;

            #endregion

            #region operators

            //Operators
            RegisterOperators(10, "*", "/", "%");
            RegisterOperators(9, "+", "-");
            RegisterOperators(8, "=", ">", "<", ">=", "<=", "<>", "!=", "INRANGE", "LIKE");
            RegisterOperators(7, "^", "&", "|");
            RegisterOperators(6, "NOT");
            RegisterOperators(5, "AND", "OR");

            #region operators
            // Why this definition was twice in the GraphQL???
            //RegisterOperators(1, Associativity.Neutral, "AND", "OR");
            //RegisterOperators(2, Associativity.Neutral, "=", "!=", ">", ">=", "<", "<=", "<>", "!<", "!>", "IN", "NOTIN", "INRANGE");
            //RegisterOperators(3, "+", "-");
            //RegisterOperators(4, "*", "/");
            RegisterOperators(5, Associativity.Right, "**");
            #endregion

            #endregion

            #region prefixOperation

            PrefixOperation.Rule = Id_simple + S_BRACKET_LEFT + ParameterList + S_BRACKET_RIGHT;

            ParameterList.Rule = ParameterList + S_comma + NT_Expression
                                    | NT_Expression;

            #endregion

            #region options

            NT_Options.Rule = Empty
                                | S_OPTIONS + S_BRACKET_LEFT + NT_KeyValueList + S_BRACKET_RIGHT;

            #endregion

            #endregion

            #region CREATE INDEX

            createIndexStmt.Rule = S_CREATE + S_INDEX + indexNameOpt + editionOpt + S_ON + S_VERTEX + S_TYPE + VertexTypeWrapper + S_BRACKET_LEFT + IndexAttributeList + S_BRACKET_RIGHT + NT_IndexTypeOpt + NT_Options
                                    | S_CREATE + S_INDEX + indexNameOpt + editionOpt + S_ON + VertexTypeWrapper + S_BRACKET_LEFT + IndexAttributeList + S_BRACKET_RIGHT + NT_IndexTypeOpt + NT_Options; // due to compatibility the  + S_TYPE is optional

            uniqueOpt.Rule = Empty | S_UNIQUE;

            editionOpt.Rule = Empty
                                | S_EDITION + Id_simple;

            NT_IndexTypeOpt.Rule = Empty
                                | S_INDEXTYPE + Id_simple;

            indexNameOpt.Rule = Empty
                                | Id_simple;

            #endregion

            #region REBUILD INDICES

            rebuildIndicesStmt.Rule = S_REBUILD + S_INDICES + rebuildIndicesTypes;

            rebuildIndicesTypes.Rule = Empty | VertexTypeList;

            #endregion

            #region CREATE VERTEX TYPE(S)

            createTypesStmt.Rule = S_CREATE + S_VERTEX + S_TYPES + bulkVertexTypeList
                                    | S_CREATE + S_ABSTRACT + S_VERTEX + S_TYPE + bulkVertexType
                                    | S_CREATE + S_VERTEX + S_TYPE + bulkVertexType;

            bulkVertexTypeList.Rule = MakePlusRule(bulkVertexTypeList, S_comma, bulkVertexTypeListMember);

            bulkVertexTypeListMember.Rule = abstractOpt + bulkVertexType;

            bulkVertexType.Rule = Id_simple + extendsOpt + vertexTypeAttributesOpt + incomingEdgesOpt + uniquenessOpt + mandatoryOpt + indexOptOnCreateType + commentOpt;

            commentOpt.Rule = Empty
                                    | S_COMMENT + "=" + string_literal;

            abstractOpt.Rule = S_ABSTRACT
                                | Empty;

            extendsOpt.Rule = Empty
                                    | S_EXTENDS + Id_simple;

            vertexTypeAttributesOpt.Rule = Empty
                                    | S_ATTRIBUTES + S_BRACKET_LEFT + VertexTypeAttributeList + S_BRACKET_RIGHT;

            incomingEdgesOpt.Rule = Empty
                                    | S_INCOMINGEDGES + S_BRACKET_LEFT + IncomingEdgesList + S_BRACKET_RIGHT;

            uniquenessOpt.Rule = Empty
                                    | S_UNIQUE + S_BRACKET_LEFT + id_simpleList + S_BRACKET_RIGHT;

            mandatoryOpt.Rule = Empty
                                    | S_MANDATORY + S_BRACKET_LEFT + id_simpleList + S_BRACKET_RIGHT;

            indexOptOnCreateType.Rule = Empty
                                        | indexOnCreateType;

            indexOnCreateType.Rule = S_INDICES + S_BRACKET_LEFT + IndexOptOnCreateTypeMemberList + S_BRACKET_RIGHT
                                    | S_INDICES + IndexOptOnCreateTypeMember;

            IndexOptOnCreateTypeMemberList.Rule = MakePlusRule(IndexOptOnCreateTypeMemberList, S_comma, IndexOptOnCreateTypeMember);

            IndexOptOnCreateTypeMember.Rule = S_BRACKET_LEFT + indexNameOpt + editionOpt + NT_IndexTypeOpt + S_ON + S_ATTRIBUTES + IndexAttributeList + NT_Options + S_BRACKET_RIGHT
                                            | S_BRACKET_LEFT + indexNameOpt + editionOpt + NT_IndexTypeOpt + S_ON + IndexAttributeList + NT_Options + S_BRACKET_RIGHT // due to compatibility the  + S_ATTRIBUTES is optional
                                            | S_BRACKET_LEFT + IndexAttributeList + NT_Options + S_BRACKET_RIGHT;

            Values.Rule = BooleanVal | number | string_literal;

            AttrDefaultOpValue.Rule = Empty
                                    | "=" + Values;

            #endregion

            #region CREATE EDGE TYPE(s)

            createEdgeTypesStmt.Rule = S_CREATE + S_EDGE + S_TYPE + bulkEdgeType
                                        | S_CREATE + S_EDGE + S_TYPES + bulkEdgeTypeList;

            bulkEdgeType.Rule = Id_simple + extendsOpt + edgeTypeAttributesOpt + commentOpt;

            edgeTypeAttributesOpt.Rule = Empty
                                    | S_ATTRIBUTES + S_BRACKET_LEFT + EdgeTypeAttributeList + S_BRACKET_RIGHT;

            bulkEdgeTypeList.Rule = MakePlusRule(bulkEdgeTypeList, S_comma, bulkEdgeTypeListMember);

            bulkEdgeTypeListMember.Rule = abstractOpt + bulkVertexType;

            #endregion

            #region ALTER VERTEX TYPE

            alterVertexTypeStmt.Rule = S_ALTER + S_VERTEX + S_TYPE + Id_simple + alterVertexTypeCmdList + uniquenessOpt + mandatoryOpt;

            alterVertexTypeCmd.Rule = Empty
                            | S_ADD + S_ATTRIBUTES + S_BRACKET_LEFT + VertexTypeAttributeList + S_BRACKET_RIGHT
                            | S_DROP + S_ATTRIBUTES + S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT
                            | S_ADD + S_INCOMINGEDGES + S_BRACKET_LEFT + IncomingEdgesList + S_BRACKET_RIGHT
                            | S_DROP + S_INCOMINGEDGES + S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT
                            | S_ADD + indexOnCreateType
                            | S_DROP + IndexDropOnAlterType
                            | S_RENAME + S_ATTRIBUTE + Id_simple + S_TO + Id_simple
                            | S_RENAME + S_INCOMINGEDGE + Id_simple + S_TO + Id_simple
                            | S_RENAME + S_TO + Id_simple
                            | S_DEFINE + S_ATTRIBUTES + S_BRACKET_LEFT + VertexTypeAttributeList + S_BRACKET_RIGHT
                            | S_UNDEFINE + S_ATTRIBUTES + S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT
                            | S_DROP + S_UNIQUE + S_ON + Id_simple
                            | S_DROP + S_MANDATORY + S_ON + Id_simple
                            | S_COMMENT + "=" + string_literal;

            alterVertexTypeCmdList.Rule = MakePlusRule(alterVertexTypeCmdList, S_comma, alterVertexTypeCmd);

            IndexDropOnAlterTypeMember.Rule = S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT;

            IndexDropOnAlterTypeMemberList.Rule = MakePlusRule(IndexDropOnAlterTypeMemberList, S_comma, IndexDropOnAlterTypeMember);

            IndexDropOnAlterType.Rule = S_INDICES + IndexDropOnAlterTypeMember;

            #endregion

            #region ALTER EDGE TYPE

            alterEdgeTypeStmt.Rule = S_ALTER + S_EDGE + S_TYPE + Id_simple + alterEdgeTypeCmdList;

            alterEdgeTypeCmd.Rule = Empty
                            | S_ADD + S_ATTRIBUTES + S_BRACKET_LEFT + EdgeTypeAttributeList + S_BRACKET_RIGHT
                            | S_DROP + S_ATTRIBUTES + S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT
                            | S_RENAME + S_ATTRIBUTE + Id_simple + S_TO + Id_simple
                            | S_RENAME + S_TO + Id_simple
                //| S_DEFINE + S_ATTRIBUTES + S_BRACKET_LEFT + EdgeTypeAttributeList + S_BRACKET_RIGHT
                //| S_UNDEFINE + S_ATTRIBUTES + S_BRACKET_LEFT + SimpleIdList + S_BRACKET_RIGHT
                            | S_COMMENT + "=" + string_literal;

            alterEdgeTypeCmdList.Rule = MakePlusRule(alterEdgeTypeCmdList, S_comma, alterEdgeTypeCmd);

            #endregion

            #region SELECT

            SelectStmtGraph.Rule = S_FROM +
                                    VertexTypeList +
                                    S_SELECT +
                                    selList +
                                    NT_whereClauseOpt +
                                    groupClauseOpt +
                                    havingClauseOpt +
                                    orderClauseOpt +
                                    offsetOpt +
                                    limitOpt +
                                    resolutionDepthOpt +
                                    selectOutputOpt;

            resolutionDepthOpt.Rule = Empty
                                        | S_DEPTH + number;

            selectOutputOpt.Rule = Empty
                                        | "OUTPUT" + name;

            offsetOpt.Rule = Empty
                            | S_OFFSET + number;

            limitOpt.Rule = Empty
                            | S_LIMIT + number;

            selList.Rule = selectionList;

            selectionList.Rule = MakePlusRule(selectionList, S_comma, selectionListElement);

            selectionListElement.Rule = S_ASTERISK
                                        | NT_Aggregate + aliasOpt
                                        | IdOrFuncList + aliasOpt;

            aliasOptName.Rule = Id_simple | string_literal;

            aliasOpt.Rule = Empty
                            | S_AS + aliasOptName;

            #region Aggregate

            //BNF_Aggregate.Rule = BNF_AggregateName + S_BRACKET_LEFT + name + S_BRACKET_RIGHT;

            NT_AggregateArg.Rule = NT_Id
                                    | S_ASTERISK;
            /*
            aggregateName.Rule =        S_COUNT
                                    |   "AVG"
                                    |   "MIN"
                                    |   "MAX"
                                    |   "STDEV"
                                    |   "STDEVP"
                                    |   "SUM"
                                    |   "VAR"
                                    |   "VARP";
            */
            #endregion

            #region Functions

            //function.Rule           = functionName + S_BRACKET_LEFT + term + S_BRACKET_RIGHT;

            //functionName.Rule       = FUNC_WEIGHT;

            #endregion

            NT_whereClauseOpt.Rule = Empty
                                    | S_WHERE + NT_Expression;

            groupClauseOpt.Rule = Empty
                                    | "GROUP" + S_BY + idlist;

            havingClauseOpt.Rule = Empty
                                    | "HAVING" + NT_Expression;

            orderByAttributeListMember.Rule = NT_Id
                                                | string_literal;

            orderByAttributeList.Rule = MakePlusRule(orderByAttributeList, S_comma, orderByAttributeListMember);

            orderClauseOpt.Rule = Empty
                                    | "ORDER" + S_BY + orderByAttributeList + AttributeOrderDirectionOpt;

            #endregion

            #region INSERT

            InsertStmt.Rule = S_INSERT + S_INTO + Id_simple + insertValuesOpt;

            insertValuesOpt.Rule = Empty
                                    | S_VALUES + S_BRACKET_LEFT + AttrAssignList + S_BRACKET_RIGHT;

            AttrAssignList.Rule = MakePlusRule(AttrAssignList, S_comma, AttrAssign);

            AttrAssign.Rule = NT_Id + "=" + NT_Expression
                                | NT_Id + "=" + Reference
                                | NT_Id + "=" + CollectionOfDBObjects;

            CollectionOfDBObjects.Rule = S_SETOF + CollectionTuple
                                            | S_LISTOF + CollectionTuple
                                            | S_SETOFUUIDS + VertexTypeVertexIDCollection
                                            | S_SETOFUUIDS + "()"
                                            | S_SETOF + "()";

            VertexTypeVertexIDCollection.Rule = MakeStarRule(VertexTypeVertexIDCollection, VertexTypeVertexElement);

            VertexTypeVertexElement.Rule = TERMINAL_LT + Id_simple + TERMINAL_GT + CollectionTuple;

            CollectionTuple.Rule = S_BRACKET_LEFT + ExtendedExpressionList + S_BRACKET_RIGHT;

            ExtendedExpressionList.Rule = MakePlusRule(ExtendedExpressionList, S_comma, ExtendedExpression);

            ExtendedExpression.Rule = NT_Expression + ListParametersForExpression;

            Reference.Rule = S_REFERENCE + tuple + ListParametersForExpression
                            | S_REF + tuple + ListParametersForExpression
                            | S_REFUUID + TERMINAL_LT + Id_simple + TERMINAL_GT + tuple + ListParametersForExpression
                            | S_REFERENCEUUID + TERMINAL_LT + Id_simple + TERMINAL_GT + tuple + ListParametersForExpression;

            //| S_SETREF + tupleRangeSet + ListParametersForExpression;

            #endregion

            #region UPDATE

            updateStmt.Rule = S_UPDATE + Id_simple + S_SET + S_BRACKET_LEFT + AttrUpdateList + S_BRACKET_RIGHT + NT_whereClauseOpt;

            AttrUpdateList.Rule = MakePlusRule(AttrUpdateList, S_comma, AttrUpdateOrAssign);

            AttrUpdateOrAssign.Rule = AttrAssign
                                        | AttrRemove
                                        | ListAttrUpdate;

            AttrRemove.Rule = S_REMOVE + S_ATTRIBUTES + S_BRACKET_LEFT + id_simpleList + S_BRACKET_RIGHT;

            ListAttrUpdate.Rule = AddToListAttrUpdate
                                    | RemoveFromListAttrUpdateAddToRemoveFrom
                                    | RemoveFromListAttrUpdateAddToOperator;

            AddToListAttrUpdate.Rule = AddToListAttrUpdateAddTo
                                        | AddToListAttrUpdateOperator;

            AddToListAttrUpdateAddTo.Rule = S_ADD + S_TO + NT_Id + CollectionOfDBObjects;
            AddToListAttrUpdateOperator.Rule = NT_Id + S_ADDTOLIST + CollectionOfDBObjects;

            RemoveFromListAttrUpdateAddToRemoveFrom.Rule = S_REMOVE + S_FROM + NT_Id + tuple;
            RemoveFromListAttrUpdateAddToOperator.Rule = NT_Id + RemoveFromListAttrUpdateScope;
            RemoveFromListAttrUpdateScope.Rule = S_REMOVEFROMLIST + tuple | S_REMOVEFROMLIST + CollectionOfDBObjects;

            #endregion

            #region UPDATE EDGES

            //                       UPDATE     EDGES     ON      User
            updateEdgesStmt.Rule = S_UPDATE + S_EDGES + S_ON + Id_simple +
                //                                (      Friends = (), Fiends = ()      )       WHERE Name = 'Hans'
                                    S_BRACKET_LEFT + EdgeAttrUpdateList + S_BRACKET_RIGHT + NT_whereClauseOpt;

            //                          Friends = (), Fiends = ()
            EdgeAttrUpdateList.Rule = MakePlusRule(EdgeAttrUpdateList, S_comma, EdgeAttrUpdate);

            //                    Friends  =   (Name = 'Hans' : (Weight = 1.5))
            EdgeAttrUpdate.Rule = NT_Id + "=" + CollectionOfEdges;

            //                       Name = 'Hans' : (Weight = 1.5)
            CollectionOfEdges.Rule = CollectionTuple;

            #endregion

            #region DROP VertexType

            dropVertexTypeStmt.Rule = S_DROP + S_VERTEX + S_TYPE + Id_simple;

            #endregion

            #region DROP EdgeType

            dropEdgeTypeStmt.Rule = S_DROP + S_EDGE + S_TYPE + Id_simple;

            #endregion

            #region DROP INDEX

            dropIndexStmt.Rule = S_FROM + VertexTypeWrapper + S_DROP + S_INDEX + Id_simple + editionOpt;

            #endregion

            #region TRUNCATE

            truncateStmt.Rule = S_TRUNCATE + S_VERTEX + S_TYPE + Id_simple;

            #endregion

            #region DELETE

            deleteStmtMember.Rule = Empty | idlist;
            deleteStmt.Rule = S_FROM + Id_simple + S_DELETE + deleteStmtMember + NT_whereClauseOpt;

            #endregion

            #region DESCRIBE

            DescrInfoStmt.Rule = S_DESCRIBE + DescrArgument;

            DescrArgument.Rule = DescrAggrStmt
                                | DescrAggrsStmt
                                | DescrEdgeStmt
                                | DescrEdgesStmt
                                | DescrTypeStmt
                                | DescrTypesStmt
                                | DescrFuncStmt
                                | DescrFunctionsStmt
                                | DescrIdxStmt
                                | DescrIdxsStmt;

            DescrAggrStmt.Rule = S_AGGREGATE + string_literal;

            DescrAggrsStmt.Rule = S_AGGREGATES;

            DescrEdgeStmt.Rule = S_EDGE + Id_simple;

            DescrEdgesStmt.Rule = S_EDGES;

            DescrTypeStmt.Rule = S_VERTEX + S_TYPE + Id_simple;

            DescrTypesStmt.Rule = S_VERTEX + S_TYPES;

            DescrFuncStmt.Rule = S_FUNCTION + string_literal;

            DescrFunctionsStmt.Rule = S_FUNCTIONS;

            //                            User        [IndexName]             [EDITION default]
            DescrIdxStmt.Rule = S_INDEX + NT_VertexType + DescrDedicatedIdxStmt + DescrIdxEdtStmt;

            DescrDedicatedIdxStmt.Rule = Empty | Id_simple;

            DescrIdxEdtStmt.Rule = Empty
                                    | S_EDITION + Id_simple;

            DescrIdxsStmt.Rule = S_INDICES;

            #endregion

            #region INSERTORUPDATE

            insertorupdateStmt.Rule = S_INSERTORUPDATE + Id_simple + S_VALUES + S_BRACKET_LEFT + AttrUpdateList + S_BRACKET_RIGHT + NT_whereClauseOpt;

            #endregion

            #region INSERTORREPLACE

            insertorreplaceStmt.Rule = S_INSERTORREPLACE + Id_simple + S_VALUES + S_BRACKET_LEFT + AttrAssignList + S_BRACKET_RIGHT + NT_whereClauseOpt;

            #endregion

            #region REPLACE

            replaceStmt.Rule = S_REPLACE + Id_simple + S_VALUES + S_BRACKET_LEFT + AttrAssignList + S_BRACKET_RIGHT + S_WHERE + NT_Expression;

            #endregion

            #region TRANSACTION

            #region BeginTransAction

            transactStmt.Rule = S_BEGIN + TransactOptions + S_TRANSACTION + TransactAttributes;

            TransactOptions.Rule = Empty |
                                S_TRANSACTDISTRIBUTED + S_TRANSACTLONGRUNNING |
                                S_TRANSACTDISTRIBUTED |
                                S_TRANSACTLONGRUNNING;

            TransactAttributes.Rule = Empty |
                                TransactIsolation |
                                TransactName |
                                TransactTimestamp |
                                TransactIsolation + TransactName |
                                TransactIsolation + TransactTimestamp |
                                TransactName + TransactTimestamp |
                                TransactIsolation + TransactName + TransactTimestamp;

            TransactIsolation.Rule = S_TRANSACTISOLATION + "=" + string_literal;

            TransactName.Rule = S_TRANSACTNAME + "=" + string_literal;

            TransactTimestamp.Rule = S_TRANSACTTIMESTAMP + "=" + string_literal;

            #endregion

            #region CommitRollbackTransAction

            commitRollBackTransactStmt.Rule = TransactCommitRollbackType + S_TRANSACTION + TransactCommitRollbackOpt;

            TransactCommitRollbackType.Rule = S_TRANSACTCOMMIT | S_TRANSACTROLLBACK;

            TransactCommitRollbackOpt.Rule = Empty |
                                        TransactName |
                                        S_TRANSACTCOMROLLASYNC |
                                        TransactName + S_TRANSACTCOMROLLASYNC;

            #endregion

            #endregion

            #region EXPORT/DUMP

            dumpType.Rule = Empty | S_ALL | S_GDDL | S_GDML;      // If empty => create both
            dumpFormat.Rule = Empty | S_AS + S_GQL;                 // If empty => create GQL
            typeOptionalList.Rule = Empty | S_VERTEX + S_TYPES + id_simpleList;

            dumpDestination.Rule = Empty | S_INTO + location_literal | S_TO + location_literal;

            dumpStmt.Rule = S_DUMP + typeOptionalList + dumpType + dumpFormat + dumpDestination
                                    | S_EXPORT + typeOptionalList + dumpType + dumpFormat + dumpDestination;

            #endregion

            #region IMPORT

            paramComments.Rule = S_COMMENTS + tuple | Empty;
            paramParallelTasks.Rule = S_PARALLELTASKS + "(" + number + ")" | Empty;
            verbosityTypes.Rule = ToTerm(VerbosityTypes.Silent.ToString()) | ToTerm(VerbosityTypes.Errors.ToString()) | ToTerm(VerbosityTypes.Full.ToString());
            verbosity.Rule = S_VERBOSITY + verbosityTypes | Empty;

            //BNF_ImportFormat.Rule = Empty;

            NT_ImportStmt.Rule = S_IMPORT + S_FROM + location_literal + S_FORMAT + NT_ImportFormat + paramParallelTasks + paramComments + offsetOpt + limitOpt + verbosity + NT_Options;

            #endregion

            #region LINK

            // Semantic Web Yoda-Style and human language style
            linkStmt.Rule = S_LINK + VertexTypeWrapper + CollectionTuple + S_VIA + NT_Id + S_TO + LinkCondition |
                            S_LINK + VertexTypeWrapper + CollectionTuple + S_TO + LinkCondition + S_VIA + NT_Id;

            LinkCondition.Rule = VertexTypeWrapper + CollectionTuple;

            #endregion

            #region UNLINK

            unlinkStmt.Rule = S_UNLINK + VertexTypeWrapper + CollectionTuple + S_VIA + NT_Id + S_FROM + LinkCondition |
                              S_UNLINK + VertexTypeWrapper + CollectionTuple + S_FROM + LinkCondition + S_VIA + NT_Id;

            #endregion

            #endregion

            #region Misc

            #region punctuation

            MarkPunctuation(",", S_BRACKET_LEFT.ToString(), S_BRACKET_RIGHT.ToString(), "[", "]");
            //RegisterPunctuation(",", S_BRACKET_LEFT.Symbol, S_BRACKET_RIGHT.Symbol, S_TUPLE_BRACKET_LEFT.Symbol, S_TUPLE_BRACKET_RIGHT.Symbol);
            //RegisterPunctuation(",");
            //RegisterBracePair(_S_BRACKET_LEFT.Symbol, S_BRACKET_RIGHT.Symbol);
            //RegisterBracePair(_S_TUPLE_BRACKET_LEFT.Symbol, S_TUPLE_BRACKET_RIGHT.Symbol);
            //RegisterBracePair(_S_TUPLE_BRACKET_LEFT_EXCLUSIVE.Symbol, S_TUPLE_BRACKET_RIGHT.Symbol);
            //RegisterBracePair(_S_TUPLE_BRACKET_LEFT.Symbol, S_TUPLE_BRACKET_RIGHT_EXCLUSIVE.Symbol);
            //RegisterBracePair(_S_TUPLE_BRACKET_LEFT_EXCLUSIVE.Symbol, S_TUPLE_BRACKET_RIGHT_EXCLUSIVE.Symbol);

            #endregion

            base.MarkTransient(
                singlestmt, Id_simple, selList, /* selectionSource, */NT_Expression, term, NT_FunArgs
                , unOp, /*binOp, */ /*aliasOpt, */ aliasOptName, orderByAttributeListMember
                //, KeyValuePair
                //, EdgeTypeParam
                , EdgeType_SortedMember, AttrUpdateOrAssign, ListAttrUpdate, DescrArgument,
                VertexTypeWrapper //is used as a wrapper for AType
                , IdOrFunc //, IdOrFuncList
                , BNF_ExprList, NT_AggregateArg,
                //ExtendedExpressionList,
                NT_ImportFormat, NT_FuncCall, NT_Aggregate, verbosityTypes/*,
                vertexType, BNF_VertexTypes*/);

            #endregion
        }