Exemple #1
0
        public GridWorldGrammar()
        {
            this.GrammarComments = "A grammar for GridWorld";

            //Terminals
            RegexBasedTerminal number = new RegexBasedTerminal("number", "[0-9]+");

            //Non terminals
            NonTerminal program = new NonTerminal("program");
            NonTerminal createStatement = new NonTerminal("createStatement", typeof(StartNode));
            NonTerminal startStatement = new NonTerminal("startStatement", typeof(StartNode));
            NonTerminal moveStatements = new NonTerminal("moveStatements", typeof(MovesNode));
            NonTerminal moveStatement = new NonTerminal("moveStatement", typeof(MoveNode));
            NonTerminal direction = new NonTerminal("direction", typeof(DirectionNode));

            //BNF rules
            program.Rule = createStatement + startStatement + moveStatements;
            createStatement.Rule = ToTerm("Create") + "a" + number + "by" + number + "grid" + ".";
            startStatement.Rule = ToTerm("Start") + "at" + "location" + number + "," + number + ".";
            moveStatements.Rule = MakePlusRule(moveStatements, moveStatement);
            moveStatement.Rule = "Move" + direction + number + ".";
            direction.Rule = ToTerm("up") | "down" | "right" | "left";
            this.Root = program;
            this.LanguageFlags = LanguageFlags.CreateAst;
            MarkPunctuation("Create", "a", "grid", "by", "Start", "at","location", ",", ".", "Move");
        }
        void InitializeTerminalFields()
        {
            foreach (var field in this.GetType().GetFields().Where(f => f.FieldType == typeof(RegexBasedTerminal)))
            {
                var patternFieldInfo = typeof(PowerShellGrammar).GetField(
                    field.Name + "_pattern",
                    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static
                    );
                var pattern = patternFieldInfo.GetValue<string>(null);
                var regexBasedTerminal = new RegexBasedTerminal(field.Name, pattern);

                field.SetValue(this, regexBasedTerminal);
            }

            // I'd rather that any other token be selected over `generic_token`, since it's, you know, generic.
            generic_token.Priority = TerminalPriority.Low - 1;

            foreach (var field in this.GetType().GetFields().Where(f => f.FieldType == typeof(KeyTerm)))
            {
                field.SetValue(this, ToTerm(field.Name));
            }

            // we want 'Get-ChildItem' to parse as a single token, not as 'Get - ChildItem'
            dash.Priority = TerminalPriority.Low;
        }
        public FabricGrammar(): base(false) // case non-sensitive
        {
            // Terminal Definitions
            RegexBasedTerminal number = new RegexBasedTerminal("number", "[0-9]+");

            // Non-Terminal Definitions
            NonTerminal program = new NonTerminal("program"),
                createStatement = new NonTerminal("createStatement"),
                startStatement = new NonTerminal("startStatement"),
                moveStatements = new NonTerminal("moveStatements"),
                moveStatement = new NonTerminal("moveStatement"),
                direction = new NonTerminal("direction");

            // Relation Definitions
            program.Rule = createStatement + startStatement + moveStatements;
            createStatement.Rule = ToTerm("Create") + "a" + number + "by" + number + "grid";
            startStatement.Rule = ToTerm("Start") + "at" + "location" + number + "," + number;
            moveStatements.Rule = MakePlusRule(moveStatements, moveStatement);
            moveStatement.Rule = ToTerm("Move") + direction + number;
            direction.Rule = ToTerm("up") | "down" | "right" | "left";

            // Set the Root
            this.Root = program;

            // Set the Markup Register
            MarkPunctuation("Create", "a", "grid", "by", "Start", "at", "location", ",", "Move");
        }
        /// <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;
        }
Exemple #5
0
        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", ":");
        }
    public HTMLGrammar() {
      KeyTerm leftAnguralBracket = new KeyTerm("<", "LeftAngularBarakcet");
      KeyTerm rightAnguralBracket = new KeyTerm(">", "RightAngularBarakcet");
      KeyTerm leftAngularBracketEndTag = new KeyTerm("</", "LeftAngularBracketEndTag");
      KeyTerm rightAngularBracketEndTag = new KeyTerm("/>", "RightAngularBracketEndTag");


      NonTerminal element = new NonTerminal("Element");
      NonTerminal emptyElementTag = new NonTerminal("EmptyElementTag");
      NonTerminal startTag = new NonTerminal("StartTag");
      NonTerminal content = new NonTerminal("Content");
      NonTerminal endTag = new NonTerminal("EndTag");
      RegexBasedTerminal name = new RegexBasedTerminal("Name", "\\w+");

      element.Rule = emptyElementTag | startTag + content + endTag;
      emptyElementTag.Rule = leftAnguralBracket + name + rightAngularBracketEndTag;
      startTag.Rule = leftAnguralBracket + name + rightAnguralBracket;
      endTag.Rule = leftAngularBracketEndTag + name + rightAnguralBracket;
      content.Rule = MakeStarRule(content, element);

      this.Root = element;
    }
        public SchematraGrammer()
            : base(false)
        {
            const string dotNotationWordPattern     = @"[\w\._]+";
            const string singleWordPattern          = @"[\w_]+";
            const string integerNumberPattern       = "[0-9]+";

            // ******** //
            // Comments //
            // ******** //

            var SingleLineComment   = new CommentTerminal("single-line-comment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var DelimitedComment    = new CommentTerminal("multi-line-comment", "/*", "*/");
            NonGrammarTerminals.Add(SingleLineComment);
            NonGrammarTerminals.Add(DelimitedComment);

            // ************* //
            // Scalar values //
            // ************* //

            RegexBasedTerminal word         = new RegexBasedTerminal("word", singleWordPattern),
                               identifier   = new RegexBasedTerminal("identifier", dotNotationWordPattern);

            StringLiteral stringValue       = TerminalFactory.CreateCSharpString("string-value");
            NumberLiteral numberValue       = TerminalFactory.CreateCSharpNumber("number-value");

            NonTerminal value               = new NonTerminal("value");
            value.Rule                      = (numberValue | stringValue);

            // **************** //
            // Field grammer //
            // **************** //

            RegexBasedTerminal fieldIndex   = new RegexBasedTerminal(term_field_index, integerNumberPattern),
                               fieldName    = new RegexBasedTerminal(term_field_name, singleWordPattern),
                               fieldSchema  = new RegexBasedTerminal(term_field_schema, dotNotationWordPattern);

            NonTerminal field               = new NonTerminal(term_field),
                        fieldNullable       = new NonTerminal(term_field_nullable),
                        fieldInitValue      = new NonTerminal(term_field_init_value),
                        fieldQualifier      = new NonTerminal(term_field_qualifier);

            fieldNullable.Rule              = ToTerm("nullable") | Empty;

            field.Rule                      = fieldIndex + ":" + fieldQualifier + fieldNullable + fieldSchema +
                                               fieldName + fieldInitValue + ";";

            fieldInitValue.Rule             = (ToTerm("=") + value) | Empty;
            fieldQualifier.Rule             = ToTerm("optional") | "required";

            // ************** //
            // Schema grammer //
            // ************** //

            StringLiteral schemaDefTag          = TerminalFactory.CreateCSharpString(term_schema_def_tag);
            RegexBasedTerminal schemaDefExtends = new RegexBasedTerminal(term_schema_def_extends, dotNotationWordPattern);
            RegexBasedTerminal schemaDefName = new RegexBasedTerminal(term_schema_def_name, singleWordPattern);

            NonTerminal schemaDef               = new NonTerminal(term_schema_def),
                        schemaDefOption         = new NonTerminal(term_schema_def_option),
                        schemaDefTaggedOption   = new NonTerminal(term_schema_def_tagged_option),
                        schemaDefExtendsOption  = new NonTerminal(term_schema_def_extends_option),
                        schemaDefOptions        = new NonTerminal(term_schema_def_options),
                        schemaDefBody           = new NonTerminal(term_schema_def_body);

            schemaDefTaggedOption.Rule          = ToTerm("tagged") + schemaDefTag;
            schemaDefExtendsOption.Rule         = ToTerm("extends") + schemaDefExtends;

            schemaDefOption.Rule                = schemaDefTaggedOption | schemaDefExtendsOption;
            schemaDefOptions.Rule               = MakeStarRule(schemaDefOptions, schemaDefOption);
            schemaDef.Rule                      = ToTerm("record") + schemaDefName + schemaDefOptions + "{" + schemaDefBody + "}";
            schemaDefBody.Rule                  = MakeStarRule(schemaDefBody, field);

            // ************* //
            // Using grammer //
            // ************* //

            RegexBasedTerminal usingDefName     = new RegexBasedTerminal(term_using_def_name, dotNotationWordPattern);

            NonTerminal usingDefs               = new NonTerminal(term_using_defs),
                        usingDef                = new NonTerminal(term_using_def);

            usingDef.Rule                       = ToTerm("using") + usingDefName + ";";
            usingDefs.Rule                      = MakeStarRule(usingDefs, usingDef);

            // *************** //
            // Unit grammer //
            // *************** //

            RegexBasedTerminal namespaceDefName = new RegexBasedTerminal(term_namespace_def_name, dotNotationWordPattern);

            NonTerminal unit                = new NonTerminal(term_unit),
                        def                 = new NonTerminal(term_def),
                        defs                = new NonTerminal(term_defs),
                        namespaceDef        = new NonTerminal(term_namespace_def);

            unit.Rule                       = usingDefs + defs;
            defs.Rule                       = MakeStarRule(defs, def);
            def.Rule                        = schemaDef | namespaceDef;
            namespaceDef.Rule               = ToTerm("namespace") + namespaceDefName + "{" + defs + "}";

            this.Root = unit;

            MarkPunctuation("enum", "a", "=", "[", "]", "record", "{", "}", ",", ";", ":", "namespace", "tagged", "extends", "schema", "using");
        }
        public ExcelFormulaGrammar() : base(false)
        {
            #region 1-Terminals

            #region Symbols and operators
            var comma = ToTerm(",");
            var colon = ToTerm(":");
            var semicolon = ToTerm(";");
            var OpenParen = ToTerm("(");
            var CloseParen = ToTerm(")");
            var CloseSquareParen = ToTerm("]");
            var OpenSquareParen = ToTerm("[");
            var exclamationMark = ToTerm("!");
            var CloseCurlyParen = ToTerm("}");
            var OpenCurlyParen = ToTerm("{");

            var mulop = ToTerm("*");
            var plusop = ToTerm("+");
            var divop = ToTerm("/");
            var minop = ToTerm("-");
            var concatop = ToTerm("&");
            var expop = ToTerm("^");
            // Intersect op is a single space, which cannot be parsed normally so we need an ImpliedSymbolTerminal
            // Attention: ImpliedSymbolTerminal seems to break if you assign it a priority, and it's default priority is low
            var intersectop = new ImpliedSymbolTerminal(GrammarNames.TokenIntersect);

            var percentop = ToTerm("%");

            var gtop = ToTerm(">");
            var eqop = ToTerm("=");
            var ltop = ToTerm("<");
            var neqop = ToTerm("<>");
            var gteop = ToTerm(">=");
            var lteop = ToTerm("<=");
            #endregion

            #region Literals
            var BoolToken = new RegexBasedTerminal(GrammarNames.TokenBool, "TRUE|FALSE");
            BoolToken.Priority = TerminalPriority.Bool;

            var NumberToken = new NumberLiteral(GrammarNames.TokenNumber, NumberOptions.None);
            NumberToken.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };

            var TextToken = new StringLiteral(GrammarNames.TokenText, "\"", StringOptions.AllowsDoubledQuote | StringOptions.AllowsLineBreak);

            var ErrorToken = new RegexBasedTerminal(GrammarNames.TokenError, "#NULL!|#DIV/0!|#VALUE!|#NAME\\?|#NUM!|#N/A");
            var RefErrorToken = ToTerm("#REF!", GrammarNames.TokenRefError);
            #endregion

            #region Functions

            var UDFToken = new RegexBasedTerminal(GrammarNames.TokenUDF, "(_xll\\.)?[a-zA-Z0-9_.]+\\(");
            UDFToken.Priority = TerminalPriority.UDF;

            var ExcelRefFunctionToken = new RegexBasedTerminal(GrammarNames.TokenExcelRefFunction, "(INDEX|OFFSET|INDIRECT)\\(");
            ExcelRefFunctionToken.Priority = TerminalPriority.ExcelRefFunction;
            
            var ExcelConditionalRefFunctionToken = new RegexBasedTerminal(GrammarNames.TokenExcelConditionalRefFunction, "(IF|CHOOSE)\\(");
            ExcelConditionalRefFunctionToken.Priority = TerminalPriority.ExcelRefFunction;

            var ExcelFunction = new RegexBasedTerminal(GrammarNames.ExcelFunction, "(" + String.Join("|", excelFunctionList)  +")\\(");
            ExcelFunction.Priority = TerminalPriority.ExcelFunction;

            // Using this instead of Empty allows a more accurate trees
            var EmptyArgumentToken = new ImpliedSymbolTerminal(GrammarNames.TokenEmptyArgument);

            #endregion

            #region References and names

            var VRangeToken = new RegexBasedTerminal(GrammarNames.TokenVRange, "[$]?[A-Z]{1,4}:[$]?[A-Z]{1,4}");
            var HRangeToken = new RegexBasedTerminal(GrammarNames.TokenHRange, "[$]?[1-9][0-9]*:[$]?[1-9][0-9]*");
            
            const string CellTokenRegex = "[$]?[A-Z]{1,4}[$]?[1-9][0-9]*";
            var CellToken = new RegexBasedTerminal(GrammarNames.TokenCell, CellTokenRegex);
            CellToken.Priority = TerminalPriority.CellToken;

            const string NamedRangeRegex = @"[A-Za-z\\_][\w\.]*";
            var NamedRangeToken = new RegexBasedTerminal(GrammarNames.TokenNamedRange, NamedRangeRegex);
            NamedRangeToken.Priority = TerminalPriority.NamedRange;

            // To prevent e.g. "A1A1" being parsed as 2 celltokens
            var NamedRangeCombinationToken = new RegexBasedTerminal(GrammarNames.TokenNamedRangeCombination, "(TRUE|FALSE|" + CellTokenRegex + ")" + NamedRangeRegex);
            NamedRangeCombinationToken.Priority = TerminalPriority.NamedRangeCombination;

            const string singleQuotedContent = @"\w !@#$%^&*()\-\+={}|:;<>,\./\?" + "\\\"";
            const string sheetRegEx = @"(([\w\.]+)|('([" + singleQuotedContent + @"]|'')+'))!";

            var SheetToken = new RegexBasedTerminal(GrammarNames.TokenSheet, sheetRegEx);
            SheetToken.Priority = TerminalPriority.SheetToken;

            const string firstSheetName = "[a-zA-Z0-9]+:";
            var MultipleSheetsToken = new RegexBasedTerminal(GrammarNames.TokenMultipleSheets, firstSheetName + sheetRegEx);
            MultipleSheetsToken.Priority = TerminalPriority.MultipleSheetsToken;

            var FileToken = new RegexBasedTerminal(GrammarNames.TokenFileNameNumeric, "[0-9]+");
            FileToken.Priority = TerminalPriority.FileToken;;

            var QuotedFileSheetToken = new RegexBasedTerminal(GrammarNames.TokenFileSheetQuoted, @"'\[\d+\]([" + singleQuotedContent + @"]|'')+'!");
            QuotedFileSheetToken.Priority = TerminalPriority.QuotedFileToken;

            var ReservedNameToken = new RegexBasedTerminal(GrammarNames.TokenReservedName, @"_xlnm\.[a-zA-Z_]+");
            ReservedNameToken.Priority = TerminalPriority.ReservedName;

            var DDEToken = new RegexBasedTerminal(GrammarNames.TokenDDE, @"'([\[\]" + singleQuotedContent + @"]|'')+'");

            #endregion

            #region Punctuation
            MarkPunctuation(exclamationMark);
            MarkPunctuation(OpenParen, CloseParen);
            MarkPunctuation(OpenSquareParen, CloseSquareParen);
            MarkPunctuation(OpenCurlyParen, CloseCurlyParen);
            #endregion
            #endregion

            #region 2-NonTerminals
            // Most nonterminals are first defined here, so they can be used anywhere in the rules
            // Otherwise you can only use nonterminals that have been defined previously

            var Argument = new NonTerminal(GrammarNames.Argument);
            var Arguments = new NonTerminal(GrammarNames.Arguments);
            var ArrayColumns = new NonTerminal(GrammarNames.ArrayColumns);
            var ArrayConstant = new NonTerminal(GrammarNames.ArrayConstant);
            var ArrayFormula = new NonTerminal(GrammarNames.ArrayFormula);
            var ArrayRows = new NonTerminal(GrammarNames.ArrayRows);
            var Bool = new NonTerminal(GrammarNames.Bool);
            var Cell = new NonTerminal(GrammarNames.Cell);
            var Constant = new NonTerminal(GrammarNames.Constant);
            var ConstantArray = new NonTerminal(GrammarNames.ConstantArray);
            var DynamicDataExchange = new NonTerminal(GrammarNames.DynamicDataExchange);
            var EmptyArgument = new NonTerminal(GrammarNames.EmptyArgument);
            var Error = new NonTerminal(GrammarNames.Error);
            var File = new NonTerminal(GrammarNames.File);
            var Formula = new NonTerminal(GrammarNames.Formula);
            var FormulaWithEq = new NonTerminal(GrammarNames.FormulaWithEq);
            var FunctionCall = new NonTerminal(GrammarNames.FunctionCall);
            var FunctionName = new NonTerminal(GrammarNames.FunctionName);
            var HRange = new NonTerminal(GrammarNames.HorizontalRange);
            var InfixOp = new NonTerminal(GrammarNames.TransientInfixOp);
            var MultipleSheets = new NonTerminal(GrammarNames.MultipleSheets);
            var NamedRange = new NonTerminal(GrammarNames.NamedRange);
            var Number = new NonTerminal(GrammarNames.Number);
            var PostfixOp = new NonTerminal(GrammarNames.TransientPostfixOp);
            var Prefix = new NonTerminal(GrammarNames.Prefix);
            var PrefixOp = new NonTerminal(GrammarNames.TransientPrefixOp);
            var QuotedFileSheet = new NonTerminal(GrammarNames.QuotedFileSheet);
            var Reference = new NonTerminal(GrammarNames.Reference);
            //var ReferenceFunction = new NonTerminal(GrammarNames.ReferenceFunction);
            var ReferenceItem = new NonTerminal(GrammarNames.TransientReferenceItem);
            var ReferenceFunctionCall = new NonTerminal(GrammarNames.ReferenceFunctionCall);
            var RefError = new NonTerminal(GrammarNames.RefError);
            var RefFunctionName = new NonTerminal(GrammarNames.RefFunctionName);
            var ReservedName = new NonTerminal(GrammarNames.ReservedName);
            var Sheet = new NonTerminal(GrammarNames.Sheet);
            var Start = new NonTerminal(GrammarNames.TransientStart);
            var Text = new NonTerminal(GrammarNames.Text);
            var UDFName = new NonTerminal(GrammarNames.UDFName);
            var UDFunctionCall = new NonTerminal(GrammarNames.UDFunctionCall);
            var Union = new NonTerminal(GrammarNames.Union);
            var VRange = new NonTerminal(GrammarNames.VerticalRange);
            #endregion


            #region 3-Rules

            #region Base rules
            Root = Start;

            Start.Rule = FormulaWithEq
                         | Formula
                         | ArrayFormula
                         ;
            MarkTransient(Start);

            ArrayFormula.Rule = OpenCurlyParen + eqop + Formula + CloseCurlyParen;

            FormulaWithEq.Rule = eqop + Formula;

            Formula.Rule =
                Reference
                | Constant
                | FunctionCall
                | ConstantArray
                | OpenParen + Formula + CloseParen
                | ReservedName
                ;
            //MarkTransient(Formula);

            ReservedName.Rule = ReservedNameToken;

            Constant.Rule = Number
                            | Text
                            | Bool
                            | Error
                            ;

            Text.Rule = TextToken;
            Number.Rule = NumberToken;
            Bool.Rule = BoolToken;
            Error.Rule = ErrorToken;
            RefError.Rule = RefErrorToken;
            #endregion

            #region Functions

            FunctionCall.Rule =
                  FunctionName + Arguments + CloseParen
                | PrefixOp + Formula
                | Formula + PostfixOp
                | Formula + InfixOp + Formula
                ;
                
            FunctionName.Rule = ExcelFunction;

            Arguments.Rule = MakeStarRule(Arguments, comma, Argument);
            //Arguments.Rule = Argument | Argument + comma + Arguments;

            EmptyArgument.Rule = EmptyArgumentToken;
            Argument.Rule = Formula | EmptyArgument;
            //MarkTransient(Argument);

            PrefixOp.Rule =
                ImplyPrecedenceHere(Precedence.UnaryPreFix) + plusop
                | ImplyPrecedenceHere(Precedence.UnaryPreFix) + minop;
            MarkTransient(PrefixOp);

            InfixOp.Rule =
                  expop
                | mulop
                | divop
                | plusop
                | minop
                | concatop
                | gtop
                | eqop
                | ltop
                | neqop
                | gteop
                | lteop;
            MarkTransient(InfixOp);

            //PostfixOp.Rule = ImplyPrecedenceHere(Precedence.UnaryPostFix) + percentop;
            // ImplyPrecedenceHere doesn't seem to work for this rule, but postfix has such a high priority shift will nearly always be the correct action
            PostfixOp.Rule = PreferShiftHere() + percentop;
            MarkTransient(PostfixOp);
            #endregion

            #region References

            Reference.Rule = ReferenceItem
                | ReferenceFunctionCall
                | OpenParen + Reference + PreferShiftHere() + CloseParen
                | Prefix + ReferenceItem
                | DynamicDataExchange
                ;

            ReferenceFunctionCall.Rule =
                  Reference + colon + Reference
                | Reference + intersectop + Reference
                | OpenParen + Union + CloseParen
                | RefFunctionName + Arguments + CloseParen
                //| ConditionalRefFunctionName + Arguments + CloseParen
                ;

            RefFunctionName.Rule = ExcelRefFunctionToken | ExcelConditionalRefFunctionToken;

            Union.Rule = MakePlusRule(Union, comma, Reference);

            ReferenceItem.Rule =
                Cell
                | NamedRange
                | VRange
                | HRange
                | RefError
                | UDFunctionCall
                ;
            MarkTransient(ReferenceItem);

            UDFunctionCall.Rule = UDFName + Arguments + CloseParen;
            UDFName.Rule = UDFToken;

            VRange.Rule = VRangeToken;
            HRange.Rule = HRangeToken;
            
            //ConditionalRefFunctionName.Rule = ExcelConditionalRefFunctionToken;

            QuotedFileSheet.Rule = QuotedFileSheetToken;
            Sheet.Rule = SheetToken;
            MultipleSheets.Rule = MultipleSheetsToken;

            Cell.Rule = CellToken;

            File.Rule = OpenSquareParen + FileToken + CloseSquareParen;

            DynamicDataExchange.Rule = File + exclamationMark + DDEToken;

            NamedRange.Rule = NamedRangeToken | NamedRangeCombinationToken;

            Prefix.Rule =
                Sheet
                | File + Sheet
                | File + exclamationMark
                | QuotedFileSheet
                | MultipleSheets
                | File + MultipleSheets;

            #endregion

            #region Arrays
            ConstantArray.Rule = OpenCurlyParen + ArrayColumns + CloseCurlyParen;

            ArrayColumns.Rule = MakePlusRule(ArrayColumns, semicolon, ArrayRows);
            ArrayRows.Rule = MakePlusRule(ArrayRows, comma, ArrayConstant);

            ArrayConstant.Rule = Constant | PrefixOp + Number | RefError;
            #endregion

            #endregion

            #region 5-Operator Precedence            
            // Some of these operators are neutral associative instead of left associative,
            // but this ensures a consistent parse tree. As a lot of code is "hardcoded" onto the specific
            // structure of the parse tree, we like consistency.
            RegisterOperators(Precedence.Comparison, Associativity.Left, eqop, ltop, gtop, lteop, gteop, neqop);
            RegisterOperators(Precedence.Concatenation, Associativity.Left, concatop);
            RegisterOperators(Precedence.Addition, Associativity.Left, plusop, minop);
            RegisterOperators(Precedence.Multiplication, Associativity.Left, mulop, divop);
            RegisterOperators(Precedence.Exponentiation, Associativity.Left, expop);
            RegisterOperators(Precedence.UnaryPostFix, Associativity.Left, percentop);
            RegisterOperators(Precedence.Union, Associativity.Left, comma);
            RegisterOperators(Precedence.Intersection, Associativity.Left, intersectop);
            RegisterOperators(Precedence.Range, Associativity.Left, colon);

            //RegisterOperators(Precedence.ParameterSeparator, comma);

            #endregion
        }
        public KinectitudeGrammar()
        {
            Number.DefaultFloatType = TypeCode.Double;
            Number.DefaultIntTypes =  new TypeCode [] { TypeCode.Int64 };

            CommentTerminal lineComment = new CommentTerminal("Line Comment", "//", "\r\n", "\n");
            CommentTerminal blockComment = new CommentTerminal("Block Comment", "/*", "*/");
            NonGrammarTerminals.Add(lineComment);
            NonGrammarTerminals.Add(blockComment);

            #region constants
            Constants.Add("true", ConstantReader.TrueValue);
            Constants.Add("false",ConstantReader.FalseValue);
            Constants.Add("True", ConstantReader.TrueValue);
            Constants.Add("False", ConstantReader.FalseValue);
            Constants.Add("Pi", new ConstantReader(Math.PI));
            Constants.Add("E", new ConstantReader(Math.E));
            #endregion

            Constants.Priority = Identifier.Priority + 1;

            #region operator terminals
            Terminal openBrace = ToTerm("{");
            Terminal closeBrace = ToTerm("}");
            Terminal colon = ToTerm(":");
            Terminal comma = ToTerm(",");
            Terminal openBrac = ToTerm("(");
            Terminal closeBrac = ToTerm(")");
            Becomes = ToTerm("=", "Becomes");
            Eql = ToTerm("==", "Eql");
            Lt = ToTerm("<", "Lt");
            Gt = ToTerm(">", "Gt");
            Le = ToTerm("<=", "Le");
            Ge = ToTerm(">=", "Ge");
            Neq = ToTerm("!=", "ne");
            Plus = ToTerm("+", "Plus");
            Minus = ToTerm("-", "Minus");
            Mult = ToTerm("*", "Mult");
            Div = ToTerm("/", "Div");
            Rem = ToTerm("%", "Rem");
            Pow = ToTerm("**", "Pow");
            And = new RegexBasedTerminal("And", @"(&&)|(and)");
            Or = new RegexBasedTerminal("Or", @"(\|\|)|(or)");
            Not = new RegexBasedTerminal("Not", @"!|(not)");
            LeftShift = ToTerm("<<", "leftShitf");
            RightShift = ToTerm(">>", "RightShift");
            BPlus = ToTerm("+=", "Plus Equals");
            BMinus = ToTerm("-=", "Minus Equals");
            BMult = ToTerm("*=", "Mult Equals");
            BDiv = ToTerm("/=", "Div Equals");
            BRem = ToTerm("%=", "Rem Equals");
            BPow = ToTerm("^=", "Pow Equals");
            BAnd = ToTerm("&=", "And Equals");
            BOr = ToTerm("|=", "Or Equals");
            BLeftShift = ToTerm("<<=", "LShift Equals");
            BRightShift = ToTerm(">>=", "RShift Equals");

            NonTerminal becomesExpr = new NonTerminal("Becomes expr");
            becomesExpr.Rule = BPlus | BMinus | BDiv | BMult | BRem | BPow | BAnd | BOr | BLeftShift | BRightShift | Becomes;

            OpLookup[Plus] = OpLookup[BPlus] = OpCode.Plus;
            OpLookup[Minus] = OpLookup[BMinus] = OpCode.Minus;
            OpLookup[Div] = OpLookup[BDiv] = OpCode.Div;
            OpLookup[Mult] = OpLookup[BMult] = OpCode.Mult;
            OpLookup[Rem] = OpLookup[BRem] = OpCode.Rem;
            OpLookup[Pow] = OpLookup[BPow] = OpCode.Pow;
            OpLookup[And] = OpLookup[BAnd] = OpCode.And;
            OpLookup[Or] = OpLookup[BOr] = OpCode.Or;
            OpLookup[LeftShift] = OpLookup[BLeftShift] = OpCode.LeftShift;
            OpLookup[RightShift] = OpLookup[BRightShift] = OpCode.RightShift;
            OpLookup[Becomes] = OpCode.Becomes;

            OpLookup[Lt] = OpCode.Lt;
            OpLookup[Le] = OpCode.Le;
            OpLookup[Gt] = OpCode.Gt;
            OpLookup[Ge] = OpCode.Ge;
            OpLookup[Neq] = OpCode.Neq;
            OpLookup[Eql] = OpCode.Eql;
            #endregion

            #region values
            //NonTerminal value = new NonTerminal("value");
            NonTerminal exactValue = new NonTerminal("exactValue", "exactValue");
            #endregion

            #region value rules
            ThreeVal.Rule = Identifier + "." + Identifier + "." + Identifier;
            TwoVal.Rule = Identifier + "." + Identifier;
            IsType.Rule = "$" + Identifier;
            RegisterBracePair("(", ")");
            RegisterBracePair("{", "}");
            IsExactType.Rule = "#" + Identifier;
            ParentVal.Rule =  "^" + Identifier + "." + Identifier | "^" + Identifier + "." + Identifier + "." + Identifier;
            exactValue.Rule = Identifier | TwoVal | ThreeVal | ParentVal;
            TypeMatcher.Rule = IsType | IsExactType| IsType + Plus + TypeMatcher | IsExactType + Plus + TypeMatcher;
            Argument.Rule = Expr | Expr + "," + Argument;
            Function.Rule = Identifier + ToTerm("(") +")" | Identifier + "(" + Argument + ")";
            #endregion

            #region expressions
            NonTerminal term = new NonTerminal("term");
            Expr.Rule = Expr + BinOp + Expr | UniOp + Expr | term;
            BinOp.Rule = Plus | Minus | Div | Mult | Rem | Pow | And | Or | Eql | Neq | Gt | Ge | Lt | Le | LeftShift | RightShift;
            UniOp.Rule = Not | Minus;
            term.Rule = Number | Str | openBrac + Expr + closeBrac | exactValue | Constants | Function;
            #endregion

            #region operator precedence
            /* NOTE: Order is taken from C++/C# order with power added in.
             * Higher number = more important
             * Increments are by 10 to allow easy adding of new terms
             * Power is not in C++/C#, but has been added where is seems to fit
             */
            RegisterOperators(10, Associativity.Right, Becomes);
            RegisterOperators(20, Associativity.Left, Or);
            RegisterOperators(30, Associativity.Left, And);
            RegisterOperators(40, Associativity.Left, Eql, Neq);
            RegisterOperators(50, Associativity.Left, Eql, Neq);
            RegisterOperators(60, Associativity.Left, Ge, Le, Lt, Gt);
            RegisterOperators(70, Associativity.Left, LeftShift, RightShift);
            RegisterOperators(70, Associativity.Left, Plus, Minus);
            RegisterOperators(80, Associativity.Left, Div, Mult, Rem);
            RegisterOperators(90, Associativity.Left, Pow);
            RegisterOperators(100, Associativity.Left, Not);

            #endregion

            #region game creation rules
            NonTerminal IsPrototype = new NonTerminal("IsPrototype", "IsPrototype");

            value.Rule = TypeMatcher | Expr;

            Names.Rule = Identifier + comma + Names | Identifier;
            IsPrototype.Rule = colon + Names | Empty;

            NonTerminal optionalProperties = new NonTerminal("optionalProperties", "optionalProperties");
            optionalProperties.Rule = Properties | Empty;
            Properties.Rule = Identifier + Becomes + value | Identifier + Becomes + value + comma + optionalProperties;

            BasicDefinition.Rule = openBrac + optionalProperties + closeBrac;

            NonTerminal optionalComponent = new NonTerminal("optionalComponent", "optionalComponent");
            optionalComponent.Rule = Component | Empty;
            Component.Rule = "Component" + Identifier + BasicDefinition + optionalComponent;

            NonTerminal optionalPrototype = new NonTerminal("optionalPrototype", "optionalPrototype");
            optionalPrototype.Rule = Prototype | Empty;
            Prototype.Rule = "Prototype" + Identifier + EntityDefinition + optionalPrototype;

            NonTerminal optionalManager = new NonTerminal("optionalManager", "optionalManager");
            optionalManager.Rule = Manager | Empty;
            Manager.Rule = "Manager" + Identifier + BasicDefinition + optionalManager;

            NonTerminal optionalService = new NonTerminal("optionalService", "optionalService");
            optionalService.Rule = Service | Empty;
            Service.Rule = "Service" + Identifier + BasicDefinition + optionalService;

            Else.Rule = ToTerm("else") + "if" + openBrac + Expr + closeBrac + openBrace + Actions + closeBrace + Else |
                ToTerm("else") + "if" + openBrac + Expr + closeBrac + openBrace + Actions + closeBrace |
                 "else" + openBrace + Actions + closeBrace + Else |
                 "else" + openBrace + Actions + closeBrace;

            Condition.Rule = "if" + openBrac + Expr + closeBrac + openBrace + Actions + closeBrace + Else |
                "if" + openBrac + Expr + closeBrac + openBrace + Actions + closeBrace;

            NonTerminal optionalAssignment = new NonTerminal("optionalAssignment", "optionalAssignment");
            optionalAssignment.Rule = Assignment | Empty;
            Loop.Rule = "while" + openBrac + Expr + closeBrac + openBrace + Actions + closeBrace |
                "for" + openBrac + optionalAssignment + ";" + Expr + ";" + Assignment + closeBrac + openBrace + Actions + closeBrace;

            NonTerminal optionalActions = new NonTerminal("OptionalActions", "OptionalActions");

            Action.Rule = Identifier + BasicDefinition;

            Assignment.Rule = exactValue + becomesExpr + Expr;

            Actions.Rule = Condition + optionalActions | Action + optionalActions | Assignment + optionalActions | Loop + optionalActions;
            optionalActions.Rule = Actions | Empty;

            NonTerminal optionalEvt = new NonTerminal("optionalEvt", "optionalEvt");
            optionalEvt.Rule = Evt | Empty;
            Evt.Rule = "Event" + Identifier + BasicDefinition + openBrace + optionalActions + closeBrace + optionalEvt;

            EntityDefinition.Rule = IsPrototype + BasicDefinition + openBrace + optionalComponent + optionalEvt + closeBrace;

            NonTerminal optionalEntity = new NonTerminal("optionalEntity", "optionalEntity");
            optionalEntity.Rule = Entity | Empty;

            NonTerminal optionalIdentifier = new NonTerminal("optionalIdentifier", "optionalIdentifier");
            optionalIdentifier.Rule = Identifier | Empty;
            Entity.Rule = "Entity" + optionalIdentifier + EntityDefinition + optionalEntity;

            NonTerminal optionalScene = new NonTerminal("optionalScene", "optionalScene");
            optionalScene.Rule = Scene | Empty;
            Scene.Rule = "Scene" + Identifier + BasicDefinition + openBrace + optionalManager + optionalEntity + closeBrace + optionalScene;

            NonTerminal optionalDefinitions = new NonTerminal("optionalDefinitions", "optionalDefinitions");
            optionalDefinitions.Rule = Definitions | Empty;
            Definitions.Rule = "define" + Identifier + "as" + ClassName + optionalDefinitions;

            NonTerminal optionalUses = new NonTerminal("optionalUses", "optionalUses");
            optionalUses.Rule = Uses | Empty;
            Uses.Rule = "using" + ClassName + openBrace + Definitions + closeBrace + optionalUses;

            Game.Rule = optionalUses + "Game" + BasicDefinition + openBrace + optionalPrototype + optionalService + Scene + closeBrace;
            #endregion

            Root = Game;
            //Removes from the tree, we don't care about having these there
            MarkPunctuation("{", "}", "(", ")", ":", "$", "@", "#", "^", "Game", "using", "define", "Scene", "Entity",
                 ",", "if", "Component", "Manager", "Prototype", "=", ".", "as", "Event", "else", "Service", ";", "while", "for");
            MarkReservedWords("using", "define", "if", "else", "while", "for");
            MarkTransient(BasicDefinition, value, IsPrototype, term, exactValue, optionalActions, optionalEvt, optionalComponent,
                optionalProperties, optionalManager, optionalPrototype, optionalService, optionalUses, optionalDefinitions,
                optionalEntity, optionalScene, optionalIdentifier, optionalAssignment, becomesExpr);
        }
        public Gramatica_ER()
        {
            //creacion de los terminales, y las ER que utilizara la gramatica
            #region Terminales

            IdentifierTerminal id = new IdentifierTerminal("identificador");
            NumberLiteral num = new NumberLiteral("numero");
            RegexBasedTerminal ascii = new RegexBasedTerminal("ascii", "[^\020\013\010\009]");



            #endregion

            //definicion de no terminales
            #region No Terminales

            NonTerminal S0 = new NonTerminal("S0"),
                        S1 = new NonTerminal("S1"),
                        L_CONTENIDO = new NonTerminal("L_CONTENIDO"),
                        E_CONT = new NonTerminal("E_CONT"),
                        CONTENIDO = new NonTerminal("CONT"),
                        CONJUNTO = new NonTerminal("CONJUNTO"),
                        RETORNO = new NonTerminal("RETORNO"),
                        L_CONJUNTO = new NonTerminal("L_CONJUNTO"),
                        EXP_REGULAR = new NonTerminal("EXP_REGULAR"),
                        CUANTIFICADORES = new NonTerminal("CUANTIFICADORES"),
                        OPERADOR = new NonTerminal("OPERADOR"),
                        OPERANDO = new NonTerminal("OPERANDO"),
                        RESERV = new NonTerminal("RESERV"),
                        TIPO = new NonTerminal("TIPO"),
                        RESERV_LIST = new NonTerminal("RESERV_LIST"),
                        RESERV_WORD = new NonTerminal("RESERV_WORD");

            #endregion


            #region Gramatica

            //S0 es el inicio de la gramatica

            S0.Rule = S1;

            S1.Rule = ToTerm("%%") + L_CONTENIDO + ToTerm("%%");

            L_CONTENIDO.Rule = ToTerm("CONJ") + ToTerm(":") + id + ToTerm("->") + CONJUNTO + ToTerm(";") + L_CONTENIDO
                | id + ToTerm("->") + EXP_REGULAR + ToTerm("->") + RETORNO + ToTerm(";") + L_CONTENIDO
                | ToTerm("error") + ToTerm("->") + EXP_REGULAR + ToTerm("->") + ToTerm("error") 
                    + ToTerm("(") + ToTerm("yyline") + ToTerm(",") + ToTerm("yyrow") + ToTerm(",") + ToTerm("yytext")
                    + ToTerm(")") + ToTerm(";") + E_CONT
                | Empty
                ;

            E_CONT.Rule = MakeStarRule(E_CONT, CONTENIDO)
                ;
            
            CONTENIDO.Rule = ToTerm("CONJ") + ToTerm(":") + id + ToTerm("->") + CONJUNTO + ToTerm(";")
                | id + ToTerm("->") + EXP_REGULAR + ToTerm("->") + RETORNO + ToTerm(";")
                ;

            RETORNO.Rule = ToTerm("retorno") + ToTerm("(") + id + ToTerm(",") + ToTerm("yytext") + ToTerm(",") + TIPO + ToTerm(",") + ToTerm("yyline") + ToTerm(",") + ToTerm("yyrow") + ToTerm(")") + RESERV
                | ToTerm("retorno") + ToTerm("(") + id + ToTerm(",") + ToTerm("yyline") + ToTerm(",") + ToTerm("yyrow") + ToTerm(")")
                ;

            RESERV.Rule = ToTerm("->")  + ToTerm("RESERV") + ToTerm("[") + RESERV_LIST + ToTerm("]")
                | Empty
                ;

            RESERV_LIST.Rule = MakePlusRule(RESERV_LIST,RESERV_WORD)
                ;

            RESERV_WORD.Rule = ToTerm("\"") + OPERANDO + ToTerm("\"") + ToTerm("->") + ToTerm("retorno") + ToTerm("(") + id + ToTerm(",") + ToTerm("yyline") + ToTerm(",") + ToTerm("yyrow") + ToTerm(")") + ToTerm(";")
                ;

            CONJUNTO.Rule = CONJUNTO + ToTerm(",") + CONJUNTO
                | CONJUNTO + ToTerm("~") + CONJUNTO
                | OPERANDO
                ;

            EXP_REGULAR.Rule = EXP_REGULAR + EXP_REGULAR + OPERADOR
                | EXP_REGULAR + CUANTIFICADORES
                | id
                | ToTerm("\'") + ascii + ToTerm("\'")
                | ToTerm("\"") + ascii + ToTerm("\"")
                | ToTerm("\\\'")
                | ToTerm("\\\"")
                | ToTerm("\\n")
                | ToTerm("\\t")
                | ToTerm("[:todo:]")
                | ToTerm("[:blanco:]")
                ;

            OPERADOR.Rule = ToTerm(".")
                | ToTerm("|")
                ;

            CUANTIFICADORES.Rule = ToTerm("+")
                | ToTerm("*")
                | ToTerm("?")
                ;

            TIPO.Rule = ToTerm("string")
                | ToTerm("char")
                | ToTerm("int")
                | ToTerm("float")
                | ToTerm("bool")
                ;

            OPERANDO.Rule = ascii
                | id
                | num
                ;

            this.Root = S0;
            //this.MarkReservedWords("CONJ", "retorno", "yytext", "yyline", "yyrow", "retorno", "RESERV");
            this.RegisterOperators(1, ",");
            this.RegisterOperators(2, "~");
            #endregion
        }
Exemple #11
0
        /// <summary>Creates a new instance of the <see cref="CqlGrammar" /> class.</summary>
        public CqlGrammar():
            base(true)
        {
            GrammarComments="OGC Common Catalogue Query Language grammar as defined in [OGC 07-006r1 §6.2.2]";

            // Terminals
            var identifier=new IdentifierTerminal("identifier", ":", "");
            identifier.StartCharCategories.AddRange(
                new UnicodeCategory[] {
                    UnicodeCategory.UppercaseLetter, //Ul
                    UnicodeCategory.LowercaseLetter  //Ll
                }
            );
            identifier.CharCategories.AddRange(
                new UnicodeCategory[] {
                    UnicodeCategory.UppercaseLetter, //Ul
                    UnicodeCategory.LowercaseLetter, //Ll
                    UnicodeCategory.DecimalDigitNumber //Nd
                }
            );
            //var digit_literal=new FixedLengthLiteral("digit", 1, TypeCode.Byte);
            var numeric_literal=new NumberLiteral("numeric literal", NumberOptions.AllowSign, typeof(Ast.DefaultLiteralNode));
            var unsigned_numeric_literal=new NumberLiteral("unsigned numeric literal", NumberOptions.None, typeof(Ast.DefaultLiteralNode));
            //var integer_literal=new NumberLiteral("integer literal", NumberOptions.IntOnly | NumberOptions.NoDotAfterInt);
            //var character_literal=new StringLiteral("character literal", "'", StringOptions.IsChar | StringOptions.AllowsDoubledQuote);
            var string_literal=new StringLiteral("string literal", "'", StringOptions.AllowsDoubledQuote, typeof(Ast.DefaultLiteralNode));
            var period=ToTerm(".", "period");
            var comma=ToTerm(",", "comma");
            var left_paren=ToTerm("(", "left paren");
            var right_paren=ToTerm(")", "right paren");
            left_paren.SetFlag(TermFlags.IsOpenBrace);
            left_paren.IsPairFor=right_paren;
            right_paren.SetFlag(TermFlags.IsCloseBrace);
            right_paren.IsPairFor=left_paren;

            var TRUE=ToTerm("TRUE");
            var FALSE=ToTerm("FALSE");
            var UNKNOWN=ToTerm("UNKNOWN");
            var NULL=ToTerm("NULL");

            var AFTER=ToTerm("AFTER");
            var AND=ToTerm("AND");
            var BEFORE=ToTerm("BEFORE");
            var BEYOND=ToTerm("BEYOND");
            var CONTAINS=ToTerm("CONTAINS");
            var CROSSES=ToTerm("CROSSES");
            var DISJOINT=ToTerm("DISJOINT");
            var DOESNOTEXIST=ToTerm("DOESNOTEXIST");
            var DURING=ToTerm("DURING");
            var DWITHIN=ToTerm("DWITHIN");
            var EQUALS=ToTerm("EQUALS", "Equal");
            var EXISTS=ToTerm("EXISTS");
            var INTERSECTS=ToTerm("INTERSECTS");
            var LIKE=ToTerm("LIKE");
            var NOT=ToTerm("NOT");
            var OR=ToTerm("OR");
            var OVERLAPS=ToTerm("OVERLAPS");
            var RELATE=ToTerm("RELATE");
            var TOUCHES=ToTerm("TOUCHES");
            var WITHIN=ToTerm("WITHIN");

            var equals_operator=ToTerm("=", "equals operator");
            var greater_than_operator=ToTerm(">", "greater than operator");
            var less_than_operator=ToTerm("<", "less than operator");
            var not_equals_operator=ToTerm("<>", "not equals operator");
            var greater_than_or_equals_operator=ToTerm(">=", "greater than or equals operator");
            var less_than_or_equals_operator=ToTerm("<=", "less than or equals operator");
            var date_time=new RegexBasedTerminal(name: "date-time", pattern: @"(?<fulldate>(?<dateyear>\d{4})-(?<datemonth>\d{2})-(?<dateday>\d{2}))T(?<UTCtime>(?<timehour>\d{2}):(?<timeminute>\d{2}):(?<timesecond>\d{2}(\.\d+)?)Z)");
            var duration=new RegexBasedTerminal(name: "duration", pattern: @"P((?<duryear>\d+)Y)?((?<durmonth>\d+)M)?((?<durday>\d+)D)?(T((?<durhour>\d+)H)?((?<durminute>\d+)M)?((?<dursecond>\d+)S)?)?");

            AFTER.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            AND.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            BEFORE.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            BEYOND.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            CONTAINS.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            CROSSES.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            DISJOINT.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            DURING.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            DOESNOTEXIST.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            DURING.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            DWITHIN.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            EQUALS.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            EXISTS.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            INTERSECTS.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            LIKE.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            NOT.AstConfig.NodeType=typeof(Ast.NotKeywordNode);
            OR.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            OVERLAPS.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            //RELATE.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            TOUCHES.AstConfig.NodeType=typeof(Ast.OperatorNameNode);
            WITHIN.AstConfig.NodeType=typeof(Ast.OperatorNameNode);

            date_time.AstConfig.NodeType=typeof(Ast.DateTimeLiteralNode);
            duration.AstConfig.NodeType=typeof(Ast.DurationLiteralNode);

            // Non terminals
            var optional_not=new NonTerminal("optional not", Empty | NOT);

            var attribute_name=new NonTerminal("attribute name", typeof(Ast.AttributeNameNode));
            var search_condition=new NonTerminal("search condition");
            var boolean_value_expression=new NonTerminal("boolean value expression", typeof(Ast.BooleanValueExpressionNode));
            var boolean_term=new NonTerminal("boolean term", typeof(Ast.BooleanTermNode));
            var boolean_factor=new NonTerminal("boolean factor", typeof(Ast.BooleanFactorNode));
            var boolean_primary=new NonTerminal("boolean primary");
            var predicate=new NonTerminal("predicate");
            var temporal_predicate=new NonTerminal("temporal predicate", typeof(Ast.TemporalPredicateNode));
            var date_time_expression=new NonTerminal("date-time expression");
            var existence_predicate=new NonTerminal("existence predicate", typeof(Ast.ExistencePredicateNode));
            var comparison_predicate=new NonTerminal("comparison predicate", typeof(Ast.ComparisonPredicateNode));
            var text_predicate=new NonTerminal("text predicate", typeof(Ast.TextPredicateNode));
            var null_predicate=new NonTerminal("null predicate", typeof(Ast.NullPredicateNode));
            var comp_op=new NonTerminal("comp op", equals_operator | not_equals_operator | less_than_operator | greater_than_operator | less_than_or_equals_operator | greater_than_or_equals_operator);
            var general_literal=new NonTerminal("general literal");
            var literal=new NonTerminal("literal");
            var boolean_literal=new NonTerminal("boolean literal", TRUE | FALSE | UNKNOWN);
            boolean_literal.AstConfig.NodeType=typeof(Ast.BooleanLiteralNode);
            var routine_invocation=new NonTerminal("routine invocation");
            var geoop_routine=new NonTerminal("geoop routine", typeof(Ast.GeoOperatorRoutineNode));
            var relgeoop_routine=new NonTerminal("relgeoop routine", typeof(Ast.RelativeGeoOperatorRoutineNode));
            var routine=new NonTerminal("routine");
            var geoop_name=new NonTerminal("geoop name");
            var relgeoop_name=new NonTerminal("relgeoop name");
            var argument=new NonTerminal("argument");
            var positional_arguments=new NonTerminal("positional arguments");
            var tolerance=new NonTerminal("tolerance", typeof(Ast.ToleranceNode));
            var distance_units=new NonTerminal("distance units");

            var geometry_literal=new NonTerminal("geometry literal", typeof(Ast.GeometryLiteralNode));
            var geometry_literal_series=new NonTerminal("geometry literal series");
            var point_tagged_text=new NonTerminal("Point Tagged Text");
            var linestring_tagged_text=new NonTerminal("LineString Tagged Text");
            var polygon_tagged_text=new NonTerminal("Polygon Tagged Text");
            var multipoint_tagged_text=new NonTerminal("MultiPoint Tagged Text");
            var multilinestring_tagged_text=new NonTerminal("MultiLineString Tagged Text");
            var multipolygon_tagged_text=new NonTerminal("MultiPolygon Tagged Text");
            var geometrycollection_tagged_text=new NonTerminal("GeometryCollection Tagged Text");
            var point_text=new NonTerminal("Point Text");
            var point_text_series=new NonTerminal("Point Text series");
            var point=new NonTerminal("Point");
            var point_series=new NonTerminal("Point series");
            var x=new NonTerminal("x");
            var y=new NonTerminal("y");
            var linestring_text=new NonTerminal("LineString Text");
            var linestring_text_series=new NonTerminal("LineString Text series");
            var polygon_text=new NonTerminal("Polygon Text");
            var polygon_text_series=new NonTerminal("Polygon Text series");
            var multipoint_text=new NonTerminal("MultiPoint Text");
            var multilinestring_text=new NonTerminal("MultiLineString Text");
            var multipolygon_text=new NonTerminal("MultiPolygon Text");
            var geometrycollection_text=new NonTerminal("GeometryCollection Text");
            var envelope_tagged_text=new NonTerminal("Envelope Tagged Text");
            var envelope_text=new NonTerminal("Envelope Text");
            var westboundlongitude=new NonTerminal("WestBoundLongitude", numeric_literal);
            var eastboundlongitude=new NonTerminal("EastBoundLongitude", numeric_literal);
            var northboundlongitude=new NonTerminal("NorthBoundLongitude", numeric_literal);
            var southboundlongitude=new NonTerminal("SouthBoundLongitude", numeric_literal);

            var date_time_period=new NonTerminal("date-time period", typeof(Ast.DateTimePeriodNode));

            identifier.AstConfig.NodeType=typeof(IdentifierNode);
            attribute_name.Rule=MakePlusRule(attribute_name, period, identifier);

            search_condition.Rule=boolean_value_expression;
            boolean_value_expression.Rule=MakePlusRule(boolean_value_expression, OR, boolean_term);
            boolean_term.Rule=MakePlusRule(boolean_term, AND, boolean_factor);
            boolean_factor.Rule=optional_not + boolean_primary;
            boolean_primary.Rule=predicate | routine_invocation | (left_paren + search_condition + right_paren);
            predicate.Rule=comparison_predicate | text_predicate | null_predicate | temporal_predicate | existence_predicate;
            temporal_predicate.Rule=(attribute_name + BEFORE + date_time_expression) | (attribute_name + BEFORE + OR + DURING + date_time_period) | (attribute_name + DURING + date_time_period) | (attribute_name + DURING + OR + AFTER + date_time_period) | (attribute_name + AFTER + date_time_expression);
            date_time_expression.Rule=date_time | date_time_period;
            existence_predicate.Rule=(attribute_name + EXISTS) | (attribute_name + DOESNOTEXIST);
            comparison_predicate.Rule=attribute_name + comp_op + literal;
            text_predicate.Rule=attribute_name + optional_not + LIKE + string_literal;
            null_predicate.Rule=attribute_name + "IS" + optional_not + NULL;
            general_literal.Rule=string_literal | boolean_literal | date_time_expression | geometry_literal;
            literal.Rule=numeric_literal | general_literal;
            routine_invocation.Rule=geoop_routine | relgeoop_routine | routine;
            geoop_name.Rule=EQUALS | DISJOINT | INTERSECTS | TOUCHES | CROSSES | WITHIN | CONTAINS | OVERLAPS | RELATE;
            relgeoop_name.Rule=DWITHIN | BEYOND;
            argument.Rule=literal | attribute_name;
            positional_arguments.Rule=MakePlusRule(positional_arguments, comma, argument);
            geoop_routine.Rule=geoop_name + left_paren + attribute_name + comma + geometry_literal + right_paren;
            relgeoop_routine.Rule=relgeoop_name + left_paren + attribute_name + comma + geometry_literal + comma + tolerance + right_paren;
            routine.Rule=attribute_name + left_paren + positional_arguments + right_paren;
            tolerance.Rule=unsigned_numeric_literal + comma + distance_units;
            distance_units.Rule=ToTerm("feet") | "meters" | ("statute" + "miles") | ("nautical" + "miles") | "kilometers";

            geometry_literal.Rule=point_tagged_text | linestring_tagged_text | polygon_tagged_text | multipoint_tagged_text | multilinestring_tagged_text | multipolygon_tagged_text | geometrycollection_tagged_text | envelope_tagged_text;
            geometry_literal_series.Rule=MakePlusRule(geometry_literal_series, comma, geometry_literal);
            point_tagged_text.Rule=ToTerm("POINT") + point_text;
            linestring_tagged_text.Rule=ToTerm("LINESTRING") + linestring_text;
            polygon_tagged_text.Rule=ToTerm("POLYGON") + polygon_text;
            multipoint_tagged_text.Rule=ToTerm("MULTIPOINT") + multipoint_text;
            multilinestring_tagged_text.Rule=ToTerm("MULTILINESTRING") + multilinestring_text;
            multipolygon_tagged_text.Rule=ToTerm("MULTIPOLYGON") + multipolygon_text;
            geometrycollection_tagged_text.Rule=ToTerm("GEOMETRYCOLLECTION") + geometrycollection_text;
            point_text.Rule=Empty | (left_paren + point + right_paren);
            point_text_series.Rule=MakePlusRule(point_text_series, comma, point_text);
            point.Rule=x + y;
            x.Rule=numeric_literal;
            y.Rule=numeric_literal;
            point_series.Rule=MakePlusRule(point_series, comma, point);
            linestring_text.Rule=Empty | (left_paren + point_series + right_paren);
            linestring_text_series.Rule=MakePlusRule(linestring_text_series, comma, linestring_text);
            polygon_text.Rule=Empty | (left_paren + linestring_text_series + right_paren);
            polygon_text_series.Rule=MakePlusRule(polygon_text_series, comma, polygon_text);
            multipoint_text.Rule=Empty | (left_paren + point_text_series + right_paren);
            multilinestring_text.Rule=Empty | (left_paren + linestring_text_series + right_paren);
            multipolygon_text.Rule=Empty | (left_paren + polygon_text_series + right_paren);
            geometrycollection_text.Rule=Empty | (left_paren + geometry_literal_series + right_paren);
            envelope_tagged_text.Rule=ToTerm("ENVELOPE") + envelope_text;
            envelope_text.Rule=Empty | left_paren + westboundlongitude + comma + eastboundlongitude + comma + northboundlongitude + comma + southboundlongitude + right_paren;

            date_time_period.Rule=(date_time + "/" + date_time) | (date_time + "/" + duration) | (duration + "/" + date_time);
            date_time_expression.Rule=date_time | date_time_period;

            // Operators
            RegisterOperators(10, equals_operator, not_equals_operator, greater_than_operator, greater_than_or_equals_operator, less_than_operator, less_than_or_equals_operator);
            RegisterOperators(3, NOT);
            RegisterOperators(2, OR);
            RegisterOperators(1, AND);
            RegisterOperators(0, BEYOND, WITHIN);

            _OperatorHandler=new OperatorHandler(true);
            var oid=_OperatorHandler.BuildDefaultOperatorMappings();
            oid.Clear();
            oid.Add(equals_operator.Text, ExpressionType.Equal, 10);
            oid.Add(not_equals_operator.Text, ExpressionType.NotEqual, 10);
            oid.Add(greater_than_operator.Text, ExpressionType.GreaterThan, 10);
            oid.Add(greater_than_or_equals_operator.Text, ExpressionType.GreaterThanOrEqual, 10);
            oid.Add(less_than_operator.Text, ExpressionType.LessThan, 10);
            oid.Add(less_than_or_equals_operator.Text, ExpressionType.LessThanOrEqual, 10);
            oid.Add(NOT.Text, ExpressionType.Not, 3);
            oid.Add(OR.Text, ExpressionType.OrElse, 2);
            oid.Add(AND.Text, ExpressionType.AndAlso, 1);

            oid.Add(BEYOND.Text, ExpressionType.GreaterThanOrEqual, 0);
            oid.Add(DWITHIN.Text, ExpressionType.LessThanOrEqual, 0);

            // Grammar
            MarkMemberSelect(":");
            MarkPunctuation(left_paren, right_paren, period, comma);
            MarkTransient(argument, boolean_primary, comp_op, date_time_expression, general_literal, geometry_literal, geoop_name, literal, optional_not, predicate, relgeoop_name, search_condition);

            Root=search_condition;
            LanguageFlags=LanguageFlags.CreateAst;
        }
        public Gramatica()
        {
            
            //1. TERMINALES
            //Terminales Definidos en base a expresiones regulares
            IdentifierTerminal iden = new IdentifierTerminal("iden");
            StringLiteral cadena = new StringLiteral("cadena", "\"");
            RegexBasedTerminal caracter = new RegexBasedTerminal("caracter", "\"[^\020\013\010\009\042]\"");
            RegexBasedTerminal rango1 = new RegexBasedTerminal("rango1", "([^\020\013\010\009]|[0-9]+)~([^\020\013\010\009]|[0-9]+)");
            RegexBasedTerminal rango2 = new RegexBasedTerminal("rango2", "([^\020\013\010\009]|[0-9]+)(,([^\020\013\010\009]|[0-9]+))+");
            //Terminales definidos de manera especifica
            var inicio_fin = ToTerm("%%");
            var s_apuntar = ToTerm("->");
            var s_colon = ToTerm(":");
            var s_or = ToTerm("|");
            var s_mul = ToTerm("*");
            var s_sum = ToTerm("+");
            var s_ques = ToTerm("?");
            var s_dot = ToTerm(".");
            var s_enter = ToTerm("\n");
            var s_quo = ToTerm("\'");
            var s_doquo = ToTerm("\"");
            var s_tab = ToTerm("\t");
            var s_white = ToTerm("[:blanco:]");
            var s_all = ToTerm("[todo:]");
            var s_par_a = ToTerm("(");
            var s_par_c = ToTerm(")");
            var s_key_a = ToTerm("[");
            var s_key_c = ToTerm("]");
            var s_cor_a = ToTerm("{");
            var s_cor_c = ToTerm("}");
            var s_semicolon = ToTerm(";");
            var s_comma = ToTerm(",");
            var r_return = ToTerm("retorno");
            var r_string = ToTerm("string");
            var r_char = ToTerm("char");
            var r_int = ToTerm("int");
            var r_float = ToTerm("float");
            var r_bool = ToTerm("bool");
            var r_text = ToTerm("yytext");
            var r_line = ToTerm("yyline");
            var r_row = ToTerm("yyrow"); 
            var r_conj = ToTerm("CONJ");
            var r_reserv = ToTerm("RESERV");
            var r_all = ToTerm("[:Todo:]");
            var r_white = ToTerm("[:Blanco:]");
            
            //2. NO TERMINALES
            NonTerminal S0 = new NonTerminal("S0");
            NonTerminal LENGUAJE = new NonTerminal("LENGUAJE");
            NonTerminal SENTENCIAS = new NonTerminal("SENTENCIAS");
            NonTerminal SENTENCIA = new NonTerminal("SENTENCIA");
            NonTerminal CONJUNTO = new NonTerminal("CONJUNTO");
            NonTerminal EXPRESIONES = new NonTerminal("EXPRESIONES");
            NonTerminal EXPRESION = new NonTerminal("EXPRESION");
            NonTerminal ER = new NonTerminal("ER");
            NonTerminal ER2 = new NonTerminal("ER2");
            NonTerminal ER3 = new NonTerminal("ER3");
            NonTerminal ID = new NonTerminal("ID");
            NonTerminal RETURN = new NonTerminal("RETURN");
            NonTerminal RETURN2 = new NonTerminal("RETURN2");
            NonTerminal RETURN3 = new NonTerminal("RETURN3");
            NonTerminal RESERV = new NonTerminal("RESERV");
            NonTerminal RESERV2 = new NonTerminal("RESERV");
            NonTerminal RESERV3 = new NonTerminal("RESERV");

            //3. PRECEDENCIA DE OPERADORES

            //4. TERMINOS DE PUNTUACION

            //5. GRAMATICA
            S0.Rule = LENGUAJE;

            LENGUAJE.Rule = inicio_fin + SENTENCIAS + inicio_fin;

            SENTENCIAS.Rule = MakePlusRule(SENTENCIAS, SENTENCIA); 

            SENTENCIA.Rule = CONJUNTO
                            | EXPRESION;

            CONJUNTO.Rule = r_conj + s_colon + iden + s_apuntar + rango1 + s_semicolon
                           | r_conj + s_colon + iden + s_apuntar + rango2 + s_semicolon;
                           
            EXPRESION.Rule = iden + s_apuntar + ER + s_apuntar + RETURN + s_semicolon
                            | iden + s_apuntar + ER + s_apuntar + RETURN + s_apuntar+ RESERV + s_semicolon ;

            ER.Rule = ER2
                      | ER3
                      | ID;

            ER2.Rule = ER + ER + s_or
                | ER + ER + s_dot;

            ER3.Rule = ER + s_mul
                 | ER + s_sum
                 | ER + s_ques;         
            

            ID.Rule = iden
                      | caracter
                      | rango1
                      | rango2;

            RETURN.Rule = r_return + s_par_a + iden + s_comma + RETURN2 + s_par_c;

            RETURN2.Rule = MakeListRule(RETURN2, s_comma, RETURN3);

            RETURN3.Rule = r_text
                            | r_line
                            | r_row
                            | r_string
                            | r_char
                            | r_float
                            | r_int
                            | r_bool;

            RESERV.Rule = r_reserv + s_apuntar + s_key_a + RESERV2 + s_key_c;

            RESERV2.Rule = MakePlusRule(RESERV2, RESERV3);

            RESERV3.Rule = cadena + s_apuntar + RETURN + s_semicolon;

            this.Root = S0;
            //this.MarkTransient(SENTENCIAS);
        }
        protected WebIDLGrammar(bool webglSpecific, Dictionary<string,AstNodeCreator> astActionMap)
        {
            ast_action_map = astActionMap;

            var single_line_comment = new CommentTerminal ("SingleLineComment", "//", "\r", "\n");
            ApplyCreator (single_line_comment);
            var delimited_comment = new CommentTerminal ("DelimitedComment", "/*", "*/");
            ApplyCreator (delimited_comment);

            NonGrammarTerminals.Add (single_line_comment);
            if (!webglSpecific)
            NonGrammarTerminals.Add (delimited_comment);

            // FIXME: should be generic identifiers or its own.
            IdentifierTerminal identifier = new IdentifierTerminal ("Identifier");
            ApplyCreator (identifier);
            StringLiteral string_literal = new StringLiteral ("StringLiteral", "\"");
            NumberLiteral integer_literal = new NumberLiteral ("Integer") { Options = NumberOptions.IntOnly | NumberOptions.AllowSign | NumberOptions.Hex };
            NumberLiteral float_literal = TerminalFactory.CreateCSharpNumber ("Float");
            var other_literal = new RegexBasedTerminal ("[^\t\n\r 0-9A-Z_a-z]");

            var definitions = CreateNonTerminal ("Definitions");
            var x_definition = CreateNonTerminal ("x_definition");
            var definition = CreateNonTerminal ("Definition");
            var module = CreateNonTerminal ("Module");
            var interface_ = CreateNonTerminal ("Interface");
            var interface_inheritance = CreateNonTerminal ("InterfaceInheritance");
            var interface_members = CreateNonTerminal ("InterfaceMembers");
            var x_interface_member = CreateNonTerminal ("x_interface_member");
            var interface_member = CreateNonTerminal ("InterfaceMember");
            var exception = CreateNonTerminal ("Exception");
            var exception_members = CreateNonTerminal ("ExceptionMembers");
            var typedef = CreateNonTerminal ("Typedef");
            var implements_statement = CreateNonTerminal ("ImplementsStatement");
            var const_ = CreateNonTerminal ("Const");
            var const_expr = CreateNonTerminal ("ConstExpr");
            var boolean_literal = CreateNonTerminal ("BooleanLiteral");
            var attribute_or_operation = CreateNonTerminal ("AttributeOrOperation");
            var stringified_att_oper = CreateNonTerminal ("stringified_attr_or_oper");
            var stringifier_attribute_or_operation = CreateNonTerminal ("StringifierAttributeOrOperation");
            var attribute = CreateNonTerminal ("Attribute");
            var readonly_ = CreateNonTerminal ("ReadOnly");
            var get_raises = CreateNonTerminal ("GetRaises");
            var set_raises = CreateNonTerminal ("SetRaises");
            var operation = CreateNonTerminal ("Operation");
            var qualifiers = CreateNonTerminal ("Qualifiers");
            var specials = CreateNonTerminal ("Specials");
            var special = CreateNonTerminal ("Special");
            var operation_rest = CreateNonTerminal ("OperationRest");
            var optional_identifier = CreateNonTerminal ("OptionalIdentifier");
            var raises = CreateNonTerminal ("Raises");
            var exception_list = CreateNonTerminal ("ExceptionList");
            var argument_list = CreateNonTerminal ("ArgumentList");
            var arguments = CreateNonTerminal ("Arguments");
            var argument = CreateNonTerminal ("Argument");
            var in_ = CreateNonTerminal ("In");
            var optional = CreateNonTerminal ("Optional");
            var ellipsis = CreateNonTerminal ("Ellipsis");
            var exception_member = CreateNonTerminal ("ExceptionMember");
            var exception_field = CreateNonTerminal ("ExceptionField");
            var extended_attribute_list = CreateNonTerminal ("ExtendedAttributeList");
            var extended_attributes = CreateNonTerminal ("ExtendedAttributes");
            var extended_attribute = CreateNonTerminal ("ExtendedAttribute");
            var extended_attribute_rest = CreateNonTerminal ("ExtendedAttributeRest");
            var extended_attribute_inner = CreateNonTerminal ("ExtendedAttributeInner");
            var other = CreateNonTerminal ("Other");
            var other_or_comma = CreateNonTerminal ("OtherOrComma");
            var type = CreateNonTerminal ("Type");
            var nullable_type = CreateNonTerminal ("NullableType");
            var unsigned_integer_type = CreateNonTerminal ("UnsignedIntegerType");
            var integer_type = CreateNonTerminal ("IntegerType");
            var optional_long = CreateNonTerminal ("OptionalLong");
            var nullable = CreateNonTerminal ("Nullable");
            var array = CreateNonTerminal ("Array");
            var return_type = CreateNonTerminal ("ReturnType");
            var scoped_name_list = CreateNonTerminal ("ScopedNameList");
            var scoped_name = CreateNonTerminal ("ScopedName");
            var absolute_scoped_name = CreateNonTerminal ("AbsoluteScopedName");
            var relative_scoped_name = CreateNonTerminal ("RelativeScopedName");
            var scoped_name_parts = CreateNonTerminal ("ScopedNameParts");
            var extended_attribute_no_arg = CreateNonTerminal ("ExtendedAttributeNoArg");
            var extended_attribute_arg_list = CreateNonTerminal ("ExtendedAttributeArgList");
            var extended_attribute_ident = CreateNonTerminal ("ExtendedAttributeIdent");
            var extended_attribute_scoped_name = CreateNonTerminal ("ExtendedAttributeScopedName");
            var extended_attribute_named_arg_list = CreateNonTerminal ("ExtendedAttributeNamedArgList");

            var delimited_comment_node = CreateNonTerminal ("might-be-significant comment");
            delimited_comment_node.Rule = MakeStarRule (delimited_comment_node, null, delimited_comment);

            definitions.Rule = MakeStarRule (definitions, null, x_definition);
            if (webglSpecific)
            x_definition.Rule = delimited_comment_node + extended_attribute_list + definition;
            else
            x_definition.Rule = extended_attribute_list + definition;
            definition.Rule = module | interface_ | exception | typedef | implements_statement;
            module.Rule = "module" + identifier + "{" + definitions + "}" + ";";
            interface_.Rule = "interface" + identifier + interface_inheritance + "{" + interface_members + "}" + ";";
            interface_inheritance.Rule = Empty | ":" + scoped_name_list;
            interface_members.Rule = MakeStarRule (interface_members, null, x_interface_member);
            x_interface_member.Rule = extended_attribute_list + interface_member;
            interface_member.Rule = const_ | attribute_or_operation;
            exception.Rule = "exception" + identifier + "{" + exception_members + "}" + ";";
            exception_members.Rule = MakeStarRule (exception_members, null, extended_attribute_list + exception_member);
            typedef.Rule = "typedef" + type + identifier + ";";
            implements_statement.Rule = scoped_name + "implements" + scoped_name + ";";
            if (webglSpecific)
            const_.Rule = delimited_comment_node + "const" + type + identifier + "=" + const_expr + ";";
            else
            const_.Rule = "const" + type + identifier + "=" + const_expr + ";";
            const_expr.Rule = boolean_literal | integer_literal | float_literal;
            boolean_literal.Rule = Keyword ("true") | Keyword ("false");
            attribute_or_operation.Rule = stringified_att_oper | attribute | operation;
            stringified_att_oper.Rule = "stringifier" + stringifier_attribute_or_operation;
            stringifier_attribute_or_operation.Rule = attribute | operation_rest + ";";
            attribute.Rule = readonly_ + "attribute" + type + identifier + get_raises + set_raises + ";";
            readonly_.Rule = Keyword ("readonly") | Empty;
            get_raises.Rule = "getraises" + exception_list | Empty;
            set_raises.Rule = "setraises" + exception_list | Empty;
            operation.Rule = qualifiers + operation_rest;
            qualifiers.Rule = "static" | "omittable" + specials | specials;
            specials.Rule = MakeStarRule (specials, null, special);
            special.Rule = Keyword ("getter") | Keyword ("setter") | Keyword ("creator") | Keyword ("deleter") | Keyword ("caller");
            operation_rest.Rule = return_type + optional_identifier + "(" + argument_list + ")" + raises + ";";
            optional_identifier.Rule = Empty | identifier;
            raises.Rule = Empty | "raises" + exception_list;
            exception_list.Rule = "(" + scoped_name_list + ")";
            argument_list.Rule = MakeStarRule (argument_list, ToTerm (","), argument);
            // arguments.Rule = "," + argument + arguments | Empty;
            argument.Rule = extended_attribute_list + in_ + optional + type + ellipsis + identifier;
            in_.Rule = Empty | "in";
            optional.Rule = Empty | "optional";
            ellipsis.Rule = Empty | "...";
            exception_member.Rule = const_ | exception_field;
            exception_field.Rule = type + identifier + ";";
            extended_attribute_list.Rule = "[" + MakePlusRule (extended_attributes, ToTerm (","), extended_attribute) + "]" | Empty;
            //extended_attributes.Rule = "," + extended_attribute + extended_attributes;
            extended_attribute.Rule =
            "(" + extended_attribute_inner + ")" + extended_attribute_rest
            | "[" + extended_attribute_inner + "]" + extended_attribute_rest
            | "{" + extended_attribute_inner + "}" + extended_attribute_rest
            | other + extended_attribute_rest;
            extended_attribute_rest.Rule = Empty | extended_attribute;
            extended_attribute_inner.Rule =
            "(" + extended_attribute_inner + ")" + extended_attribute_inner
            | "[" + extended_attribute_inner + "]" + extended_attribute_inner
            | "{" + extended_attribute_inner + "}" + extended_attribute_inner
            | other_or_comma + extended_attribute_inner
            | Empty;
            other.Rule = integer_literal | float_literal | identifier | string_literal | other_literal | "..." | ":" | "::" | ";" | "<" | "=" | ">" | "?" | "false" | "object" | "true" | "any" | "attribute" | "boolean" | "caller" | "const" | "creator" | "deleter" | "double" | "exception" | "float" | "getraises" | "getter" | "implements" | "in" | "interface" | "long" | "module" | "octet" | "omittable" | "optional" | "raises" | "sequence" | "setraises" | "setter" | "short" | "DOMString" | "stringifier" | "typedef" | "unsigned" | "void" | "static";
            other_or_comma.Rule = other | ",";
            type.Rule =
            nullable_type + array
            | scoped_name + array
            | "any" + array
            | "object" + array;
            nullable_type.Rule =
            unsigned_integer_type + nullable
            | "boolean" + nullable
            | "octet" + nullable
            | "float" + nullable
            | "double" + nullable
            | "DOMString" + nullable
            | "sequence" + ToTerm ("<") + type + ">" + nullable;
            unsigned_integer_type.Rule = "unsigned" + integer_type | integer_type;
            integer_type.Rule = "short" | "long" + optional_long;
            optional_long.Rule = "long" | Empty;
            nullable.Rule = "?" | Empty;
            array.Rule = ToTerm ("[") + "]" + array | Empty;
            return_type.Rule = type | "void";
            scoped_name_list.Rule = MakePlusRule (scoped_name_list, ToTerm (","), scoped_name);
            //scoped_names.Rule = "," + scoped_name + scoped_names;
            scoped_name.Rule = absolute_scoped_name | relative_scoped_name;
            absolute_scoped_name.Rule = "::" + identifier + scoped_name_parts;
            relative_scoped_name.Rule = identifier + scoped_name_parts;
            scoped_name_parts.Rule = "::" + identifier + scoped_name_parts | Empty;
            extended_attribute_no_arg.Rule = identifier;
            extended_attribute_arg_list.Rule = identifier + "(" + argument_list + ")";
            extended_attribute_ident.Rule = identifier + "=" + identifier;
            extended_attribute_scoped_name.Rule = identifier + "=" + scoped_name;
            extended_attribute_named_arg_list.Rule = identifier + "=" + identifier + "(" + argument_list + ")";

            Root = definitions;
            MarkPunctuation (";", ",", "{", "}", "[", "]", ":", "?");

            MarkTransient (definition, const_expr, extended_attribute_rest, other, attribute_or_operation, interface_member, optional_identifier);
        }
Exemple #14
0
        public Sintactico()
        {
            // Comentarios
            var comentario = new CommentTerminal("comentario", ">>", "\n", "\r\n");
            var Mcomentario = new CommentTerminal("Mcomentario", "<-", "->");
            base.NonGrammarTerminals.Add(comentario);
            base.NonGrammarTerminals.Add(Mcomentario);

            //ER
            IdentifierTerminal id = new IdentifierTerminal("id");
            RegexBasedTerminal numero = new RegexBasedTerminal("entero", "[0-9]+");

            RegexBasedTerminal doble = new RegexBasedTerminal("doble", "[0-9]+\\.[0-9]+");

            NonTerminal S = new NonTerminal("S"),// ACEPTACIOM

                        E = new NonTerminal("E"),
                        T = new NonTerminal("T"),
                        F = new NonTerminal("F"),
                        G = new NonTerminal("G"),
                        H = new NonTerminal("H"),
                        I = new NonTerminal("I"),
                        J = new NonTerminal("J"),
                        CON = new NonTerminal("CON"),
                        DECLA = new NonTerminal("DECLA"),
                        FUN = new NonTerminal("FUN")
                        ;

            S.Rule = E;
            E.Rule = DECLA
                    | T
                    ;
            T.Rule = T + "+" + F
                    | T + "-" + F
                    | F
                    ;

            F.Rule = F + "/" + G
                | F + "*" + G
                | G
                ;
            G.Rule = G + "^" + H
                | H
                ;
            H.Rule = ToTerm("-") + I
                    | I
                    ;
            I.Rule = id + "++"
                | id + "--"
                | J
                ;
            J.Rule = id
                                | numero
                                | FUN
                                | doble
                                | ToTerm("(") + T + ToTerm(")")
                                | CON
                                ;
            FUN.Rule = ToTerm("cos") + "(" + T + ")"
                | ToTerm("sin") + "(" + T + ")"
                | ToTerm("tan") + "(" + T + ")"
                ;
            CON.Rule = ToTerm("e")
                    | ToTerm("pi")
                    ;
            DECLA.Rule = "var" + id + "=" + T
                ;
            this.Root = S;

            MarkPunctuation("(", ")");//<para quitar nodos basura
        }
 private NonTerminal InitEmbeddedCs(KeyTerm beginSegment, KeyTerm endSegment)
 {
     var regexNonDirective = new RegexBasedTerminal("NonDirectivePrefix", "(?![+=@])") {
                     ErrorAlias = "<#@ can only be declared before any text or embedded code",
                     SkipsWhitespaceAfter = false };
     _embeddedCs = new NonTerminal("embeddedCs");
     var embeddedCsText = new FreeTextLiteral("embeddedCsText", endSegment.Text);
     var stringLit = new StringLiteral("embeddedCsText");
     stringLit.AddStartEnd(beginSegment.Text, endSegment.Text, StringOptions.AllowsLineBreak);
     _embeddedCs.Rule = beginSegment + regexNonDirective + embeddedCsText + endSegment;
     return EmbeddedCs;
 }