Esempio n. 1
0
        protected static NumberLiteral CreateLuaNumber(string name)
        {
            NumberLiteral term = new NumberLiteral(name, NumberOptions.AllowStartEndDot);

            //default int types are Integer (32bit) -> LongInteger (BigInt); Try Int64 before BigInt: Better performance?
            term.DefaultIntTypes  = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            term.DefaultFloatType = TypeCode.Double; // it is default
            term.AddPrefix("0x", NumberOptions.Hex);

            return(term);
        }
Esempio n. 2
0
 private NumberLiteral CreateNumberLiteral(string name)
 {
     var term = new NumberLiteral(name);
     term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64 };
     term.DefaultFloatType = TypeCode.Double;
     term.AddPrefix("0x", NumberOptions.Hex);
     term.AddSuffix("l", TypeCode.Int64, TypeCode.UInt64);
     term.AddSuffix("f", TypeCode.Single);
     term.AddSuffix("d", TypeCode.Double);
     return term;
 }
Esempio n. 3
0
        private NumberLiteral CreateNumberLiteral(string name)
        {
            var term = new NumberLiteral(name);

            term.DefaultIntTypes  = new TypeCode[] { TypeCode.Int32, TypeCode.Int64 };
            term.DefaultFloatType = TypeCode.Double;
            term.AddPrefix("0x", NumberOptions.Hex);
            term.AddSuffix("l", TypeCode.Int64, TypeCode.UInt64);
            term.AddSuffix("f", TypeCode.Single);
            term.AddSuffix("d", TypeCode.Double);
            return(term);
        }
		public static NumberLiteral CreateJavaNumber(string name)
		{
			var term = new NumberLiteral(name, NumberOptions.AllowStartEndDot)
			{
				DefaultIntTypes = new[] { TypeCode.Int32 },
				DefaultFloatType = TypeCode.Double
			};
			term.AddPrefix("0x", NumberOptions.Hex);
			term.AddSuffix("l", TypeCode.Int64);
			term.AddSuffix("f", TypeCode.Single);
			term.AddSuffix("d", TypeCode.Double);
			return term;
		}
Esempio n. 5
0
		//http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf section 9.4.4
    public static NumberLiteral CreateCSharpNumber(string name) {
      NumberLiteral term = new NumberLiteral(name);
      term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64 };
      term.DefaultFloatType = TypeCode.Double;
      term.AddPrefix("0x", NumberOptions.Hex);
      term.AddSuffix("u", TypeCode.UInt32, TypeCode.UInt64);
      term.AddSuffix("l", TypeCode.Int64, TypeCode.UInt64);
      term.AddSuffix("ul", TypeCode.UInt64);
      term.AddSuffix("f", TypeCode.Single);
			term.AddSuffix("d", TypeCode.Double);
      term.AddSuffix("m", TypeCode.Decimal);
      return term;
    }
Esempio n. 6
0
        private void SetUpTerminals()
        {
            Comment = new CommentTerminal(nameof(Comment), ";", "\n", "\r");
            NonGrammarTerminals.Add(Comment);

            var ident = new IdentifierTerminal(nameof(Ident), ".$_", ".$_");

            ident.Options = IdOptions.IsNotKeyword;
            Ident         = ident;

            var number = new NumberLiteral(nameof(Number), NumberOptions.AllowUnderscore | NumberOptions.IntOnly | NumberOptions.AllowSign);

            number.AddPrefix("0x", NumberOptions.Hex);
            number.AddPrefix("0b", NumberOptions.Binary);
            number.AddPrefix("0", NumberOptions.Octal);
            Number = number;

            NormalString  = new StringLiteral(nameof(NormalString), "\"", StringOptions.NoEscapes);
            EscapedString = new StringLiteral(nameof(EscapedString), "`", StringOptions.AllowsAllEscapes);
            CharLiteral   = new StringLiteral(nameof(CharLiteral), "'", StringOptions.IsChar | StringOptions.AllowsAllEscapes);
            Separator     = ToTerm(SeparatorToken, nameof(Separator));
        }
Esempio n. 7
0
 //http://www.microsoft.com/downloads/details.aspx?FamilyId=6D50D709-EAA4-44D7-8AF3-E14280403E6E&displaylang=en section 2
 public static NumberLiteral CreateVbNumber(string name) {
   NumberLiteral term = new NumberLiteral(name);
   term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64 };
   //term.DefaultFloatType = TypeCode.Double; it is default
   term.AddPrefix("&H", NumberOptions.Hex);
   term.AddPrefix("&O", NumberOptions.Octal);
   term.AddSuffix("S", TypeCode.Int16);
   term.AddSuffix("I", TypeCode.Int32);
   term.AddSuffix("%", TypeCode.Int32);
   term.AddSuffix("L", TypeCode.Int64);
   term.AddSuffix("&", TypeCode.Int64);
   term.AddSuffix("D", TypeCode.Decimal);
   term.AddSuffix("@", TypeCode.Decimal);
   term.AddSuffix("F", TypeCode.Single);
   term.AddSuffix("!", TypeCode.Single);
   term.AddSuffix("R", TypeCode.Double);
   term.AddSuffix("#", TypeCode.Double);
   term.AddSuffix("US", TypeCode.UInt16);
   term.AddSuffix("UI", TypeCode.UInt32);
   term.AddSuffix("UL", TypeCode.UInt64);
   return term;
 }
Esempio n. 8
0
        public static NumberLiteral CreateJavaNumber(string name)
        {
            var term = new NumberLiteral(name, NumberOptions.AllowStartEndDot)
            {
                DefaultIntTypes  = new[] { TypeCode.Int32 },
                DefaultFloatType = TypeCode.Double
            };

            term.AddPrefix("0x", NumberOptions.Hex);
            term.AddSuffix("l", TypeCode.Int64);
            term.AddSuffix("f", TypeCode.Single);
            term.AddSuffix("d", TypeCode.Double);
            return(term);
        }
Esempio n. 9
0
        static NumberLiteral CreateNumberLiteral(string name)
        {
            NumberLiteral term = new NumberLiteral(name);

            term.DefaultIntTypes  = new TypeCode[] { TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64 };
            term.DefaultFloatType = TypeCode.Double;
            term.AddPrefix("0x", NumberOptions.Hex);
            term.AddSuffix("u", TypeCode.UInt32, TypeCode.UInt64);
            term.AddSuffix("l", TypeCode.Int64, TypeCode.UInt64);
            term.AddSuffix("ul", TypeCode.UInt64);
            term.AddSuffix("f", TypeCode.Single);
            term.AddSuffix("d", TypeCode.Double);
            term.AddSuffix("m", TypeCode.Decimal);
            term.Options |= NumberOptions.AllowSign;
            return(term);
        }
Esempio n. 10
0
        static NumberLiteral createNumberLiteral()
        {
            var Num = new NumberLiteral("Number");

            Num.AddPrefix("-", NumberOptions.AllowSign);
            Num.AddPrefix("0x", NumberOptions.Hex);
            Num.AddPrefix("0d", NumberOptions.Default);
            Num.AddPrefix("0o", NumberOptions.Octal);
            Num.AddPrefix("0", NumberOptions.Octal);
            Num.AddPrefix("0b", NumberOptions.Binary);
            return(Num);
        }
Esempio n. 11
0
        public LiteralRules(PieGrammar grammar)
        {
            this.grammar = grammar;

            NumberLiteral  = new NumberLiteral("number_literal", NumberOptions.AllowStartEndDot)
            {
                // Define types to assign if the parser can't determine.
                DefaultIntTypes = new[] { TypeCode.Int32 },
                DefaultFloatType = TypeCode.Double
            };

            // The pre and post fixes for different number types and formats.
            NumberLiteral.AddPrefix("0x", NumberOptions.Hex);
            NumberLiteral.AddSuffix("b", TypeCode.Byte);
            NumberLiteral.AddSuffix("B", TypeCode.Byte);
            NumberLiteral.AddSuffix("s", TypeCode.Int16);
            NumberLiteral.AddSuffix("S", TypeCode.Int16);
            NumberLiteral.AddSuffix("u", TypeCode.UInt32);
            NumberLiteral.AddSuffix("U", TypeCode.UInt32);
            NumberLiteral.AddSuffix("us", TypeCode.UInt16);
            NumberLiteral.AddSuffix("US", TypeCode.UInt16);
            NumberLiteral.AddSuffix("l", TypeCode.Int64);
            NumberLiteral.AddSuffix("L", TypeCode.Int64);
            NumberLiteral.AddSuffix("ul", TypeCode.UInt64);
            NumberLiteral.AddSuffix("UL", TypeCode.UInt64);
            NumberLiteral.AddSuffix("F", TypeCode.Single);
            NumberLiteral.AddSuffix("f", TypeCode.Single);
            NumberLiteral.AddSuffix("d", TypeCode.Double);
            NumberLiteral.AddSuffix("D", TypeCode.Double);
            NumberLiteral.AddSuffix("m", TypeCode.Decimal);
            NumberLiteral.AddSuffix("M", TypeCode.Decimal);

            StringLiteral = new StringLiteral("string_literal", "\"", StringOptions.AllowsAllEscapes);

            CharLiteral = new StringLiteral("char_literal", "'", StringOptions.IsChar);

            BoolLiteral = new NonTerminal("bool_literal");
            BoolLiteral.Rule = grammar.Keywords.True | grammar.Keywords.False;

            Null = grammar.ToTerm("null", "null_literal");
        }
Esempio n. 12
0
        public LiteralRules(PieGrammar grammar)
        {
            this.grammar = grammar;

            NumberLiteral = new NumberLiteral("number_literal", NumberOptions.AllowStartEndDot)
            {
                // Define types to assign if the parser can't determine.
                DefaultIntTypes  = new[] { TypeCode.Int32 },
                DefaultFloatType = TypeCode.Double
            };

            // The pre and post fixes for different number types and formats.
            NumberLiteral.AddPrefix("0x", NumberOptions.Hex);
            NumberLiteral.AddSuffix("b", TypeCode.Byte);
            NumberLiteral.AddSuffix("B", TypeCode.Byte);
            NumberLiteral.AddSuffix("s", TypeCode.Int16);
            NumberLiteral.AddSuffix("S", TypeCode.Int16);
            NumberLiteral.AddSuffix("u", TypeCode.UInt32);
            NumberLiteral.AddSuffix("U", TypeCode.UInt32);
            NumberLiteral.AddSuffix("us", TypeCode.UInt16);
            NumberLiteral.AddSuffix("US", TypeCode.UInt16);
            NumberLiteral.AddSuffix("l", TypeCode.Int64);
            NumberLiteral.AddSuffix("L", TypeCode.Int64);
            NumberLiteral.AddSuffix("ul", TypeCode.UInt64);
            NumberLiteral.AddSuffix("UL", TypeCode.UInt64);
            NumberLiteral.AddSuffix("F", TypeCode.Single);
            NumberLiteral.AddSuffix("f", TypeCode.Single);
            NumberLiteral.AddSuffix("d", TypeCode.Double);
            NumberLiteral.AddSuffix("D", TypeCode.Double);
            NumberLiteral.AddSuffix("m", TypeCode.Decimal);
            NumberLiteral.AddSuffix("M", TypeCode.Decimal);

            StringLiteral = new StringLiteral("string_literal", "\"", StringOptions.AllowsAllEscapes);

            CharLiteral = new StringLiteral("char_literal", "'", StringOptions.IsChar);

            BoolLiteral      = new NonTerminal("bool_literal");
            BoolLiteral.Rule = grammar.Keywords.True | grammar.Keywords.False;

            Null = grammar.ToTerm("null", "null_literal");
        }
Esempio n. 13
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;
        }
Esempio n. 14
0
        public EbisterGrammar() : base(true)
        {
            // 0. Comments
            var commentSingleLine = new CommentTerminal("commentSingleLine", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var commentMultiLine  = new CommentTerminal("commentMultiLine", "/*", "*/");

            NonGrammarTerminals.Add(commentSingleLine);
            NonGrammarTerminals.Add(commentMultiLine);

            // 1. Literals and Operators

            var literalNumber = new NumberLiteral("number",
                                                  NumberOptions.AllowSign |
                                                  NumberOptions.AllowStartEndDot |
                                                  NumberOptions.AllowUnderscore
                                                  );

            literalNumber.AddPrefix("0x", NumberOptions.Hex);
            literalNumber.AddPrefix("0b", NumberOptions.Binary);

            var literalString = new StringLiteral("string", "\"", StringOptions.AllowsAllEscapes);

            literalString.AddPrefix("@", StringOptions.NoEscapes | StringOptions.AllowsLineBreak | StringOptions.AllowsDoubledQuote);

            var identifier = new IdentifierTerminal("identifier");

            var operatorPlus       = ToTerm("+");
            var operatorMinus      = ToTerm("-");
            var operatorAsterisk   = ToTerm("*");
            var operatorSlash      = ToTerm("/");
            var operatorPercent    = ToTerm("%");
            var operatorParenLeft  = ToTerm("(");
            var operatorParenRight = ToTerm(")");
            var operatorSemicolon  = ToTerm(";");

            // 2. Non-Terminals

            // 2.1 Statements
            var program             = new NonTerminal("program", typeof(IronyProgramNode));
            var statement           = new NonTerminal("statement", typeof(IronyGroupedNode));
            var statementBlock      = new NonTerminal("statementBlock", typeof(IronyBlockStatementNode));
            var statementExpression = new NonTerminal("statementBlock", typeof(IronyExpressionStatementNode));
            var statementKeyword    = new NonTerminal("statementKeyword", typeof(IronyKeywordStatementNode));
            var statementRepeat     = new NonTerminal("statementRepeat", typeof(IronyRepeatStatementNode));

            // 2.2 Expressions
            var exprAddSub    = new NonTerminal("exprAddSub", typeof(IronyExpressionNode));
            var exprMulDiv    = new NonTerminal("exprMulDiv", typeof(IronyExpressionNode));
            var expr          = new NonTerminal("expr", typeof(IronyExpressionNode));
            var exprs         = new NonTerminal("exprs", typeof(IronyExpressionsNode));
            var exprParen     = new NonTerminal("exprParen", typeof(IronyParenExpressionNode));
            var exprUnary     = new NonTerminal("exprUnary", typeof(IronyUnaryExpressionNode));
            var exprCall      = new NonTerminal("call", typeof(IronyCallExpressionNode));
            var operatorUnary = new NonTerminal("operatorUnary", typeof(IronyUnaryOperatorNode));

            // 3. BNF Definition
            program.Rule             = MakeStarRule(program, statement);
            exprs.Rule               = MakeStarRule(exprs, ToTerm(","), exprAddSub);
            statementExpression.Rule = exprAddSub + operatorSemicolon;
            statementBlock.Rule      = ToTerm("{") + program + ToTerm("}");
            statementKeyword.Rule    = "break" + operatorSemicolon
                                       | "continue" + operatorSemicolon
                                       | "return" + operatorSemicolon;
            statementRepeat.Rule = "repeat" + statement;
            statement.Rule       = statementExpression
                                   | statementBlock
                                   | statementKeyword
                                   | statementRepeat;
            exprAddSub.Rule = exprMulDiv
                              | exprAddSub + operatorPlus + exprAddSub
                              | exprAddSub + operatorMinus + exprAddSub;
            exprMulDiv.Rule = expr
                              | exprMulDiv + operatorAsterisk + exprMulDiv
                              | exprMulDiv + operatorSlash + exprMulDiv
                              | exprMulDiv + operatorPercent + exprMulDiv;
            exprCall.Rule =
                expr + operatorParenLeft + exprs + operatorParenRight;
            expr.Rule = exprParen
                        | exprUnary
                        | exprCall
                        | literalNumber
                        | literalString
                        | "true"
                        | "false"
                        | "null"
                        | identifier;
            exprParen.Rule     = operatorParenLeft + exprAddSub + operatorParenRight;
            exprUnary.Rule     = operatorUnary + expr;
            operatorUnary.Rule = operatorPlus | operatorMinus;

            Root          = program;
            LanguageFlags = LanguageFlags.CreateAst;
        }
Esempio n. 15
0
        public Grammar()
        {
            this.LanguageFlags |= Irony.Parsing.LanguageFlags.CreateAst;

            var comment = new CommentTerminal("comment", "//", "\n", "\r\n");
            NonGrammarTerminals.Add(comment);

            var integerLiteral = new NumberLiteral("integer", NumberOptions.IntOnly);
            integerLiteral.AddPrefix("0x", NumberOptions.Hex);
            var identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
            identifier.AstNodeType = typeof(VariableNameNode);

            var inlineASM = new NonTerminal("inline", typeof(InlineASMNode));

            var numberLiteral = new NonTerminal("Number", typeof(NumberLiteralNode));
            var expression = new NonTerminal("Expression");
            var parenExpression = new NonTerminal("Paren Expression");
            var binaryOperation = new NonTerminal("Binary Operation", typeof(BinaryOperationNode));
            var @operator = ToTerm("+") | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "==" | "!=";
            var variableDeclaration = new NonTerminal("Variable Declaration", typeof(VariableDeclarationNode));
            var dereference = new NonTerminal("Dereference", typeof(DereferenceNode));
            var statement = new NonTerminal("Statement");
            var statementList = new NonTerminal("Statement List", typeof(BlockNode));
            var assignment = new NonTerminal("Assignment", typeof(AssignmentNode));
            var ifStatement = new NonTerminal("If", typeof(IfStatementNode));
            var block = new NonTerminal("Block");
            var ifElseStatement = new NonTerminal("IfElse", typeof(IfStatementNode));
            var parameterList = new NonTerminal("Parameter List");
            var functionDeclaration = new NonTerminal("Function Declaration", typeof(FunctionDeclarationNode));
            var parameterDeclaration = new NonTerminal("Parameter Declaration");
            var parameterListDeclaration = new NonTerminal("Parameter Declaration List");
            var returnStatement = new NonTerminal("Return", typeof(ReturnStatementNode));
            //var indexOperation = new NonTerminal("Index Operation", typeof(IndexOperationNode));
            //var indexAssignment = new NonTerminal("Index Assignment", typeof(IndexAssignmentNode));
            //var inlineArgument = new NonTerminal("Inline Argument", typeof(InlineArgumentNode));
            //var inlineArgumentList = new NonTerminal("Inline Argument List");
            //var inlineInstruction = new NonTerminal("Inline Instruction", typeof(InlineInstructionNode));
            //var inlineInstructionList = new NonTerminal("Inline Instruction List");
            //var inlineBlock = new NonTerminal("Inline Block", typeof(InlineBlockNode));
            var functionCall = new NonTerminal("Function Call", typeof(FunctionCallNode));

            numberLiteral.Rule = integerLiteral;
            expression.Rule = numberLiteral | binaryOperation | parenExpression | identifier | dereference | functionCall;
            assignment.Rule = (identifier | dereference) + "=" + expression;
            binaryOperation.Rule = expression + @operator + expression;
            parenExpression.Rule = ToTerm("(") + expression + ")";
            variableDeclaration.Rule = ToTerm("var") + identifier + "=" + expression;
            dereference.Rule = ToTerm("*") + expression;
            statement.Rule = inlineASM | (variableDeclaration + ";")
                | (assignment + ";") | ifStatement | ifElseStatement | block | functionDeclaration | (functionCall + ";")
                | (returnStatement + ";");
            block.Rule = ToTerm("{") + statementList + "}";
            statementList.Rule = MakeStarRule(statementList, statement);
            inlineASM.Rule = ToTerm("asm") + "{" + new FreeTextLiteral("inline asm", "}") + "}";
            ifStatement.Rule = ToTerm("if") + "(" + expression + ")" + statement;
            ifElseStatement.Rule = ToTerm("if") + "(" + expression + ")" + statement + this.PreferShiftHere() + "else" + statement;
            parameterList.Rule = MakeStarRule(parameterList, ToTerm(","), expression);
            functionCall.Rule = identifier + "(" + parameterList + ")";
            parameterDeclaration.Rule = identifier;
            parameterListDeclaration.Rule = MakeStarRule(parameterListDeclaration, ToTerm(","), parameterDeclaration);
            functionDeclaration.Rule = ToTerm("function") + identifier + "(" + parameterListDeclaration + ")" + block;
            returnStatement.Rule = ToTerm("return") + expression;

            this.Root = statementList;

            this.RegisterBracePair("[", "]");
            this.Delimiters = "{}[](),:;+-*/%&|^!~<>=.";
            this.MarkPunctuation(";", ",", "(", ")", "{", "}", "[", "]", ":");
            this.MarkTransient(expression, parenExpression, statement, block);//, parameterList);

            this.RegisterOperators(1, Associativity.Right, "==", "!=");
            this.RegisterOperators(2, Associativity.Right, "=");
            this.RegisterOperators(3, Associativity.Left, "+", "-");
            this.RegisterOperators(4, Associativity.Left, "*", "/");

            this.RegisterOperators(6, Associativity.Left, "[", "]", "<", ">");
        }
Esempio n. 16
0
        public BnfGrammar(Mode mode)
        {
            var alternationChar = (mode == Mode.Strict) ? "/" : "|";

            var rulename = new IdentifierTerminal("rulename", "-_", null);
            var funcname = new IdentifierTerminal("funcname", ".", null);
            var newrulename = new IdentifierTerminal("newrulename", "-_", null);
            //var comment1 = new CommentTerminal("comment", "/*", "*/");
            var comment = new CommentTerminal("comment", ";", "\n");
            var bindig1 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly);
            var bindig2 = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly);
            var hexdig1 = new NumberLiteral("hexdig", NumberOptions.Hex | NumberOptions.IntOnly);
            var hexdig2 = new NumberLiteralEx("hexdig", NumberOptions.Hex | NumberOptions.IntOnly);
            var decdig1 = new NumberLiteral("decvalue", NumberOptions.IntOnly);
            var decdig2 = new NumberLiteral("decvalue", NumberOptions.IntOnly);
            var charval = new StringLiteral("charval", "\"", StringOptions.NoEscapes);
            var repeat1 = new NumberLiteral("repeat1", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter);
            var repeat2 = new NumberLiteral("repeat2", NumberOptions.IntOnly | NumberOptions.AllowLetterAfter);
            var minus = ToTerm("-", "minus");
            var point = ToTerm(".", "point");

            bindig1.AddPrefix("b", NumberOptions.None);
            hexdig1.AddPrefix("x", NumberOptions.None);
            decdig1.AddPrefix("d", NumberOptions.None);

            //base.NonGrammarTerminals.Add(comment1);
            base.NonGrammarTerminals.Add(comment);

            // NON TERMINALS
            var numval = new NonTerminal("numval");

            var hexval = new NonTerminal("hexval");
            var hexvalp = new NonTerminal("hexvalpoint");
            var hexvalps = new NonTerminal("hexvalpointstar");

            var binval = new NonTerminal("binval");
            var binvalp = new NonTerminal("binvalpoint");
            var binvalps = new NonTerminal("binvalpointstar");

            var decval = new NonTerminal("decval");
            var decvalp = new NonTerminal("decvalpoint");
            var decvalps = new NonTerminal("decvalpointstar");

            var rule = new NonTerminal("rule");
            var rulelist = new NonTerminal("rulelist");
            var alternation = new NonTerminal("alternation");
            var concatenation = new NonTerminal("concatenation");
            var subtraction = new NonTerminal("subtraction");
            var repetition = new NonTerminal("repetition");
            var repeat = new NonTerminal("repeat");
            var element = new NonTerminal("element");
            var elements = new NonTerminal("elements");
            var group = new NonTerminal("group");
            var option = new NonTerminal("option");
            var func = new NonTerminal("func");
            var funcarg = new NonTerminal("funcarg");
            var funcargs = new NonTerminal("funcargs");

            // RULES
            hexval.Rule = hexdig1 + (hexvalps | (minus + hexdig2) | Empty);
            hexvalp.Rule = point + hexdig2;
            hexvalps.Rule = MakePlusRule(hexvalps, hexvalp);

            binval.Rule = bindig1 + (binvalps | (minus + bindig2) | Empty);
            binvalp.Rule = point + bindig2;
            binvalps.Rule = MakePlusRule(binvalps, binvalp);

            decval.Rule = decdig1 + (decvalps | (minus + decdig2) | Empty);
            decvalp.Rule = point + decdig2;
            decvalps.Rule = MakePlusRule(decvalps, decvalp);

            numval.Rule = ToTerm("%") + (binval | hexval | decval);

            BnfExpression rp = ToTerm("*");
            if (mode == Mode.HttpCompatible)
                rp = rp | "#";

            repeat.Rule = ((repeat1) | ((repeat1 | Empty) + rp + (repeat2 | Empty)));
            group.Rule = ToTerm("(") + alternation + ")";
            option.Rule = ToTerm("[") + alternation + "]";

            funcarg.Rule = alternation;
            funcargs.Rule = MakePlusRule(funcargs, ToTerm(","), funcarg);
            func.Rule = ToTerm("{") + funcname + "," + funcargs + "}";

            alternation.Rule = MakePlusRule(alternation, ToTerm(alternationChar), subtraction);
            subtraction.Rule = MakePlusRule(subtraction, ToTerm("&!"), concatenation);
            concatenation.Rule = MakePlusRule(concatenation, repetition);

            repetition.Rule = (Empty | repeat) + element;
            element.Rule = rulename | group | option | numval | charval | func;

            elements.Rule = alternation;
            rule.Rule = NewLineStar + newrulename + (ToTerm("=") | ToTerm("=" + alternationChar)) + elements + NewLinePlus;
            rulelist.Rule = MakeStarRule(rulelist, rule);

            base.Root = rulelist;
        }
Esempio n. 17
0
 // About exponent symbols, extract from R6RS:
 //  ... representations of number objects may be written with an exponent marker that indicates the desired precision 
 // of the inexact representation. The letters s, f, d, and l specify the use of short, single, double, and long precision, respectively.
 // ...
 // In addition, the exponent marker e specifies the default precision for the implementation. The default precision 
 //  has at least as much precision as double, but implementations may wish to allow this default to be set by the user.
 public static NumberLiteral CreateSchemeNumber(string name) {
   NumberLiteral term = new NumberLiteral(name);
   term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
   term.DefaultFloatType = TypeCode.Double; // it is default
   term.AddExponentSymbols("eE", TypeCode.Double); //default precision for platform, double 
   term.AddExponentSymbols("sSfF", TypeCode.Single); 
   term.AddExponentSymbols("dDlL", TypeCode.Double); 
   term.AddPrefix("#b", NumberOptions.Binary);
   term.AddPrefix("#o", NumberOptions.Octal);
   term.AddPrefix("#x", NumberOptions.Hex);
   term.AddPrefix("#d", NumberOptions.None);
   term.AddPrefix("#i", NumberOptions.None); // inexact prefix, has no effect
   term.AddPrefix("#e", NumberOptions.None); // exact prefix, has no effect
   term.AddSuffix("J", NumberLiteral.TypeCodeImaginary);
   return term;
 }
Esempio n. 18
0
        public NotchianGrammar()
            : base(caseSensitive:false)
        {
            #region parser settings
            this.UsesNewLine = true;
            #endregion

            #region symbols
            var directive = new IdentifierTerminal("directive");
            directive.AllFirstChars = ".";

            var label = new IdentifierTerminal("label", IdOptions.IsNotKeyword);
            label.AllFirstChars = ":";

            var symbol = new IdentifierTerminal("symbol", IdOptions.IsNotKeyword);

            var character_string = new StringLiteral("character_string", "\"");

            var literal = new NumberLiteral("literal", NumberOptions.IntOnly);
            literal.AddPrefix("0x", NumberOptions.Hex);
            literal.AddPrefix("0b", NumberOptions.Binary);

            var comment = new CommentTerminal("comment", ";", "\n", "\r", "\r\n");
            NonGrammarTerminals.Add(comment);

            var program = new NonTerminal("program");
            var statement_list = new NonTerminal("statement_list");
            var statement_list_cont = new NonTerminal("statement_list_cont");
            var statement = new NonTerminal("statement");

            var labelled_instruction = new NonTerminal("labelled_instruction");
            var label_opt = new NonTerminal("label_opt");

            var instruction = new NonTerminal("instruction");
            var basic = new NonTerminal("basic_instruction");
            var nonbasic = new NonTerminal("nonbasic_instruction");

            var data = new NonTerminal("data");
            var data_list = new NonTerminal("data_list");
            var datum = new NonTerminal("datum");

            var basic_opcode = new NonTerminal("basic_opcode");
            var nonbasic_opcode = new NonTerminal("nonbasic_opcode");

            var value = new NonTerminal("value");
            var register = new NonTerminal("register");
            var counter = new NonTerminal("register");
            var synonym = new NonTerminal("synonym");

            var address = new NonTerminal("address");
            var pointer = new NonTerminal("pointer");
            var target = new NonTerminal("target");
            var indirection = new NonTerminal("indirection");
            var offset = new NonTerminal("offset");
            #endregion symbols

            #region parser settings
            this.UsesNewLine = true;
            this.Root = program;
            #endregion

            #region grammar rules
            //basic structure
            program.Rule = statement_list + Eof;
            statement_list.Rule = statement + statement_list_cont | Empty;
            statement_list_cont.Rule = NewLine + statement_list;
            statement.Rule = directive | label | labelled_instruction | Empty;

            //lines and labels
            labelled_instruction.Rule = label_opt + instruction;
            label_opt.Rule = label | Empty;

            //instructions
            instruction.Rule = basic | nonbasic | data;
            basic.Rule = basic_opcode + value + "," + value;
            nonbasic.Rule = nonbasic_opcode + value;

            //data
            data.Rule = ToTerm("DAT") + data_list;
            data_list.Rule = MakeListRule(data_list, ToTerm(","), datum, TermListOptions.PlusList);
            datum.Rule = literal | character_string;

            //opcodes
            basic_opcode.Rule = ToTerm("SET") | "ADD" | "SUB" | "MUL" | "DIV" | "MOD" | "SHL" | "SHR" | "AND" | "BOR" | "XOR" | "IFE" | "IFN" | "IFG" | "IFB";
            nonbasic_opcode.Rule = ToTerm("JSR");

            //values
            value.Rule = literal | register | counter | synonym | address;
            register.Rule = ToTerm("A") | "B" | "C" | "X" | "Y" | "Z" | "I" | "J";
            counter.Rule = ToTerm("SP") | "PC" | "O";
            synonym.Rule = ToTerm("POP") | "PEEK" | "PUSH";

            address.Rule = pointer | symbol;
            pointer.Rule = ToTerm("[") + target + ToTerm("]");
            target.Rule = literal | register | indirection;
            indirection.Rule = (register + ToTerm("+") + offset) | (offset + ToTerm("+") + register);
            offset.Rule = literal | symbol;

            this.Root = program;
            #endregion
        }
Esempio n. 19
0
File: STL.cs Progetto: cubean/CG
        public STLGrammar()
            : base(false)
        {
            #region Letters and Digits
            /*
            letter	        A | B | .. | Z | a | b | .. |z
            digit	        0 | 1 | .. | 9
            bit digit	    0|1| .. |7
            binary digit	0 | 1 | _
            hex digit	    digit | A | .. | F | a | .. | f | _
            character	    letter | ASCII 128 | .. | ASCII 255 | _
            first identifier character	character | space
            other identifier character	character | digit | space
            Local Variables (Local ToTerms)	[ # ] identifier
            */
            var semi = ToTerm(";", "semi");
            var semi_opt = new NonTerminal("semi?", Empty | semi);
            var dot = ToTerm(".", "dot");
            var comma = ToTerm(",", "comma");
            var comma_opt = new NonTerminal("comma_opt", Empty | comma);
            var equal = ToTerm("=", "equal");

            var digits = new NumberLiteral("decimal", NumberOptions.IntOnly | NumberOptions.DisableQuickParse);
            var binarys = new NumberLiteral("binary", NumberOptions.IntOnly | NumberOptions.DisableQuickParse | NumberOptions.Binary | NumberOptions.AllowUnderscore);
            var octals = new NumberLiteral("octal", NumberOptions.IntOnly | NumberOptions.DisableQuickParse | NumberOptions.Octal);
            var hexs = new NumberLiteral("hex", NumberOptions.IntOnly | NumberOptions.DisableQuickParse | NumberOptions.Hex | NumberOptions.AllowUnderscore);
            var identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
            var global_variable = new NonTerminal("global_variable", typeof(Variable));
            var local_variable = new NonTerminal("local_variable", typeof(Variable));
            KeyTerm colon = ToTerm(":", "colon");

            binarys.AddPrefix("2#", NumberOptions.Binary);
            hexs.AddPrefix("16#", NumberOptions.Hex);
            global_variable.SetFlag(TermFlags.IsConstant);
            local_variable.SetFlag(TermFlags.IsConstant);

            global_variable.Rule = identifier;
            local_variable.Rule = "#" + identifier;
            #endregion

            #region Program Comments
            /*
            comment characters	printable character CR
            comment	            // { comment characters } CR
            */
            var comment = new CommentTerminal("comment", "//", "\r", "\n");
            var comment_opt = new NonTerminal("comment?");
            var line_comment = new NonTerminal("line_comment");
            var multi_line_comment = new NonTerminal("multi_line_comment");
            var empty_line = new NonTerminal("empty_line");
            var empty_lines = new NonTerminal("empty_line+");
            var empty_lines_opt = new NonTerminal("empty_line*");

            multi_line_comment.SetFlag(TermFlags.IsList);
            empty_lines.SetFlag(TermFlags.IsList);
            empty_lines_opt.SetFlag(TermFlags.IsListContainer);

            comment_opt.Rule = comment | Empty;
            line_comment.Rule = comment + NewLine;
            multi_line_comment.Rule = multi_line_comment + line_comment | line_comment;
            empty_line.Rule = NewLine | line_comment;
            empty_lines.Rule = empty_lines + empty_line | empty_line;
            empty_lines_opt.Rule = empty_lines | Empty;
            #endregion

            #region Instruction mnemonic terminal
            // Bit logic
            var bit_logic_mnemonic = new NonTerminal("bit_logic_mnemonic");
            var clock_mnemonic = new NonTerminal("clock_mnemonic");
            var communication_mnemonic = new NonTerminal("communication_mnemonic");
            var compare_mnemonic = new NonTerminal("compare_mnemonic");
            var convert_mnemonic = new NonTerminal("convert_mnemonic");
            var counter_mnemonic = new NonTerminal("counter_mnemonic");
            var floatpoint_math_mnemonic = new NonTerminal("floatpoint_math_mnemonic");
            var integer_math_mnemonic = new NonTerminal("integer_math_mnemonic");
            var logical_mnemonic = new NonTerminal("logical_mnemonic");
            var move_mnemonic = new NonTerminal("move_mnemonic");
            var program_control_mnemonic = new NonTerminal("program_control_mnemonic");
            var shift_rotate_mnemonic = new NonTerminal("shift_rotate_mnemonic");
            var string_mnemonic = new NonTerminal("string_mnemonic");
            var table_mnemonic = new NonTerminal("table_mnemonic");
            var timer_mnemonic = new NonTerminal("timer_mnemonic");
            var subroutine_mnemonic = new NonTerminal("subroutine_mnemonic");

            bit_logic_mnemonic.Rule =
                ToTerm("LD") | "A" | "O" |
                "LDN" | "AN" | "ON" |
                "LDI" | "AI" | "OI" |
                "LDNI" | "ANI" | "ONI" |
                "NOT" | "EU" | "ED" | "ALD" | "OLD" |
                "LPS" | "LDS" | "LRD" | "LPP" | "=" | "=I" |
                "S" | "SI" | "R" | "RI" | "AENO" | "NOP";
            clock_mnemonic.Rule =
                ToTerm("TODR") | "TODW" | "TODRX" | "TODWX";
            communication_mnemonic.Rule =
                ToTerm("XMT") | "RCV" | "NETR" | "NETW" | "GPA" | "SPA";
            compare_mnemonic.Rule =
                ToTerm("LDB=") | "AB=" | "OB=" |
                "LDB<>" | "AB<>" | "OB<>" |
                "LDB>=" | "AB>=" | "OB>=" |
                "LDB<=" | "AB<=" | "OB<=" |
                "LDB>" | "AB>" | "OB>" |
                "LDB<" | "AB<" | "OB<" |
                "LDW=" | "AW=" | "OW=" |
                "LDW<>" | "AW<>" | "OW<>" |
                "LDW>=" | "AW>=" | "OW>=" |
                "LDW<=" | "AW<=" | "OW<=" |
                "LDW>" | "AW>" | "OW>" |
                "LDW<" | "AW<" | "OW<" |
                "LDD=" | "AD=" | "OD=" |
                "LDD<>" | "AD<>" | "OD<>" |
                "LDD>=" | "AD>=" | "OD>=" |
                "LDD<=" | "AD<=" | "OD<=" |
                "LDD>" | "AD>" | "OD>" |
                "LDD<" | "AD<" | "OD<" |
                "LDR=" | "AR=" | "OR=" |
                "LDR<>" | "AR<>" | "OR<>" |
                "LDR>=" | "AR>=" | "OR>=" |
                "LDR<=" | "AR<=" | "OR<=" |
                "LDR>" | "AR>" | "OR>" |
                "LDR<" | "AR<" | "OR<" |
                "LDS=" | "AS=" | "OS=" |
                "LDS<>" | "AS<>" | "OS<>";
            convert_mnemonic.Rule =
                ToTerm("BTI") | "ITB" | "ITD" | "ITS" |
                "DTI" | "DTR" | "DTS" |
                "ROUND" | "TRUNC" | "RTS" |
                "BCDI" | "IBCD" |
                "ITA" | "DTA" | "RTA" | "ATH" | "HTA" |
                "STI" | "STD" | "STR" |
                "DECO" | "Encoder" | "SEG";
            counter_mnemonic.Rule =
                ToTerm("CTU") | "CTD" | "CTUD" | "HDEF" | "HSC" | "PLS";
            floatpoint_math_mnemonic.Rule =
                ToTerm("+R") | "-R" | "*R" | "/R" |
                "SQRT" | "SIN" | "COS" | "TAN" | "LN" | "EXP" | "PID";
            integer_math_mnemonic.Rule =
                ToTerm("+I") | "-I" | "*I" | "/I" |
                "+D" | "-D" | "*D" | "/D" |
                "MUL" | "DIV" |
                "INCB" | "INCW" | "INCD" |
                "DECB" | "DECW" | "DECD";
            logical_mnemonic.Rule =
                ToTerm("INVB") | "INVW" | "INVD" |
                "ANDB" | "ANDW" | "ANDD" |
                "ORB" | "ORW" | "ORD" |
                "XORB" | "XORW" | "XORD";
            move_mnemonic.Rule =
                ToTerm("MOVB") | "MOVW" | "MOVD" | "MOVR" |
                "BMB" | "BMW" | "BMD" |
                "SWAP" | "BIR" | "BIW";
            program_control_mnemonic.Rule =
                ToTerm("FOR") | "NEXT" | "JMP" | "LBL" |
                "LSCR" | "SCRT" | "SCRE" | "CSCRE" |
                "END" | "STOP" | "WDR" | "DLED";
            shift_rotate_mnemonic.Rule =
                ToTerm("SLB") | "SLW" | "SLD" |
                "SRB" | "SRW" | "SRD" |
                "RLB" | "RLW" | "RLD" |
                "RRB" | "RRW" | "RRD" | "SHRB";
            string_mnemonic.Rule =
                ToTerm("SLEN") | "SCPY" | "SSCPY" | "SCAT" | "SFND" | "CFND";
            table_mnemonic.Rule =
                ToTerm("FILL") | "ATT" | "FND=" | "FND<>" | "FND<" | "FND>" | "LIFO" | "FIFO";
            timer_mnemonic.Rule =
                ToTerm("TON") | "TONR" | "TOF" | "BITIM" | "CITIM";
            subroutine_mnemonic.Rule =
                ToTerm("CALL") | "ENI" | "ENS";
            #endregion

            #region Constants
            /*
            Boolean constant	        TRUE | FALSE | ON | OFF                        Note: Case insensitive
            constant descriptor     	B# | BYTE# | W# | WORD# | DW# | DWORD#         Note: Case insensitive
            unsigned integer	        [constant descriptor]digit {digit}
            number	                    digit {digit}
            signed number	            [ + | - ] number
            signed integer	            [constant descriptor]signed number
            binary integer	            [constant descriptor]2# binary digit { binary digit }
            hex integer	                [constant descriptor]16# hex digit { hex digit }
            exponent	                ( E | e ) signed number
            real constant	            signed number . {exponent}
            real constant	            number {exponent}
            real constant	            signed number . number {exponent}
            printable character	        ASCII 32 | .. | ASCII 255 excluding DEL and ?
            two character hex	        hex digit  hex digit
            character representation	printable character | $$ | $ | $L | $l | $N | $n | $P | $p | $R | $r | $T | $t | $?| $"
                $two character hex
                    Note: The leading $ sign is a control character          (Also known as an escape code)
                Escape Code	    Interpretation
                $$	            Single dollar sign
                $?              Single quotation mark character
                $"	            Double quotation mark character
                $L or $l	    A line feed character
                $N or $n	    A new line character
                $P or $p	    Form feed, new page
                $R or $r	    Carriage return character
                $T or $t	    Tab character

            ASCII character constant	[constant descriptor]'character representation'
            ASCII string constant	    "character representation"
            constant	                Boolean constant | binary digit | unsigned integer |
                                        signed integer | binary integer | hex integer |
                                        real constant | ASCII constant
            */
            var real = new NumberLiteral("Real", NumberOptions.AllowSign);
            var bool_constant = new NonTerminal("bool_constant", typeof(BoolConstrant));
            var constant_descriptor = new NonTerminal("constant_descriptor", typeof(Descriptor));
            var unsigned_integer = new NonTerminal("unsigned_integer", typeof(NumberConstrant));
            var signed_number = new NumberLiteral("decimal", NumberOptions.IntOnly|NumberOptions.AllowSign);
            var signed_integer = new NonTerminal("signed_integer", typeof(NumberConstrant));
            var binary_integer = new NonTerminal("binary_integer", typeof(NumberConstrant));
            var hex_integer = new NonTerminal("hex_integer", typeof(NumberConstrant));
            var real_constant = new NonTerminal("real_constant", typeof(NumberConstrant));
            var character_representation = new StringLiteral("character_representation", "'");
            var ascii_constant = new NonTerminal("ascii_constant");
            var string_constant = new StringLiteral("string_constant", "\"");
            var constant = new NonTerminal("Constant");

            bool_constant.Rule = ToTerm("TRUE") | "FALSE" | "ON" | "OFF";
            constant_descriptor.Rule = (ToTerm("B") | "BYTE" | "W" | "WORD" | "D" | "DWORD") + "#" | Empty;
            unsigned_integer.Rule = constant_descriptor + digits;
            signed_integer.Rule = constant_descriptor + signed_number;
            binary_integer.Rule = constant_descriptor + binarys;
            hex_integer.Rule = constant_descriptor + hexs;
            real_constant.Rule = real;
            ascii_constant.Rule = constant_descriptor + character_representation;
            constant.Rule = bool_constant |  unsigned_integer | signed_integer |
                            binary_integer | hex_integer | real_constant |
                            ascii_constant | string_constant;
            #endregion

            #region Addressing
            /*Addressing
            discrete input	I | E	Note: Case insensitive
            discrete output	Q | A	Note: Case insensitive
            analog input	AI | AE	Note: Case insensitive
            analog output	AQ | AA	Note: Case insensitive
            db memory	    DB	Note: Case insensitive
            variable memory	V	Note: Case insensitive
            flag memory	    M	Note: Case insensitive
            system memory	SM	Note: Case insensitive
            Stage memory	S	Note: Case insensitive
            accumulator	    AC	Note: Case insensitive
            Timer	        T	Note: Case insensitive
            counter	        C | Z	Note: Case insensitive
            high speed counter	HC | HZ	Note: Case insensitive
            data block	    DB	Note: Case insensitive
            local memory	L	Note: Case insensitive
            bit point	    unsigned number . 0 | 1 | ?| 7
            size prefix	    B | W | D                                       Note: Case insensitive
            Direct prefix	        discrete input | discrete output | variable memory | flag memory | system memory | stage memory
            peripheral prefix	    analog input | analog output
            timer counter prefix	timer | counter
            bit address	            direct prefix [X] bit point
            byte word dword address	direct prefix size prefix unsigned number
            peripheral address	    peripheral prefix [W] unsigned number
            timer counter address	timer counter prefix ((X unsigned number) | unsigned number)
            high speed counter address	high speed counter  unsigned number
            accumulator address	    accumulator [size prefix] unsigned number
            db number	            DB unsigned number
            db address	            [db number .] data block ([X] bit point) | (size prefix  unsigned number)
            Direct address	        bit address | byte word dword address | peripheral address |timer counter address | high speed counter address | accumulator address |db address
            indirect address	    * ((accumulator [ D| d ]) | (variable memory D | d ) | (local memory D | d) | ([db number .] data block D | d)) unsigned number
            address of	            & (variable memory | discrete input | discrete output | timer | counter | flag memory | system memory ([db number.] data block) size prefix unsigned number
            */
            var address_term = new AddressTerm("address_term");
            var address = new NonTerminal("address", typeof(Address));

            address.Rule = address_term;
            #endregion

            #region Local Variable Declaration
            /*
            ob declaration	        [var declaration]
            int declaration	        [var declaration]
            sbr declaration	        [io var declaration] ob declarations
            io var declaration	    [var input declaration] [var in out declaration] [var output declaration]
            var input declaration	VAR_INPUT  CR decl_list END_VAR  CR
            var output declaration	VAR_OUTPUT  CR decl_list END_VAR CR
            var in out declaration	VAR_IN_OUT  CR decl_list END_VAR  CR
            var declaration	        VAR  CR decl_list END_VAR  CR
            decl list	            {identifier : complex type }; {comment}
            Type	                Base type | user type | string type
            complex type	        Base type | array type | struct type | user type | string type
            init value	            constant | integer ( init value ) | init value , init value
            base type	            BOOL | BYTE | WORD | DWORD | CHAR | INT | DINT | REAL |
            */
            var base_type = new NonTerminal("base_type");
            var init_value = new NonTerminal("init_value");
            var complex_type = new NonTerminal("complex_type");
            var type = new NonTerminal("type");
            var decl = new NonTerminal("decl", typeof(Declaration));
            var decl_line = new NonTerminal("decl_line");
            var decl_list = new NonTerminal("decl+");
            var decl_list_opt = new NonTerminal("decl*");
            var var_input_decl = new NonTerminal("var_input_decl", typeof(VarDecl));
            var var_output_decl = new NonTerminal("var_output_decl", typeof(VarDecl));
            var var_in_out_decl = new NonTerminal("var_in_out_decl", typeof(VarDecl));
            var var_decl = new NonTerminal("var_decl", typeof(VarDecl));
            var var_input_decl_opt = new NonTerminal("var_input_decl?");
            var var_output_decl_opt = new NonTerminal("var_output_decl?");
            var var_in_out_decl_opt = new NonTerminal("var_in_out_decl?");
            var var_decl_opt = new NonTerminal("var_decl?");
            var var_decl_suffix = new NonTerminal("var_decl_suffix");
            var io_var_decl = new NonTerminal("io_var_decl");

            decl_list.SetFlag(TermFlags.IsList);
            decl_list_opt.SetFlag(TermFlags.IsListContainer);
            MarkTransient(decl_line, complex_type, base_type,
                var_input_decl_opt, var_output_decl_opt, var_in_out_decl_opt);

            base_type.Rule = ToTerm("BOOL") | "BYTE" | "WORD" | "DWORD" | "CHAR" | "INT" | "DINT" | "REAL";
            init_value.Rule = init_value + comma + constant | constant | ToTerm("integer") + "(" + constant + ")";
            complex_type.Rule = base_type;
            type.Rule = base_type;
            decl.Rule = identifier + ":" + complex_type + ";" + comment_opt + NewLine;
            decl_line.Rule = decl | empty_line;
            decl_list.Rule = decl_list + decl_line | decl_line;
            decl_list_opt.Rule = decl_list | Empty;
            var_decl_suffix.Rule = NewLine + decl_list_opt + "END_VAR" + NewLine;
            var_input_decl.Rule = "VAR_INPUT" + var_decl_suffix;
            var_output_decl.Rule = "VAR_OUTPUT" + var_decl_suffix;
            var_in_out_decl.Rule = "VAR_IN_OUT" + var_decl_suffix;
            var_decl.Rule = "VAR" + var_decl_suffix;
            var_input_decl_opt.Rule = var_input_decl | Empty;
            var_output_decl_opt.Rule = var_output_decl | Empty;
            var_in_out_decl_opt.Rule = var_in_out_decl | Empty;
            var_decl_opt.Rule = var_decl | Empty;
            io_var_decl.Rule = var_input_decl_opt + var_output_decl_opt + var_in_out_decl_opt;
            #endregion

            #region Program Structure
            /*Note:
            Keywords are case insensitive unless otherwise noted.

            Block title	    { white space } (TITLE =  comment characters CR | comment)
            Block comment	{comment}
            network title	{ white space } (TITLE =  comment characters CR | comment)
            network comment	{comment}
            line comment	{comment}
            code comment	{comment}
            network number	{ space | unsigned number }
            operand	        { white space } global variable | local variable | constant | direct address | indirect address | address of
            instruction mnemonic	(letter | digit | _ ) { letter | digit | _ }
            instruction	            instruction mnemonic [(white space) { white space } operand {(,| white space) { white space } operand}] ; code comment
            statement list	        {instruction | line comment}
            network	                NETWORK network number (CR | [network title] [network comment]) statement list
            ob number	            OB unsigned number
            organization block	    ORGANIZATION_BLOCK (ob number) (CR | [block title] [block comment])ob declarations BEGIN [network] END_ORGANIZATION_BLOCK CR
            sbr number	            SBR unsigned number
            subroutine block	    SUBROUTINE_BLOCK (sbr number) (CR [block title] [block comment])sbr declarations BEGIN [network] END_SUBROUTINE_BLOCK CR
            int number	            INT unsigned_number
            interrupt block	        INTERRUPT_BLOCK (int number) (CR [block title] [block comment]) int declarations BEGIN [network] END_INTERRUPT_BLOCK CR
             */
            var title_content = new FreeTextLiteral("Title", "\r", "\n");

            var title = new NonTerminal("title");
            var title_opt = new NonTerminal("title?");
            var network_number = new NonTerminal("network_number");
            var mnemonic = new NonTerminal("mnemonic");
            var operand = new NonTerminal("operand");
            var operand_list = new NonTerminal("operand+");
            var operand_list_opt = new NonTerminal("operand*");
            var instruction = new NonTerminal("instruction", typeof(Instruction));
            var statement = new NonTerminal("statement");
            var statement_list = new NonTerminal("statement_list");
            var statement_list_opt = new NonTerminal("statement*");
            var network = new NonTerminal("network", typeof(Network));
            var network_list = new NonTerminal("network+");
            var network_list_opt = new NonTerminal("network*", typeof(NodeList));
            var ob_number = new NonTerminal("ob_number");
            var block_1 = new NonTerminal("block_1");
            var block_2 = new NonTerminal("block_2");
            var organization_block = new NonTerminal("organization_block", typeof(POU));
            var sbr_number = new NonTerminal("sbr_number");
            var subroutine_block = new NonTerminal("subroutine_block", typeof(POU));
            var int_number = new NonTerminal("int_number");
            var interrupt_block = new NonTerminal("interrupt_block", typeof(POU));
            var subroutine_block_list = new NonTerminal("subroutine_block+");
            var interrupt_block_list = new NonTerminal("interrupt_block+");
            var subroutine_block_list_opt = new NonTerminal("subroutine_block*", typeof(NodeList));
            var interrupt_block_list_opt = new NonTerminal("interrupt_block*", typeof(NodeList));
            var program = new NonTerminal("program", typeof(Block));

            operand_list.SetFlag(TermFlags.IsList);
            statement_list.SetFlag(TermFlags.IsList);
            network_list.SetFlag(TermFlags.IsList);
            subroutine_block_list.SetFlag(TermFlags.IsList);
            interrupt_block_list.SetFlag(TermFlags.IsList);
            operand_list_opt.SetFlag(TermFlags.IsListContainer);
            statement_list_opt.SetFlag(TermFlags.IsListContainer);
            network_list_opt.SetFlag(TermFlags.IsListContainer);
            subroutine_block_list_opt.SetFlag(TermFlags.IsListContainer);
            interrupt_block_list_opt.SetFlag(TermFlags.IsListContainer);
            MarkTransient(constant, mnemonic, operand, statement);

            mnemonic.Rule = bit_logic_mnemonic | clock_mnemonic | communication_mnemonic |
                compare_mnemonic | convert_mnemonic | counter_mnemonic | floatpoint_math_mnemonic |
                integer_math_mnemonic | logical_mnemonic | move_mnemonic | program_control_mnemonic |
                shift_rotate_mnemonic | string_mnemonic | table_mnemonic | timer_mnemonic | subroutine_mnemonic;
            title.Rule = ToTerm("TITLE") + "=" + title_content + NewLine;
            title_opt.Rule = title | Empty;
            operand.Rule = global_variable | local_variable | constant | address;
            operand_list.Rule = operand_list + comma + operand | operand;
            operand_list_opt.Rule = operand_list | Empty;
            instruction.Rule = mnemonic + operand_list_opt + semi_opt + comment_opt + NewLine;
            statement.Rule = instruction | line_comment | NewLine;
            statement_list.Rule = statement_list + statement | statement;
            statement_list_opt.Rule = statement_list | Empty;
            network_number.Rule = digits | Empty;
            network.Rule = "NETWORK" + network_number + comment_opt + NewLine + title_opt + statement_list_opt;
            network_list.Rule = network_list + network | network;
            network_list_opt.Rule = network_list | Empty;
            block_1.Rule = identifier + ":" + identifier + NewLine + title_opt + empty_lines_opt;
            block_2.Rule = "BEGIN" + NewLine + network_list_opt;
            organization_block.Rule =
                "ORGANIZATION_BLOCK" + block_1 + var_decl_opt + block_2 + "END_ORGANIZATION_BLOCK" + NewLine;
            subroutine_block.Rule =
                "SUBROUTINE_BLOCK" + block_1 + io_var_decl + var_decl_opt + block_2 + "END_SUBROUTINE_BLOCK" + NewLine;
            interrupt_block.Rule =
                "INTERRUPT_BLOCK" + block_1 + var_decl_opt + block_2 + "END_INTERRUPT_BLOCK" + NewLine;
            subroutine_block_list.Rule = subroutine_block_list + subroutine_block | subroutine_block;
            interrupt_block_list.Rule = interrupt_block_list + interrupt_block | interrupt_block;
            subroutine_block_list_opt.Rule = subroutine_block_list | Empty;
            interrupt_block_list_opt.Rule = interrupt_block_list | Empty;
            program.Rule = organization_block + subroutine_block_list_opt + interrupt_block_list_opt;
            #endregion

            //Set grammar root
            this.Root = program;
            this.WhitespaceChars = " \t\v";

            MarkPunctuation("(", ")", ":", ";", ".", ",");
            MarkPunctuation(semi_opt, comma_opt,
                comment, comment_opt, line_comment, empty_line, empty_lines, empty_lines_opt);

            this.LanguageFlags = LanguageFlags.NewLineBeforeEOF |
                LanguageFlags.CreateAst;
        }
Esempio n. 20
0
        public static NumberLiteral CreateDasmNumber(string name, Options options)
        {
            var lit = new NumberLiteral(name,
                (options.SignedNumbers ? NumberOptions.AllowSign : 0)
                | (options.UnderscoreInNumbers ? NumberOptions.AllowUnderscore : 0)
                | NumberOptions.IntOnly | NumberOptions.NoDotAfterInt);

            lit.DefaultIntTypes = new TypeCode[] { TypeCode.UInt16, TypeCode.Int16 };
            if (options.BinaryLiterals)
                lit.AddPrefix("0b", NumberOptions.Binary);
            lit.AddPrefix("0x", NumberOptions.Hex);

            return lit;
        }
Esempio n. 21
0
        public XbnfGrammar(Mode mode)
        {
            this.mode = mode;

            var alternationChar = (mode == Mode.Strict) ? "/" : "|";

            var rulename    = new IdentifierTerminal("rulename", "-_", null);
            var funcname    = new IdentifierTerminal("funcname", ".", null);
            var newrulename = new IdentifierTerminal("newrulename", "-_", null);
            var comment     = new CommentTerminal("comment", "/*", "*/");
            var bindig1     = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly);
            var bindig2     = new NumberLiteral("bindig", NumberOptions.Binary | NumberOptions.IntOnly);
            var hexdig1     = new NumberLiteral("hexdig", NumberOptions.Hex | NumberOptions.IntOnly);
            var hexdig2     = new NumberLiteral("hexdig", NumberOptions.Hex | NumberOptions.IntOnly);
            var decdig1     = new NumberLiteral("decvalue", NumberOptions.IntOnly);
            var decdig2     = new NumberLiteral("decvalue", NumberOptions.IntOnly);
            var charval     = new StringLiteral("charval", "\"", StringOptions.NoEscapes);
            var repeat1     = new NumberLiteral("repeat1", NumberOptions.IntOnly);
            var repeat2     = new NumberLiteral("repeat2", NumberOptions.IntOnly);
            var minus       = ToTerm("-", "minus");
            var point       = ToTerm(".", "point");

            bindig1.AddPrefix("b", NumberOptions.None);
            hexdig1.AddPrefix("x", NumberOptions.None);
            decdig1.AddPrefix("d", NumberOptions.None);

            base.NonGrammarTerminals.Add(comment);


            // NON TERMINALS
            var numval = new NonTerminal("numval");

            var hexval   = new NonTerminal("hexval");
            var hexvalp  = new NonTerminal("hexvalpoint");
            var hexvalps = new NonTerminal("hexvalpointstar");

            var binval   = new NonTerminal("binval");
            var binvalp  = new NonTerminal("binvalpoint");
            var binvalps = new NonTerminal("binvalpointstar");

            var decval   = new NonTerminal("decval");
            var decvalp  = new NonTerminal("decvalpoint");
            var decvalps = new NonTerminal("decvalpointstar");

            var rule          = new NonTerminal("rule");
            var rulelist      = new NonTerminal("rulelist");
            var alternation   = new NonTerminal("alternation");
            var concatenation = new NonTerminal("concatenation");
            var substraction  = new NonTerminal("substraction");
            var repetition    = new NonTerminal("repetition");
            var repeat        = new NonTerminal("repeat");
            var element       = new NonTerminal("element");
            var elements      = new NonTerminal("elements");
            var group         = new NonTerminal("group");
            var option        = new NonTerminal("option");
            var func          = new NonTerminal("func");
            var funcarg       = new NonTerminal("funcarg");
            var funcargs      = new NonTerminal("funcargs");



            // RULES
            hexval.Rule   = hexdig1 + (hexvalps | (minus + hexdig2) | Empty);
            hexvalp.Rule  = point + hexdig2;
            hexvalps.Rule = MakePlusRule(hexvalps, hexvalp);

            binval.Rule   = bindig1 + (binvalps | (minus + bindig2) | Empty);
            binvalp.Rule  = point + bindig2;
            binvalps.Rule = MakePlusRule(binvalps, binvalp);

            decval.Rule   = decdig1 + (decvalps | (minus + decdig2) | Empty);
            decvalp.Rule  = point + decdig2;
            decvalps.Rule = MakePlusRule(decvalps, decvalp);

            numval.Rule = ToTerm("%") + (binval | hexval | decval);

            BnfExpression rp = ToTerm("*");

            if (mode == Mode.HttpCompatible)
            {
                rp = rp | "#";
            }

            repeat.Rule = ((repeat1) | ((repeat1 | Empty) + rp + (repeat2 | Empty)));
            group.Rule  = ToTerm("(") + alternation + ")";
            option.Rule = ToTerm("[") + alternation + "]";

            funcarg.Rule  = alternation;
            funcargs.Rule = MakePlusRule(funcargs, ToTerm(","), funcarg);
            func.Rule     = ToTerm("{") + funcname + "," + funcargs + "}";

            //alternation.Rule = MakePlusRule(alternation, ToTerm(alternationChar), concatenation);
            //concatenation.Rule = MakePlusRule(concatenation, repetition);
            alternation.Rule  = MakePlusRule(alternation, ToTerm(alternationChar), substraction);
            substraction.Rule = MakePlusRule(substraction, ToTerm("&!"), concatenation);
            //concatenation + ((ToTerm("--") + concatenation) | Empty);
            concatenation.Rule = MakePlusRule(concatenation, repetition);

            repetition.Rule = (Empty | repeat) + element;
            element.Rule    = rulename | group | option | numval | charval | func;

            elements.Rule = alternation;
            rule.Rule     = newrulename + (ToTerm("=") | ToTerm("=" + alternationChar)) + elements + ";";
            rulelist.Rule = MakeStarRule(rulelist, rule);

            base.Root           = rulelist;
            base.LanguageFlags |= LanguageFlags.CanRunSample;
        }
Esempio n. 22
0
        public DemoGrammar() : base(false) // true means case sensitive
        {
            GrammarComments = @"A Demo Language. Case-insensitive.";

            //comment
            CommentTerminal eolComment = new CommentTerminal("eolComment", "//", "\n", "\r");

            NonGrammarTerminals.Add(eolComment);

            //number
            NumberLiteral integer_terminal = new NumberLiteral("integer", NumberOptions.IntOnly | NumberOptions.AllowSign, typeof(IntegerAstNode));

            integer_terminal.DefaultIntTypes = new TypeCode[] { TypeCode.Int32 };
            integer_terminal.AddPrefix("0b", NumberOptions.Binary);
            integer_terminal.AddPrefix("0x", NumberOptions.Hex);

            //label
            IdentifierTerminal label_terminal = new IdentifierTerminal("label_terminal");

            //string
            StringLiteral string_terminal = new StringLiteral("string", "\"", StringOptions.None, typeof(StringAstNode));

            //keywords
            KeyTerm FILTERS = ToTerm("filters");
            KeyTerm FILTER  = ToTerm("filter");
            KeyTerm OPEN    = ToTerm("[");
            KeyTerm CLOSE   = ToTerm("]");

            //name
            NonTerminal name = new NonTerminal("name", typeof(NameAstNode));

            name.Rule = label_terminal;

            //value
            NonTerminal value = new NonTerminal("value");

            value.Rule = integer_terminal | string_terminal;

            //nvPair
            NonTerminal nvPair = new NonTerminal("nvPair", typeof(NvPairAstNode));

            nvPair.Rule = name + "=" + value + ";";  //note: you don't have to excplitly declare KeyTerms

            //nvPairs
            NonTerminal nvPairs = new NonTerminal("nvPairs");

            nvPairs.Rule = MakeStarRule(nvPairs, nvPair);

            //filter
            NonTerminal filter = new NonTerminal("filter", typeof(FilterAstNode));

            filter.Rule = FILTER + OPEN + nvPairs + CLOSE;

            //filters
            NonTerminal filters = new NonTerminal("filters");

            filters.Rule = MakeStarRule(filters, filter);

            //file
            NonTerminal file = new NonTerminal("file", typeof(FileAstNode));

            file.Rule = FILTERS + OPEN + filters + CLOSE;

            Root = file;

            LanguageFlags |= LanguageFlags.CreateAst;
        }
Esempio n. 23
0
        public Language()
        {
            var singleLineComment = new CommentTerminal("Comment", "--", "\r", "\n", "\u2085", "\u2028", "\u2029");
            var multilineComment  = new LuaLongCommentTerminal("Comment");

            var normalString = new LuaStringLiteral("String");

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

            number.AddPrefix("0x", NumberOptions.Hex);
            number.AddExponentSymbols("eE", TypeCode.Double);
            number.DefaultIntTypes  = new TypeCode[] { TypeCode.Double };
            number.DefaultFloatType = TypeCode.Double;

            var name = new IdentifierTerminal("Name");

            var nil    = new KeyTerm("nil", "Nil");
            var @true  = new KeyTerm("true", "True");
            var @false = new KeyTerm("false", "False");

            var namelist = new NonTerminal("NameList");

            var chunk   = new NonTerminal("Chunk");
            var block   = new NonTerminal("Block");
            var stat    = new NonTerminal("Statement");
            var retstat = new NonTerminal("Return");

            var label = new NonTerminal("Label");

            var funcname        = new NonTerminal("FunctionName");
            var funcname_normal = new NonTerminal("FunctionName_Normal");
            var funcname_self   = new NonTerminal("FunctionName_Self");

            var variables = new NonTerminal("Variables");
            var variable  = new NonTerminal("Variable");
            var property  = new NonTerminal("Property");
            var index     = new NonTerminal("Index");

            var explist    = new NonTerminal("ExpressionList");
            var expression = new NonTerminal("Expression");

            var binop       = new NonTerminal("BinaryOperation");
            var binoperator = new NonTerminal("BinaryOperator");
            var unop        = new NonTerminal("UnaryOperation");
            var unoperator  = new NonTerminal("UnaryOperator");

            var functiondef      = new NonTerminal("FunctionDefinition");
            var tableconstructor = new NonTerminal("TableConstructor");
            var functioncall     = new NonTerminal("FunctionCall");
            var args             = new NonTerminal("Arguments");
            var funcbody         = new NonTerminal("FunctionBody");
            var parlist          = new NonTerminal("ParameterList");

            var field     = new NonTerminal("Field");
            var fieldsep  = new NonTerminal("FieldSeperator");
            var fieldlist = new NonTerminal("FieldList");


            var global_assignment = new NonTerminal("GlobalAssignment");
            var local_assignment  = new NonTerminal("LocalAssignment");
            var @break            = new NonTerminal("Break");
            var @goto             = new NonTerminal("Goto");
            var scope             = new NonTerminal("Scope");
            var forLoopEnumerable = new NonTerminal("ForLoop_Enumerable");
            var forLoopIterable   = new NonTerminal("ForLoop_Iterable");
            var whileLoop         = new NonTerminal("WhileLoop");
            var repeatLoop        = new NonTerminal("RepeatLoop");
            var ifStatement       = new NonTerminal("IfStatement");
            var elseifStatement   = new NonTerminal("ElseIfStatement");
            var elseifStatements  = new NonTerminal("ElseIfStatements");
            var elseStatement     = new NonTerminal("ElseStatement");
            var globalFunction    = new NonTerminal("GlobalFunction");
            var localFunction     = new NonTerminal("LocalFunction");
            var @return           = new NonTerminal("ReturnStatement");

            var assignmentValues      = new NonTerminal("AssignmentValues");
            var localAssignmentValues = new NonTerminal("LocalAssignmentValues");

            var functioncall_normal   = new NonTerminal("FunctionCall_Normal");
            var functioncall_instance = new NonTerminal("FunctionCall_Instance");

            MarkTransient(expression, stat, localAssignmentValues, binoperator, unoperator, assignmentValues, chunk);

            MarkMemberSelect(".", ":", "[");
            MarkReservedWords("if", "for", "while", "repeat", "do", "end", "break", "return", "local", "function", "false", "true", "nil");
            MarkPunctuation("=", "'", "\"", ".", ":", "::", "[", "]", "(", ")", "return", "if", "for", "then", "else", "elseif", "while", "repeat", "do", "end", "local", "function", "goto");
            RegisterBracePair("[", "]");
            RegisterBracePair("[[", "]]");
            RegisterBracePair("[=[", "]=]");
            RegisterBracePair("[==[", "]==]");
            RegisterBracePair("[===[", "]===]");
            RegisterBracePair("{", "}");
            RegisterBracePair("(", ")");


            chunk.Rule = block;
            block.Rule = MakeStarRule(block, stat);

            stat.Rule = ToTerm(";")
                        | global_assignment
                        | local_assignment
                        | functioncall
                        | label
                        | @break
                        | @goto
                        | scope
                        | forLoopEnumerable
                        | forLoopIterable
                        | whileLoop
                        | repeatLoop
                        | ifStatement
                        | globalFunction
                        | localFunction
                        | retstat
                        | singleLineComment
                        | multilineComment
            ;

            assignmentValues.Rule      = ToTerm("=") + explist;
            localAssignmentValues.Rule = ToTerm("=") + explist | Empty;


            global_assignment.Rule = variables + assignmentValues;
            local_assignment.Rule  = ToTerm("local") + variables + localAssignmentValues;
            @break.Rule            = ToTerm("break");
            @goto.Rule             = ToTerm("goto") + name;
            scope.Rule             = ToTerm("do") + block + "end";
            forLoopIterable.Rule   = ToTerm("for") + name + "=" + expression + "," + expression + ("," + expression).Q() + "do" + block + "end";
            forLoopEnumerable.Rule = ToTerm("for") + variables + "in" + explist + "do" + block + "end";
            whileLoop.Rule         = ToTerm("while") + expression + "do" + block + "end";
            repeatLoop.Rule        = ToTerm("repeat") + block + "until" + expression;
            ifStatement.Rule       = ToTerm("if") + expression + "then" + block + elseifStatements + elseStatement + "end";
            elseifStatement.Rule   = ToTerm("elseif") + expression + "then" + block;
            elseifStatements.Rule  = MakeStarRule(elseifStatements, elseifStatement);
            elseStatement.Rule     = "else" + block | Empty;
            globalFunction.Rule    = ToTerm("function") + funcname + funcbody;
            localFunction.Rule     = ToTerm("local") + "function" + name + funcbody;

            retstat.Rule  = ToTerm("return") + explist;
            label.Rule    = ToTerm("::") + name + "::";
            namelist.Rule = MakePlusRule(namelist, ToTerm(","), name);

            funcname.Rule        = funcname_normal | funcname_self;
            funcname_normal.Rule = MakePlusRule(funcname_normal, ToTerm("."), name);
            funcname_self.Rule   = funcname + ":" + name;

            explist.Rule = MakeListRule(explist, ToTerm(","), expression, TermListOptions.StarList);

            expression.Rule = PreferShiftHere() + nil
                              | @true
                              | @false
                              | number
                              | variable
                              | functioncall
                              | normalString
                              | "..."
                              | functiondef
                              | tableconstructor
                              | binop
                              | unop;
            expression.ErrorAlias = "valid expression";

            functioncall.Rule = functioncall_normal | functioncall_instance;


            //LALR supporting prefixes
            variables.Rule = MakeListRule(variables, ToTerm(","), variable, TermListOptions.PlusList);
            property.Rule  = variable + "." + name | functioncall + "." + name;
            index.Rule     = variable + "[" + expression + "]" | functioncall + "[" + expression + "]";
            variable.Rule  = name | property | index | "(" + expression + ")";


            functioncall_instance.Rule = variable + ":" + name + args | functioncall + ":" + name + args;
            functioncall_normal.Rule   = variable + args | functioncall + args;

            args.Rule = ToTerm("(") + explist + ")" | tableconstructor | normalString;

            functiondef.Rule = ToTerm("function") + funcbody;
            funcbody.Rule    = ToTerm("(") + parlist + ")" + block + "end";

            parlist.Rule          = namelist | namelist + "," + "..." | "..." | Empty;
            tableconstructor.Rule = ToTerm("{") + fieldlist + "}";

            fieldsep.Rule = ToTerm(",") | ";";
            //WARNING: Doesn't allow trailing delimiter ( { field1, field2, } )
            fieldlist.Rule = MakeListRule(fieldlist, fieldsep, field, TermListOptions.StarList | TermListOptions.AddPreferShiftHint);
            field.Rule     = (ToTerm("[") + expression + "]" + "=" + expression) | (name + "=" + expression) | expression;


            var binMinus = ToTerm("-");
            var unMinus  = ToTerm("-");

            binoperator.Rule = ToTerm("+") | binMinus | "*" | "/" | "^" | "%" | ".." | "<" | "<=" | ">" | ">=" | "==" | "~=" | "and" | "or";
            unoperator.Rule  = unMinus | "#" | "not";
            unoperator.SetFlag(TermFlags.IsOperator);
            binoperator.SetFlag(TermFlags.IsOperator);


            RegisterOperators(5, Associativity.Left, "^", "%", "..");
            RegisterOperators(4, Associativity.Left, "/");
            RegisterOperators(2, Associativity.Left, "*");
            RegisterOperators(2, Associativity.Right, unMinus);
            RegisterOperators(1, Associativity.Left, "+");
            RegisterOperators(0, Associativity.Left, binMinus);
            RegisterOperators(-1, Associativity.Left, "<", "<=", ">", ">=", "==", "~=", "and", "or");

            binop.Rule = expression + binoperator + expression;
            unop.Rule  = ReduceHere() + unoperator + expression;

            this.Root = chunk;
        }
Esempio n. 24
0
        // Constructor
        public GraphQLGrammar() : base(caseSensitive: true)
        {
            // special chars
            var comma = ToTerm(",", "comma");

            NonGrammarTerminals.Add(comma); //comma is ignored in GraphQL, just like comments
            var colon    = ToTerm(":", "colon");
            var excl     = ToTerm("!");
            var pipe     = ToTerm("|");
            var pipeOpt  = new NonTerminal("pipeOpt", Empty | pipe);
            var amp      = ToTerm("&");
            var ampOpt   = new NonTerminal("ampOpt", Empty | amp);
            var ellipsis = ToTerm("...");
            var extend   = ToTerm("extend");

            // comments
            var lineTerminators = new string[] { "\r", "\n", "\u2085", "\u2028", "\u2029" };
            var comment         = new CommentTerminal("comment", "#", lineTerminators);

            this.NonGrammarTerminals.Add(comment);

            //terminals
            var number = new NumberLiteral(TermNames.Number, NumberOptions.AllowSign);

            number.AddPrefix("0x", NumberOptions.Hex); //allow hex
            var tripleQt  = "\"\"\"";
            var strSimple = new StringLiteral(TermNames.StrSimple, "\"", StringOptions.AllowsUEscapes);
            var strBlock  = new StringLiteral(TermNames.StrBlock, tripleQt, StringOptions.AllowsLineBreak | StringOptions.AllowsUEscapes);
            var str       = new NonTerminal("str", strSimple | strBlock);
            var qStr      = new StringLiteral(TermNames.Qstr, "'"); //used by custom scalars: Datetime, Uuid, etc
            var nullVal   = ToTerm("null", TermNames.NullValue);
            var name      = new IdentifierTerminal(TermNames.Name);
            var varName   = new IdentifierTerminal(TermNames.VarName);

            varName.AllFirstChars = "$";
            var dirName = new IdentifierTerminal("dirName");

            dirName.AllFirstChars = "@";

            //non-terminals
            SchemaDocRoot = new NonTerminal("schemaDoc");
            var def           = new NonTerminal("def");
            var typeSystemDef = new NonTerminal("typeSystemDef");
            var typeSysExt    = new NonTerminal("typeSysExt");
            var schemaDef     = new NonTerminal("schemaDef");
            var dirDef        = new NonTerminal("dirDef");
            var schemaExt     = new NonTerminal("schemaExt");
            var rootOpDefList = new NonTerminal("rootOpDefList");
            var rootOpDef     = new NonTerminal("rootOpDef");

            var requestOp   = new NonTerminal(TermNames.RequestOp);
            var fragmDef    = new NonTerminal(TermNames.FragmDef);
            var typeCond    = new NonTerminal(TermNames.TypeCond);
            var typeCondOpt = new NonTerminal("typeCondOpt");

            var typeDef       = new NonTerminal("typeDef");
            var scalarTypeDef = new NonTerminal("scalarTypeDef");
            var objTypeDef    = new NonTerminal("objTypeDef");
            var intfTypeDef   = new NonTerminal("intfTypeDef");
            var unionTypeDef  = new NonTerminal("unionTypeDef");
            var enumTypeDef   = new NonTerminal("enumTypeDef");
            var opTypeDef     = new NonTerminal("opTypeDef");
            var opTypeDefList = new NonTerminal("opTypeDefList");

            var inputObjTypeDef  = new NonTerminal("inputObjTypeDef");
            var descrOpt         = new NonTerminal(TermNames.DescrOpt, Empty | str);
            var argDefList       = new NonTerminal("argDefList");
            var inputValueDef    = new NonTerminal("inputValueDef");
            var listTypeRef      = new NonTerminal(TermNames.ListTypeRef);
            var dirLoc           = new NonTerminal("dirLoc");
            var execDirLoc       = new NonTerminal("execDirLoc");
            var typeDirLoc       = new NonTerminal("typeDirLoc");
            var implsIntfsOpt    = new NonTerminal("implsIntfsOpt");
            var fldsDefOpt       = new NonTerminal("fldsDefOpt");
            var fldDefList       = new NonTerminal("fldDefList");
            var fldDef           = new NonTerminal("fldDef");
            var intfList         = new NonTerminal("intfList");
            var unionMemberTypes = new NonTerminal("unionMemberTypes");
            var unionList        = new NonTerminal("unionList");
            var enumValDefsOpt   = new NonTerminal("enumValDefsOpt");
            var enumValDefList   = new NonTerminal("enumValDefList");
            var enumValDef       = new NonTerminal("enumValDef");
            var inputFldDefsOpt  = new NonTerminal("inputFldDefsOpt");
            var inputFldDefList  = new NonTerminal("inputFldDefList");
            var inputFldDef      = new NonTerminal("inputFldDef");
            var fragmSpread      = new NonTerminal(TermNames.FragmSpread);
            var inlineFragm      = new NonTerminal(TermNames.InlineFragm);

            var argDefsOpt = new NonTerminal("argDefsOpt");
            var dirLocs    = new NonTerminal("dirLocs");

            var typeExt            = new NonTerminal("typeExt");
            var opType             = new NonTerminal(TermNames.OpType);
            var nameOpt            = new NonTerminal("nameopt", name | Empty);
            var typeRef            = new NonTerminal("typeRef");
            var dftValueOpt        = new NonTerminal("dftValueOpt");
            var constVal           = new NonTerminal("constVal");
            var val                = new NonTerminal("val");
            var arg                = new NonTerminal("arg");
            var argListOpt         = new NonTerminal(TermNames.ArgListOpt);
            var argsOpt            = new NonTerminal("argsOpt");
            var constListBr        = new NonTerminal("constListBr");
            var constList          = new NonTerminal(TermNames.ConstList);
            var constInpObj        = new NonTerminal(TermNames.ConstInpObj);
            var constInpObjFldList = new NonTerminal("constInpObjFldList");
            var constObjFld        = new NonTerminal("constObjFld");

            var notNullTypeRef = new NonTerminal(TermNames.NotNullTypeRef);
            var nullTypeRef    = new NonTerminal("nullTypeRef");
            var baseTypeRef    = new NonTerminal(TermNames.BaseTypeRef);

            var trueVal  = ToTerm("true", TermNames.True);
            var falseVal = ToTerm("false", TermNames.False);
            var boolVal  = new NonTerminal("boolVal", trueVal | falseVal);

            var varDef     = new NonTerminal("varDef");
            var varDefList = new NonTerminal(TermNames.VarDefList);
            var varDefsOpt = new NonTerminal("varDefsOpt");

            var selSet      = new NonTerminal(TermNames.SelSet);
            var selSetBr    = new NonTerminal("selSetBr");
            var selSetOpt   = new NonTerminal("selSetOpt");
            var selItem     = new NonTerminal("selItem");
            var selFld      = new NonTerminal(TermNames.SelField);
            var aliasedName = new NonTerminal(TermNames.AliasedName);

            var dir        = new NonTerminal("dir");
            var dirListOpt = new NonTerminal(TermNames.DirListOpt);

            var scalarTypeExt   = new NonTerminal("scalarTypeExt");
            var objTypeExt      = new NonTerminal("objTypeExt");
            var intfTypeExt     = new NonTerminal("intfTypeExt");
            var unionTypeExt    = new NonTerminal("unionTypeExt");
            var enumTypeExt     = new NonTerminal("enumTypeExt");
            var inputObjTypeExt = new NonTerminal("inputObjTypeExt");

            var defaultQuery = new NonTerminal(TermNames.DefaultQuery);
            var defs         = new NonTerminal("defs");
            var reqElem      = new NonTerminal("reqElem");
            var reqElemList  = new NonTerminal(TermNames.RequestElemList);

            RequestDocRoot = new NonTerminal(TermNames.RequestDoc);

            // RULES =========================================================================================

            /*
             * According to spec, a request can contain either a single default (anonymous) query, or one or more named operations.
             * We could structure the grammar so that it forces this at syntax level, but the problem is unclear error messages
             * like 'unexpected symbol' at open brace, and no easy way to improve it.
             * So we structure the grammar to allow multiple default queries, and then catch the error at AST phase.
             */

            // Request Document
            RequestDocRoot.Rule = reqElemList;
            reqElemList.Rule    = MakePlusRule(reqElemList, reqElem);
            reqElem.Rule        = requestOp | fragmDef | defaultQuery;
            requestOp.Rule      = descrOpt + opType + nameOpt + varDefsOpt + dirListOpt + selSetBr;
            defaultQuery.Rule   = selSetBr;

            // Schema doc
            SchemaDocRoot.Rule = defs;
            defs.Rule          = MakePlusRule(defs, def);
            def.Rule           = requestOp | fragmDef | typeSystemDef | typeSysExt;
            typeSystemDef.Rule = schemaDef | typeDef | dirDef;
            typeSysExt.Rule    = schemaExt | typeExt;

            //schemaDef
            schemaDef.Rule     = descrOpt + "schema" + dirListOpt + "{" + rootOpDefList + "}";
            rootOpDefList.Rule = MakePlusRule(rootOpDefList, rootOpDef);
            rootOpDef.Rule     = descrOpt + opType + colon + name;

            // opDef
            opType.Rule = ToTerm("query") | "mutation" | "subscription";

            //typeDef
            typeDef.Rule         = scalarTypeDef | objTypeDef | intfTypeDef | unionTypeDef | enumTypeDef | inputObjTypeDef;
            scalarTypeDef.Rule   = descrOpt + "scalar" + name + dirListOpt;
            objTypeDef.Rule      = descrOpt + "type" + name + implsIntfsOpt + dirListOpt + fldsDefOpt;
            intfTypeDef.Rule     = descrOpt + "interface" + name + dirListOpt + fldsDefOpt;
            unionTypeDef.Rule    = descrOpt + "union" + name + dirListOpt + unionMemberTypes;
            enumTypeDef.Rule     = descrOpt + "enum" + name + dirListOpt + enumValDefsOpt;
            inputObjTypeDef.Rule = descrOpt + "input" + name + dirListOpt + inputFldDefsOpt;

            // union members
            unionMemberTypes.Rule = Empty | "=" + pipeOpt + unionList;
            unionList.Rule        = MakePlusRule(unionList, pipe, name);

            //fragmDef
            fragmDef.Rule = descrOpt + "fragment" + name + typeCond + dirListOpt + selSetBr;
            // name should NOT be 'on' - we make it reserved word

            //typeCond
            typeCond.Rule = "on" + name;
            // this is intentional (not typeCond); some specifics of AST Builder; maybe refactor it in the future, looks silly
            typeCondOpt.Rule = Empty | "on" + name;

            // enum members
            enumValDefsOpt.Rule = Empty | "{" + enumValDefList + "}";
            enumValDefList.Rule = MakePlusRule(enumValDefList, enumValDef);
            enumValDef.Rule     = descrOpt + name + dirListOpt;

            // implements clause
            implsIntfsOpt.Rule = Empty | "implements" + ampOpt + intfList;
            intfList.Rule      = MakePlusRule(intfList, amp, name);

            // inputFldDefs
            inputFldDefsOpt.Rule = Empty | "{" + inputFldDefList + "}";
            inputFldDefList.Rule = MakePlusRule(inputFldDefList, inputFldDef);
            inputFldDef.Rule     = descrOpt + name + colon + typeRef + dftValueOpt + dirListOpt;

            // fields
            fldsDefOpt.Rule  = Empty | "{" + fldDefList + "}";
            fldDefList.Rule  = MakeStarRule(fldDefList, fldDef);
            fldDef.Rule      = descrOpt + name + argDefsOpt + colon + typeRef + dirListOpt;
            selFld.Rule      = descrOpt + aliasedName + argsOpt + dirListOpt + selSetOpt;
            aliasedName.Rule = name + colon + name | name; //optional alias

            //directives
            dirDef.Rule        = descrOpt + "directive" + dirName + argDefsOpt + "on" + pipeOpt + dirLocs;
            argDefsOpt.Rule    = Empty | "(" + argDefList + ")";
            argDefList.Rule    = MakeStarRule(argDefList, inputValueDef);
            inputValueDef.Rule = descrOpt + name + colon + typeRef + dftValueOpt + dirListOpt;
            dirLocs.Rule       = MakeListRule(dirLocs, pipe, dirLoc);
            dirLoc.Rule        = execDirLoc | typeDirLoc;
            execDirLoc.Rule    = ToTerm("QUERY") | "MUTATION" | "SUBSCRIPTION" | "FIELD" | "FRAGMENT_DEFINITION" |
                                 "FRAGMENT_SPREAD" | "INLINE_FRAGMENT";
            typeDirLoc.Rule = ToTerm("SCHEMA") | "SCALAR" | "OBJECT" | "FIELD_DEFINITION" | "ARGUMENT_DEFINITION" |
                              "INTERFACE" | "UNION" | "ENUM" | "ENUM_VALUE" | "INPUT_OBJECT" | "INPUT_FIELD_DEFINITION";
            dirListOpt.Rule = MakeStarRule(dirListOpt, dir);
            dir.Rule        = dirName + argsOpt;

            // varDefs
            varDefsOpt.Rule  = Empty | "(" + varDefList + ")";
            varDefList.Rule  = MakeStarRule(varDefList, varDef);
            varDef.Rule      = varName + colon + typeRef + dftValueOpt + dirListOpt; //directives for vars added in 2020 draft
            dftValueOpt.Rule = Empty | "=" + constVal;

            baseTypeRef.Rule    = name;
            notNullTypeRef.Rule = nullTypeRef + excl;
            nullTypeRef.Rule    = listTypeRef | baseTypeRef;
            typeRef.Rule        = baseTypeRef | listTypeRef | notNullTypeRef;
            listTypeRef.Rule    = "[" + typeRef + "]";

            // args
            argsOpt.Rule    = Empty | "(" + argListOpt + ")";
            argListOpt.Rule = MakeStarRule(argListOpt, arg); // might be PLUS according to spec (empty not allowed), but let's be forgiving
            arg.Rule        = name + colon + val;

            // SelectionSet
            selSetBr.Rule  = "{" + selSet + "}";
            selSetOpt.Rule = selSetBr | Empty;
            selSet.Rule    = MakePlusRule(selSet, selItem);
            selItem.Rule   = selFld | fragmSpread | inlineFragm;

            // fragments
            fragmSpread.Rule = ellipsis + name + dirListOpt;
            inlineFragm.Rule = ellipsis + typeCondOpt + dirListOpt + selSetBr;

            // Value/Literal; 'name' is for enum value
            constVal.Rule           = number | str | boolVal | nullVal | name | constListBr | constInpObj | qStr;
            val.Rule                = varName | constVal;
            constListBr.Rule        = "[" + constList + "]";
            constList.Rule          = MakeStarRule(constList, val);
            constInpObj.Rule        = "{" + constInpObjFldList + "}";
            constInpObjFldList.Rule = MakePlusRule(constInpObjFldList, constObjFld);
            constObjFld.Rule        = name + colon + val;

            // schemaExt
            schemaExt.Rule     = extend + "schema" + dirListOpt + "{" + opTypeDefList + "}";
            opTypeDefList.Rule = MakePlusRule(opTypeDefList, opTypeDef);
            opTypeDef.Rule     = opType + colon + name;

            // TypeExt
            typeExt.Rule         = scalarTypeExt | objTypeExt | intfTypeExt | unionTypeExt | enumTypeExt | inputObjTypeExt;
            scalarTypeExt.Rule   = extend + "scalar" + name + dirListOpt;
            objTypeExt.Rule      = extend + "type" + name + implsIntfsOpt + dirListOpt + fldsDefOpt;
            intfTypeExt.Rule     = extend + "interface" + name + dirListOpt + fldsDefOpt;
            unionTypeExt.Rule    = extend + "union" + name + dirListOpt + unionMemberTypes;
            enumTypeExt.Rule     = extend + "enum" + name + dirListOpt + enumValDefsOpt;
            inputObjTypeExt.Rule = extend + "input" + name + dirListOpt + inputFldDefsOpt;

            this.MarkReservedWords("on", "true", "false");

            this.RegisterBracePair("(", ")");
            this.RegisterBracePair("[", "]");
            this.RegisterBracePair("{", "}");
            this.MarkPunctuation(":", ",", "{", "}", "(", ")", "[", "]", "=", "!");

            this.MarkTransient(varDefsOpt, dftValueOpt, reqElem);
            this.MarkTransient(def, typeSystemDef, typeSysExt, typeExt, typeDef, typeRef, fldsDefOpt);
            this.MarkTransient(boolVal, str, val, constListBr, nameOpt, descrOpt, nullTypeRef, constVal);
            this.MarkTransient(selItem, selSetOpt, selSetBr, argsOpt, dirLoc, dirListOpt);

            this.Root = RequestDocRoot;
            this.SnippetRoots.Add(SchemaDocRoot); // alt root for schema doc parser
        }
Esempio n. 25
0
        public AssemblyGrammar()
        {
            #region Declare Terminals Here
            CommentTerminal blockComment = new CommentTerminal("block-comment", "/*", "*/");
            CommentTerminal lineComment  = new CommentTerminal("line-comment", "//", "\r", "\n", "\u2085", "\u2028", "\u2029");
            //CommentTerminal sharpComment = new CommentTerminal("sharp-comment","#","\r","\n","\u2085","\u2028","\u2029");
            NonGrammarTerminals.Add(blockComment);
            NonGrammarTerminals.Add(lineComment);
            //NonGrammarTerminals.Add(sharpComment);

            StringLiteral stringLiteral = new StringLiteral("string-literal", "\"");
            StringLiteral charLiteral   = new StringLiteral("char-literal", "\'", StringOptions.IsChar);
            NumberLiteral number        = new NumberLiteral("number", NumberOptions.AllowSign | NumberOptions.IntOnly);
            number.AddPrefix("0x", NumberOptions.Hex);
            number.AddPrefix("0b", NumberOptions.Binary);
            IdentifierTerminal identifier = TerminalFactory.CreateCSharpIdentifier("identifier");
            #endregion

            #region Declare NonTerminals Here;
            NonTerminal fileroot = new NonTerminal("fileroot");

            NonTerminal rootdefs = new NonTerminal("root-defines");
            NonTerminal rootdef  = new NonTerminal("root-define");

            NonTerminal usingDesc = new NonTerminal("using-description");

            NonTerminal memorySizeDesc = new NonTerminal("memorysize-description");
            NonTerminal targetISADesc  = new NonTerminal("targetisa-description");

            NonTerminal label = new NonTerminal("label");

            NonTerminal operandReg = new NonTerminal("operand-register");
            NonTerminal operandRef = new NonTerminal("operand-reference");
            NonTerminal operandImm = new NonTerminal("operand-immediate");

            NonTerminal valueInt     = new NonTerminal("value-integer");
            NonTerminal valueChar    = new NonTerminal("value-character");
            NonTerminal valueRefAddr = new NonTerminal("value-referaddress");

            NonTerminal labeledStatement = new NonTerminal("labeled-statement");
            NonTerminal statement        = new NonTerminal("statement");

            NonTerminal instr               = new NonTerminal("instruction");
            NonTerminal instrLabels         = new NonTerminal("instruction-labels");
            NonTerminal instrNemonic        = new NonTerminal("instruction-nemonic");
            NonTerminal instrOperands       = new NonTerminal("instruction-operands");
            NonTerminal instrOperand        = new NonTerminal("instruction-operand");
            NonTerminal labeledInstrOperand = new NonTerminal("labeled-instruction-operand");

            NonTerminal instrJump        = new NonTerminal("instruction-jump");
            NonTerminal instrJumpNemonic = new NonTerminal("instruction-jump-nemonic");
            NonTerminal instrJumpTarget  = new NonTerminal("instruction-jump-target");

            NonTerminal macrocall         = new NonTerminal("macrocall");
            NonTerminal macrocallLabels   = new NonTerminal("macrocall-labels");
            NonTerminal macrocallName     = new NonTerminal("macrocall-name");
            NonTerminal macrocallOperands = new NonTerminal("macrocall-operands");
            NonTerminal macrocallOperand  = new NonTerminal("macrocall-operand");

            NonTerminal symboldef        = new NonTerminal("symboldef");
            NonTerminal symboldefName    = new NonTerminal("symboldef-name");
            NonTerminal symboldefContent = new NonTerminal("symboldef-content");

            NonTerminal variabledef             = new NonTerminal("variabledef");
            NonTerminal variabledefName         = new NonTerminal("variabledef-name");
            NonTerminal variabledefContents     = new NonTerminal("variabledef-contents");
            NonTerminal variabledefContent      = new NonTerminal("variabledef-content");
            NonTerminal variabledefPositionHint = new NonTerminal("variabledef-poshint");

            NonTerminal constantdef         = new NonTerminal("constantdef");
            NonTerminal constantdefName     = new NonTerminal("constantdef-name");
            NonTerminal constantdefContents = new NonTerminal("constantdef-content");
            NonTerminal constantdefContent  = new NonTerminal("constantdef-content");

            NonTerminal macrodef          = new NonTerminal("macrodef");
            NonTerminal macrodefArguments = new NonTerminal("macrodef-arguments");
            NonTerminal macrodefArgument  = new NonTerminal("macrodef-arguments");
            NonTerminal macrodefContents  = new NonTerminal("macrodef-contents");
            NonTerminal macrodefContent   = new NonTerminal("macrodef-content");

            NonTerminal sectiondef           = new NonTerminal("sectiondef");
            NonTerminal sectiondefAttributes = new NonTerminal("sectiondef-attributes");
            NonTerminal sectiondefAttribute  = new NonTerminal("sectiondef-attribute");
            NonTerminal sectiondefContents   = new NonTerminal("sectiondef-contents");
            NonTerminal sectiondefContent    = new NonTerminal("sectiondef-content");

            NonTerminal blockdef         = new NonTerminal("blockdef");
            NonTerminal blockdefContents = new NonTerminal("blockdef-contents");
            NonTerminal blockdefContent  = new NonTerminal("blockdef-content");

            NonTerminal debugprint = new NonTerminal("debugprint");
            #endregion

            #region Place Rules Here
            this.Root     = fileroot;
            fileroot.Rule = rootdefs;

            rootdefs.Rule = MakeStarRule(rootdefs, rootdef);
            rootdef.Rule  = sectiondef
                            | usingDesc
                            | memorySizeDesc
                            | targetISADesc;

            usingDesc.Rule      = ToTerm("#include") + stringLiteral + ToTerm(";");
            memorySizeDesc.Rule = ToTerm("#memorysize") + number + ToTerm(";");
            targetISADesc.Rule  = ToTerm("#targetisa") + stringLiteral + ToTerm(";");

            //Commons
            operandImm.Rule = valueInt
                              | valueChar
                              | valueRefAddr;
            valueInt.Rule     = number;
            valueChar.Rule    = charLiteral;
            valueRefAddr.Rule = ToTerm("&") + identifier
                                | ToTerm("&") + identifier + ToTerm("[") + number + ToTerm("]");
            operandRef.Rule = identifier;
            operandReg.Rule = ToTerm("$") + number
                              | ToTerm("$") + identifier;

            //Variable
            variabledef.Rule = ToTerm(".variable") + variabledefName + ToTerm(";")                                                                //With no initial value (these will be grouped into one variable by optimization.)
                               | ToTerm(".variable") + variabledefName + ToTerm("=") + variabledefContent + ToTerm(";")                           //With initial value (these will be not grouped.)
                               | ToTerm(".variable") + variabledefName + ToTerm("[") + number + ToTerm("]") + ToTerm("=") + ToTerm("{") + variabledefContents + ToTerm("}") + ToTerm(";")
                               | ToTerm(".variable") + variabledefName + variabledefPositionHint + ToTerm(";")                                    //With no initial value (these will be grouped into one variable by optimization.)
                               | ToTerm(".variable") + variabledefName + variabledefPositionHint + ToTerm("=") + variabledefContent + ToTerm(";") //With initial value (these will be not grouped.)
                               | ToTerm(".variable") + variabledefName + ToTerm("[") + number + ToTerm("]") + variabledefPositionHint + ToTerm("=") + ToTerm("{") + variabledefContents + ToTerm("}") + ToTerm(";");;
            variabledefPositionHint.Rule = ToTerm("(") + ToTerm("@") + number + ToTerm(")");
            variabledefName.Rule         = identifier;
            variabledefContents.Rule     = MakeStarRule(variabledefContents, ToTerm(","), variabledefContent);
            variabledefContent.Rule      = valueInt
                                           | valueChar
                                           | valueRefAddr;

            //Constant
            constantdef.Rule = ToTerm(".constant") + constantdefName + ToTerm("=") + constantdefContent + ToTerm(";")
                               | ToTerm(".constant") + constantdefName + ToTerm("[") + number + ToTerm("]") + ToTerm("=") + ToTerm("{") + constantdefContents + ToTerm("}") + ToTerm(";");
            constantdefName.Rule     = identifier;
            constantdefContents.Rule = MakeStarRule(constantdefContents, ToTerm(","), constantdefContent);
            constantdefContent.Rule  = valueInt
                                       | valueChar
                                       | valueRefAddr;

            //Statement instr | callmacro
            debugprint.Rule       = ToTerm(">>>>") + stringLiteral;
            label.Rule            = identifier + ToTerm(":");
            labeledStatement.Rule = label + labeledStatement
                                    | statement;
            statement.Rule = instr
                             | macrocall;
            //Instruction
            instr.Rule = instrNemonic + instrOperands + ToTerm(";")
                         | instrNemonic + instrOperands + ToTerm(";") + debugprint
                         | instrNemonic + instrOperands + instrJump + ToTerm(";")
                         | instrNemonic + instrOperands + instrJump + ToTerm(";") + debugprint;
            instrNemonic.Rule        = identifier;
            instrLabels.Rule         = MakeStarRule(instrLabels, label);
            instrOperands.Rule       = MakeStarRule(instrOperands, ToTerm(","), labeledInstrOperand);
            labeledInstrOperand.Rule = label + labeledInstrOperand
                                       | instrOperand;
            instrOperand.Rule = operandRef
                                | operandImm
                                | operandReg;

            //Instruction Jump
            instrJump.Rule        = ToTerm("-<") + instrJumpNemonic + instrJumpTarget;
            instrJumpNemonic.Rule = identifier;
            instrJumpTarget.Rule  = operandRef
                                    | operandImm
                                    | operandReg;

            //Macrocall
            macrocall.Rule = ToTerm("~") + macrocallName + ToTerm("(") + macrocallOperands + ToTerm(")") + ToTerm(";")
                             | ToTerm("~") + macrocallName + ToTerm("(") + macrocallOperands + ToTerm(")") + ToTerm(";") + debugprint;
            macrocallName.Rule     = identifier;
            macrocallOperands.Rule = MakeStarRule(macrocallOperands, ToTerm(","), macrocallOperand);
            macrocallOperand.Rule  = operandRef
                                     | operandImm
                                     | operandReg;

            //Macrodefinition
            macrodef.Rule = ToTerm("macro") + identifier + ToTerm("(") + macrodefArguments + ToTerm(")") +
                            ToTerm("{") + macrodefContents + ToTerm("}");
            macrodefArguments.Rule = MakeStarRule(macrodefArguments, ToTerm(","), macrodefArgument);
            macrodefArgument.Rule  = identifier;
            macrodefContents.Rule  = MakeStarRule(macrodefContents, macrodefContent);
            macrodefContent.Rule   = blockdef
                                     | labeledStatement
                                     | variabledef
                                     | constantdef
                                     | macrodef;

            //Symboldefinition
            symboldef.Rule = ToTerm(".symbol") + symboldefName + ToTerm("=") + symboldefContent + ToTerm(";")
                             | ToTerm(".symbol") + symboldefName + ToTerm(":=") + symboldefContent + ToTerm(";");
            symboldefName.Rule    = identifier;
            symboldefContent.Rule = operandReg
                                    | ToTerm("@") + number
                                    | valueInt
                                    | valueChar
                                    | valueRefAddr;

            //Section 属性を設定可能
            sectiondef.Rule           = ToTerm("section") + identifier + ToTerm("{") + sectiondefAttributes + sectiondefContents + ToTerm("}");
            sectiondefAttributes.Rule = MakeStarRule(sectiondefAttributes, sectiondefAttribute);
            sectiondefAttribute.Rule  = ToTerm(".startup");
            sectiondefContents.Rule   = MakeStarRule(sectiondefContents, sectiondefContent);
            sectiondefContent.Rule    = blockdef
                                        | labeledStatement
                                        | variabledef
                                        | constantdef
                                        | symboldef
                                        | macrodef;

            //Block ただのスコープ
            blockdef.Rule = ToTerm("{") + blockdefContents + ToTerm("}")
                            | identifier + ToTerm("{") + blockdefContents + ToTerm("}");
            blockdefContents.Rule = MakeStarRule(blockdefContents, blockdefContent);
            blockdefContent.Rule  = blockdef
                                    | labeledStatement
                                    | variabledef
                                    | constantdef
                                    | symboldef
                                    | macrodef;

            //セクションで定義された変数や定数・命令は最適化されて好き勝手な場所に配置される.
            //デバッグ情報からその変数がどこのセクションで定義され,どこに配置されているかが確認できる
            //セクションはその親のセクションを持っている
            //ラベルを参照する際にはそのラベルが使用されたセクションから順に上をたどって参照先を検索する
            //マクロが展開されるとその中身は新しいブロックの中に展開される

            //.startup
            //.variable NAME =
            //.constant NAME = 0x23a1s,65409

            //'srl: rd,rs,rt
            //{
            //
            //}
            //
            //@ROM
            //{
            //
            //}
            #endregion

            #region Define Keywords
            this.MarkReservedWords("break", "continue", "else", "extern", "for",
                                   "if", "int", "return", "static", "void", "while");
            #endregion
        }
Esempio n. 26
0
        private void Rebop()
        {
            GrammarComments = @"This grammar is based on the BNF provided in Appendix E of 'The Official Beboputer Microprocessor Databook' Copyright © 1998, Maxfield & Montrose Interactive Inc.";

            //comments
            CommentTerminal eolPoundComment = new CommentTerminal("eolComment", "#", "\n", "\r");

            NonGrammarTerminals.Add(eolPoundComment);
            CommentTerminal eolComment = new CommentTerminal("eolComment", "//", "\n", "\r");

            NonGrammarTerminals.Add(eolComment);
            CommentTerminal multilineComment = new CommentTerminal("multilineComment", "/*", "*/");

            NonGrammarTerminals.Add(multilineComment);

            NumberLiteral integer = new NumberLiteral("integer", NumberOptions.IntOnly, typeof(IntegerAstNode));

            integer.DefaultIntTypes = new TypeCode[] { TypeCode.Byte, TypeCode.UInt16, TypeCode.UInt32 };
            integer.AddPrefix("%", NumberOptions.Binary);
            integer.AddPrefix("$", NumberOptions.Hex);

            IdentifierTerminal label_terminal = new IdentifierTerminal("label_terminal");

            NonTerminal label = new NonTerminal("label", typeof(LabelAstNode));

            label.Rule = label_terminal;


            NonTerminal integer_ref = new NonTerminal("integer_ref");

            integer_ref.Rule = integer | label;

            //expressions
            //TODO

            //mnemonics
            NonTerminal mnemonic = new NonTerminal("mnemonic", typeof(MnemonicAstNode));

            List <string> instructions = new List <string>();

            foreach (var i in Instruction.GetInstructions())
            {
                if (!instructions.Contains(i.Mnemonic))
                {
                    instructions.Add(i.Mnemonic);

                    if (mnemonic.Rule == null)
                    {
                        mnemonic.Rule = ToTerm(i.Mnemonic);
                    }
                    else
                    {
                        mnemonic.Rule |= ToTerm(i.Mnemonic);
                    }
                }
            }



            //operands
            NonTerminal imm_operand = new NonTerminal("imm_operand", typeof(ImmOperandAstNode));

            imm_operand.Rule = integer_ref;

            NonTerminal abs_operand = new NonTerminal("abs_operand", typeof(AbsOperandAstNode));

            abs_operand.Rule = "[" + integer_ref + "]";

            NonTerminal absx_operand = new NonTerminal("absx_operand", typeof(AbsXOperandAstNode));

            absx_operand.Rule = "[" + integer_ref + "," + "X" + "]";

            NonTerminal ind_operand = new NonTerminal("ind_operand", typeof(IndOperandAstNode));

            ind_operand.Rule = "[" + "[" + integer_ref + "]" + "]";

            NonTerminal xind_operand = new NonTerminal("xind_operand", typeof(XIndOperandAstNode));

            xind_operand.Rule = "[" + "[" + integer_ref + "," + "X" + "]" + "]";

            NonTerminal indx_operand = new NonTerminal("indx_operand", typeof(IndXOperandAstNode));

            indx_operand.Rule = "[" + "[" + integer_ref + "]" + "," + "X" + "]";

            NonTerminal operand = new NonTerminal("operand");

            operand.Rule = imm_operand | abs_operand | absx_operand | ind_operand | xind_operand | indx_operand;

            NonTerminal instruction = new NonTerminal("instruction", typeof(InstructionAstNode));

            instruction.Rule = ((label + ":") | Empty) + (mnemonic + (operand | Empty));

            //directives
            NonTerminal origin = new NonTerminal("origin", typeof(OriginAstNode));

            origin.Rule = ".org" + integer_ref;

            NonTerminal end = new NonTerminal("end", typeof(EndAstNode));

            end.Rule = ".end";

            NonTerminal declaration = new NonTerminal("declaration", typeof(DeclarationAstNode));

            declaration.Rule = ".equ" + integer;

            NonTerminal reservation_star = new NonTerminal("reservation_star", typeof(ReservationStarAstNode));

            reservation_star.Rule = ((ToTerm(".byte") | ".2byte" | ".4byte")) + "*" + integer_ref;

            NonTerminal byte_list_star = new NonTerminal("byte_list_star");

            MakeStarRule(byte_list_star, "," + integer);

            NonTerminal byte_list = new NonTerminal("byte_list");

            byte_list.Rule = integer + byte_list_star;

            NonTerminal reservation_init = new NonTerminal("reservation_init", typeof(ReservationInitAstNode));

            reservation_init.Rule = (ToTerm(".byte") | ".2byte" | ".4byte") + (byte_list | Empty);

            NonTerminal directive = new NonTerminal("directive", typeof(DirectiveAstNode));

            directive.Rule = ((label + ":") | Empty) + (origin | end | (reservation_star | reservation_init) | declaration);

            //statements
            NonTerminal statement = new NonTerminal("statement");

            //statement.Rule = NewLineStar + ((label + ":") | Empty) + (instruction| directive)  + (NewLinePlus|Eof);
            statement.Rule = NewLineStar + (instruction | directive) + (NewLinePlus | Eof);

            //file structure
            NonTerminal assembly_source_file = new NonTerminal("assembly_source_file", typeof(FileAstNode));

            assembly_source_file.Rule = MakeStarRule(assembly_source_file, statement);

            Root = assembly_source_file;

            LanguageFlags |= LanguageFlags.CreateAst;
        }
Esempio n. 27
0
        public LuaGrammar()
            : base(true)
        {
            #region Terminals
            var Identifier      = new IdentifierTerminal("identifier");
            var SingleString    = new StringLiteral("string", "'", StringOptions.AllowsAllEscapes);
            var DoubleString    = new StringLiteral("string", "\"", StringOptions.AllowsAllEscapes);
            var MultiLineString = new CommentTerminal("string", "[[", "]]");

            var Number = new NumberLiteral("number");
            Number.DefaultIntTypes = new[] { TypeCode.UInt64, TypeCode.Double };
            Number.AddPrefix("0x", NumberOptions.Hex);

            var LineComment = new CommentTerminal("Comment", "--", "\n", "\r");
            var LongComment = new CommentTerminal("LongComment", "--[[", "]]");

            base.NonGrammarTerminals.Add(LineComment);
            base.NonGrammarTerminals.Add(LongComment);
            #endregion

            #region Nonterminals
            var Chunk = new NonTerminal("Chunk");

            var Prefix                = new NonTerminal("Prefix");
            var Variable              = new NonTerminal("Variable");
            var FunctionCall          = new NonTerminal("FunctionCall");
            var CallArguments         = new NonTerminal("FunctionCallArguments");
            var OopCall               = new NonTerminal("OopCall");
            var CallArgumentsFragment = new NonTerminal("");
            var Expression            = new NonTerminal("Expression");
            var FunctionDef           = new NonTerminal("FunctionDef");
            var DefArguments          = new NonTerminal("FunctionDefArguments");
            var DefArgumentsFragment  = new NonTerminal("");

            var Statement       = new NonTerminal("Statement");
            var ReturnStatement = new NonTerminal("ReturnStat");
            var BreakStatement  = new NonTerminal("BreakStat");
            var Assignment      = new NonTerminal("Assignment");
            var LocalAssignment = new NonTerminal("LocalAssignment");
            var FunctionDecl    = new NonTerminal("FunctionDecl");
            var DoBlock         = new NonTerminal("DoBlock");
            var If     = new NonTerminal("If");
            var Elseif = new NonTerminal("Elseif");
            var Else   = new NonTerminal("Else");
            var While  = new NonTerminal("While");
            var Repeat = new NonTerminal("Repeat");
            var For    = new NonTerminal("For");

            var PowerOp   = new NonTerminal("PowerOp");
            var MulOp     = new NonTerminal("MulOp");
            var AddOp     = new NonTerminal("AddOp");
            var ConcatOp  = new NonTerminal("ConcatOp");
            var RelOp     = new NonTerminal("RelOp");
            var AndOp     = new NonTerminal("AndOp");
            var OrOp      = new NonTerminal("OrOp");
            var UnaryExpr = new NonTerminal("UnaryExpr");

            var TableConstruct         = new NonTerminal("TableConstruct");
            var TableConstructFragment = new NonTerminal("TableConstructFragment");

            var VarArgs = new NonTerminal("Varargs")
            {
                Rule = "..."
            };

            #endregion

            #region Fragments
            CallArgumentsFragment.Rule = Expression | Expression + "," + CallArgumentsFragment;

            CallArguments.Rule = "(" + (CallArgumentsFragment | Empty) + ")";

            DefArgumentsFragment.Rule = (Identifier | VarArgs) | Identifier + "," + DefArgumentsFragment;

            DefArguments.Rule = "(" + (DefArgumentsFragment | Empty) + ")";

            Chunk.Rule = MakeStarRule(Chunk, Statement);
            #endregion

            #region Expressions
            PowerOp.Rule  = Expression + ("^" + Expression | Empty);
            MulOp.Rule    = PowerOp + ((ToTerm("*") | "/" | "%") + PowerOp | Empty);
            AddOp.Rule    = MulOp + ((ToTerm("+") | "-") + MulOp | Empty);
            ConcatOp.Rule = AddOp + (".." + AddOp | Empty);
            RelOp.Rule    = ConcatOp + ((ToTerm(">") | ">=" | "<" | "<=" | "==" | "~=") + ConcatOp | Empty);
            AndOp.Rule    = RelOp + ("and" + RelOp | Empty);
            OrOp.Rule     = AndOp + ("or" + AndOp | Empty);

            UnaryExpr.Rule = (ToTerm("not") | "-" | "#") + Expression;

            Prefix.Rule =
                OopCall
                | FunctionCall
                | Variable
                | "(" + Expression + ")";

            Variable.Rule =
                Prefix + "." + Identifier
                | Prefix + "[" + Expression + "]"
                | Identifier;

            FunctionCall.Rule = Prefix + CallArguments;
            OopCall.Rule      = Prefix + ":" + Identifier + CallArguments;

            FunctionDef.Rule =
                ToTerm("function") + DefArguments
                + Chunk + ToTerm("end");

            var tableSep = new NonTerminal("");
            tableSep.Rule = ToTerm(";") | ",";
            TableConstructFragment.Rule =
                (
                    (
                        (
                            (Identifier | "[" + Expression + "]") + "="
                        )
                        + Expression
                        | Expression
                    )
                    + (";" + TableConstructFragment | "," + TableConstructFragment | Empty)
                ) | Empty;
            TableConstruct.Rule = "{" + TableConstructFragment + "}";

            Expression.Rule =
                VarArgs
                | Prefix
                | OrOp
                | UnaryExpr
                | ToTerm("true")
                | "false"
                | "nil"
                | SingleString
                | DoubleString
                | MultiLineString
                | Number
                | FunctionDef
                | TableConstruct;
            #endregion

            #region Statements
            FunctionDecl.Rule = "function" + Variable + (":" + Identifier | Empty) + DefArguments + Chunk + "end";


            var RetChunk = new NonTerminal("RetChunk");
            RetChunk.Rule = Expression + (("," + RetChunk) | Empty);

            ReturnStatement.Rule = "return" + (RetChunk | Empty);

            var AssignExpChunk = new NonTerminal("AssignExpChunk");
            AssignExpChunk.Rule = Expression + (("," + AssignExpChunk) | Empty);
            var AssignVarChunk = new NonTerminal("AssignVarChunk");
            AssignVarChunk.Rule = Variable + (("," + AssignVarChunk) | Empty);

            Assignment.Rule =
                AssignVarChunk + "=" + AssignExpChunk;

            var LocalAssignNameChunk = new NonTerminal("AssignNameChunk");
            var LocalFunction        = new NonTerminal("LocalFunction");
            LocalAssignNameChunk.Rule = Identifier + (("," + LocalAssignNameChunk) | Empty);
            LocalFunction.Rule        = "function" + Identifier + DefArguments + Chunk + "end";
            LocalAssignment.Rule      = "local" + (LocalAssignNameChunk + ("=" + AssignExpChunk | Empty) | LocalFunction);

            Elseif.Rule = "elseif" + Expression + "then" + Chunk + (Elseif | Empty);
            Else.Rule   = "else" + Chunk;

            If.Rule = "if" + Expression + "then" + Chunk + (Elseif | Empty) + (Else | Empty) + "end";

            While.Rule = "while" + Expression + DoBlock;

            DoBlock.Rule = "do" + Chunk + "end";

            Repeat.Rule = "repeat" + Chunk + "until" + Expression;

            BreakStatement.Rule = "break";

            var NumericFor = new NonTerminal("NumericFor");
            NumericFor.Rule = Identifier + "=" + Expression + "," + Expression + ("," + Expression | Empty);
            var GenericFor = new NonTerminal("GenericFor");
            var NameList   = new NonTerminal("NameList");
            var ExpList    = new NonTerminal("ExpList");
            NameList.Rule   = Identifier + (("," + NameList) | Empty);
            ExpList.Rule    = Expression + (("," + ExpList) | Empty);
            GenericFor.Rule = NameList + "in" + ExpList;

            For.Rule = "for" + (GenericFor | NumericFor) + DoBlock;

            Statement.Rule =
                ";"
                | ReturnStatement
                | BreakStatement
                | Assignment
                | LocalAssignment
                | FunctionCall
                | OopCall
                | FunctionDecl
                | For
                | If
                | While
                | DoBlock
                | Repeat;
            #endregion

            Root = Chunk;
            MarkReservedWords(
                "true", "false",
                "nil", "local",
                "function", "while",
                "if", "for", "repeat", "until",
                "end", "do", "return", "break");

            MarkPunctuation(".", ",", ";", "(", ")", "[", "]", "{", "}", "=", ":");
            MarkTransient(Statement);
        }
Esempio n. 28
0
        public CalcGrammar() : base(true)
        {
            var comment      = new CommentTerminal("comment", "//", "\n", "\r");
            var blockComment = new CommentTerminal("blockComment", "/*", "*/");

            NonGrammarTerminals.Add(comment);
            NonGrammarTerminals.Add(blockComment);

            NonTerminal start                   = new NonTerminal("start", typeof(StatementListNode));
            NonTerminal block                   = new NonTerminal("block");
            NonTerminal instructions            = new NonTerminal("instructions", typeof(BlockNode));
            NonTerminal instruction             = new NonTerminal("instruction");
            NonTerminal embeddedInstruction     = new NonTerminal("embeddedInstruction");
            NonTerminal ifClause                = new NonTerminal("ifClause", typeof(IfNode));
            NonTerminal ifElseClause            = new NonTerminal("ifElseClause", typeof(IfNode));
            NonTerminal forClause               = new NonTerminal("forClause", typeof(ForNode));
            NonTerminal forInitClause           = new NonTerminal("forInit", typeof(StatementListNode));
            NonTerminal forConditionClause      = new NonTerminal("forCondition");
            NonTerminal forIterClause           = new NonTerminal("forIter", typeof(StatementListNode));
            NonTerminal foreachClause           = new NonTerminal("foreachClause", typeof(ForeachNode));
            NonTerminal foreachVarDecl          = new NonTerminal("foreachVarDecl");
            NonTerminal whileClause             = new NonTerminal("whileClause", typeof(WhileNode));
            NonTerminal doWhileClause           = new NonTerminal("doWhileClause", typeof(DoWhileNode));
            NonTerminal returnClause            = new NonTerminal("returnClause", typeof(ReturnNode));
            NonTerminal emptyReturnClause       = new NonTerminal("emptyReturnClause", typeof(ReturnNode));
            NonTerminal breakClause             = new NonTerminal("breakClause", typeof(BreakNode));
            NonTerminal continueClause          = new NonTerminal("continueClause", typeof(ContinueNode));
            NonTerminal usingClause             = new NonTerminal("usingClause", typeof(UsingNode));
            NonTerminal usingNamespace          = new NonTerminal("namespace", typeof(UsingNamespaceNode));
            NonTerminal tryClause               = new NonTerminal("tryClause", typeof(TryNode));
            NonTerminal catchClause             = new NonTerminal("catchClause", typeof(CatchNode));
            NonTerminal finallyClause           = new NonTerminal("finallyClause");
            NonTerminal throwClause             = new NonTerminal("throwClause", typeof(ThrowNode));
            NonTerminal assignment              = new NonTerminal("assignment", typeof(AssignmentNode));
            NonTerminal assignmentOp            = new NonTerminal("assignmentOp", "assignment operator");
            NonTerminal varDeclaration          = new NonTerminal("varDeclaration", typeof(VarDeclarationNode));
            NonTerminal varDeclarationAndAssign = new NonTerminal("varDeclaration", typeof(VarDeclarationNode));
            NonTerminal functionDef             = new NonTerminal("functionDef", typeof(FunctionDefNode));
            NonTerminal functionBody            = new NonTerminal("functionBody", typeof(StatementListNode));
            NonTerminal lambdaBody              = new NonTerminal("lambdaBody", typeof(StatementListNode));
            NonTerminal inlineFunctionDef       = new NonTerminal("inlineFunctionDef", typeof(LambdaNode));
            NonTerminal externFunctionDef       = new NonTerminal("externFunctionDef", typeof(ExternFunctionNode));
            NonTerminal paramList               = new NonTerminal("paramList", typeof(ParamListNode));
            NonTerminal param                   = new NonTerminal("param", typeof(ParamNode));
            NonTerminal lambdaParamList         = new NonTerminal("lambdaParamList", typeof(ParamListNode));
            NonTerminal singleLambdaParamList   = new NonTerminal("lambdaParamList", typeof(ParamListNode));
            NonTerminal lambdaParam             = new NonTerminal("lambdaParam", typeof(ParamNode));
            NonTerminal paramsOrEmpty           = new NonTerminal("paramsOrEmpty");
            NonTerminal arrayDef                = new NonTerminal("arrayDef");
            NonTerminal arrayDefList            = new NonTerminal("arrayDefList", typeof(ArrayDefNode));
            NonTerminal arrayDefListItem        = new NonTerminal("arrayDefListItem");
            NonTerminal namedArrayItem          = new NonTerminal("namedArrayItem", typeof(NamedArrayItemNode));
            NonTerminal expr                   = new NonTerminal("expr");
            NonTerminal prefixExpr             = new NonTerminal("prefixExpr", typeof(IncDecNode));
            NonTerminal postfixExpr            = new NonTerminal("postfixExpr", typeof(IncDecNode));
            NonTerminal binExpr                = new NonTerminal("binExpr", typeof(BinaryOperationNode));
            NonTerminal unExpr                 = new NonTerminal("unExpr", typeof(UnaryExpressionNode));
            NonTerminal var                    = new NonTerminal("var");
            NonTerminal objRef                 = new NonTerminal("objRef");
            NonTerminal memberAccess           = new NonTerminal("memberAccess", typeof(MemberAccessNode));
            NonTerminal ternaryIf              = new NonTerminal("ternaryIf", typeof(IfNode));
            NonTerminal coalescence            = new NonTerminal("coalescence", typeof(CoalescenceNode));
            NonTerminal functionCall           = new NonTerminal("functionCall", typeof(FunctionCallNode));
            NonTerminal varList                = new NonTerminal("varList", typeof(ExpressionListNode));
            NonTerminal array                  = new NonTerminal("array");
            NonTerminal singleDimArray         = new NonTerminal("singleDimArray", typeof(IndexedAccessNode));
            NonTerminal rangeArrayDef          = new NonTerminal("rangeArrayDef", typeof(RangeArrayDefNode));
            NonTerminal rangeInclusiveArrayDef = new NonTerminal("rangeInclusiveArrayDef", typeof(RangeArrayDefNode));
            NonTerminal typeInfo               = new NonTerminal("typeInfo");
            NonTerminal typeInfoOrEmpty        = new NonTerminal("typeInfoOrEmpty");

            IdentifierTerminal name    = new IdentifierTerminal("name", IdOptions.IsNotKeyword);
            IdentifierTerminal newName = new IdentifierTerminal("newName", IdOptions.IsNotKeyword);
            NumberLiteral      number  = new NumberLiteral("number", NumberOptions.AllowUnderscore);

            StringLiteral _string = new StringLiteral("string", "\"", StringOptions.AllowsAllEscapes);

            StringLiteral _char = new StringLiteral("Char", "'", StringOptions.IsChar | StringOptions.AllowsAllEscapes);

            NonTerminal boolVal  = new NonTerminal("boolVal", typeof(BoolValNode));
            NonTerminal nullVal  = new NonTerminal("nullVal", typeof(NullValueNode));
            NonTerminal thisVal  = new NonTerminal("thisVal", typeof(ThisNode));
            NonTerminal binOp    = new NonTerminal("binOp", "operator");
            NonTerminal unaryOp  = new NonTerminal("unaryOp", "operator");
            NonTerminal incDecOp = new NonTerminal("incDecOp", "operator");

            NonTerminal emptyInstruction = new NonTerminal("emptyInstruction", typeof(EmptyNode));

            start.Rule        = MakeStarRule(start, instruction);
            block.Rule        = "{" + instructions + "}";
            instructions.Rule = MakeStarRule(instructions, instruction);
            instruction.Rule  = block
                                | embeddedInstruction + ";"
                                | ifClause
                                | ifElseClause
                                | functionDef
                                | externFunctionDef + ";"
                                | returnClause + ";"
                                | emptyReturnClause
                                | breakClause
                                | continueClause
                                | forClause
                                | foreachClause
                                | whileClause
                                | doWhileClause
                                | usingClause
                                | varDeclaration + ";"
                                | emptyInstruction
                                | tryClause
                                | throwClause + ";";
            emptyInstruction.Rule    = ToTerm(";");
            instruction.ErrorRule    = SyntaxError + ";";
            embeddedInstruction.Rule = functionCall | postfixExpr | prefixExpr | assignment | varDeclarationAndAssign;
            ifElseClause.Rule        = ToTerm("if") + "(" + expr + ")" + instruction
                                       + PreferShiftHere() + "else" + instruction;
            ifClause.Rule           = ToTerm("if") + "(" + expr + ")" + instruction;
            forClause.Rule          = ToTerm("for") + "(" + forInitClause + ";" + forConditionClause + ";" + forIterClause + ")" + instruction;
            forInitClause.Rule      = MakeStarRule(forInitClause, ToTerm(","), embeddedInstruction);
            forConditionClause.Rule = Empty | expr;
            forIterClause.Rule      = MakeStarRule(forIterClause, ToTerm(","), embeddedInstruction);
            foreachClause.Rule      = ToTerm("foreach") + "(" + foreachVarDecl + "in" + expr + ")" + instruction;
            foreachVarDecl.Rule     = varDeclaration | name;
            whileClause.Rule        = ToTerm("while") + "(" + expr + ")" + instruction;
            doWhileClause.Rule      = ToTerm("do") + instruction + ToTerm("while") + "(" + expr + ")" + ToTerm(";");
            returnClause.Rule       = "return" + expr;
            emptyReturnClause.Rule  = ToTerm("return") + ";";
            breakClause.Rule        = ToTerm("break") + ";";
            continueClause.Rule     = ToTerm("continue") + ";";

            tryClause.Rule = "try" + block + (catchClause + finallyClause | finallyClause | catchClause);

            catchClause.Rule   = "catch" + ("(" + name + ")").Q() + block;
            finallyClause.Rule = "finally" + block;

            throwClause.Rule = "throw" + expr;

            usingClause.Rule = ToTerm("using") + usingNamespace + ";";

            usingNamespace.Rule = (name + "." + usingNamespace) | name;

            varDeclaration.Rule          = "var" + name + typeInfoOrEmpty;
            varDeclarationAndAssign.Rule = "var" + name + typeInfoOrEmpty + "=" + expr;

            assignment.Rule   = objRef + assignmentOp + expr;
            assignmentOp.Rule = ToTerm("=") | "+=" | "-=" | "*=" | "/=" | "%=" | "|=" | "^=" | "&=" | "<<=" | ">>=" | "**=";
            objRef.Rule       = name | array | memberAccess;
            memberAccess.Rule = var + PreferShiftHere() + "." + name;

            functionDef.Rule = "function" + name + "(" + paramList + ")" + ToTerm("extension").Q() + functionBody;
            functionDef.NodeCaptionTemplate = "function #{0}(...)";
            inlineFunctionDef.Rule          = (ToTerm("function") + "(" + paramList + ")" + functionBody)
                                              | ("(" + lambdaParamList + ")" + ToTerm("=>") + expr)
                                              | (singleLambdaParamList + "=>" + expr);
            externFunctionDef.Rule = ToTerm("extern") + "function" + name + "(" + paramList + ")" + ToTerm("extension").Q();
            inlineFunctionDef.NodeCaptionTemplate = "function(...)";
            functionBody.Rule = block | returnClause;

            paramList.Rule             = MakeStarRule(paramList, ToTerm(","), param);
            lambdaParamList.Rule       = MakeStarRule(lambdaParamList, ToTerm(","), lambdaParam);
            singleLambdaParamList.Rule = lambdaParam;

            lambdaParam.Rule   = name + ReduceIf("=>", "+", "-", "*", "/", "%", "**", "&", "&&", "|", "||", "^", "==", "<=", ">=", "<", ">", "!=", "<<", ">>", ";", "(", "??");
            param.Rule         = paramsOrEmpty + name + typeInfoOrEmpty;
            paramsOrEmpty.Rule = ToTerm("params") | Empty;

            arrayDef.Rule         = "{" + arrayDefList + "}";
            arrayDefList.Rule     = MakeStarRule(arrayDefList, ToTerm(","), arrayDefListItem);
            arrayDefListItem.Rule = namedArrayItem | expr;
            namedArrayItem.Rule   = (name + ReduceHere() | _string) + "=" + expr;

            rangeArrayDef.Rule = expr + PreferShiftHere() + ".." + expr + ((PreferShiftHere() + ":" + expr) | Empty);

            rangeInclusiveArrayDef.Rule = expr + PreferShiftHere() + "..." + expr + ((PreferShiftHere() + ":" + expr) | Empty);

            expr.Rule = prefixExpr | postfixExpr | ternaryIf
                        | inlineFunctionDef
                        | var | unExpr | binExpr
                        | arrayDef
                        | rangeArrayDef
                        | rangeInclusiveArrayDef
                        | assignment
                        | coalescence;

            coalescence.Rule = expr + "??" + expr;

            binExpr.Rule = expr + binOp + expr;
            binOp.Rule   = ToTerm("&&") | "||" | "&" | "|" | "^"
                           | ToTerm("==") | "<=" | ">=" | "<" | ">" | "!="
                           | ToTerm("+") | "-"
                           | ToTerm("*") | "/" | "%" | "**"
                           | ToTerm("<<") | ">>";
            prefixExpr.Rule  = incDecOp + objRef + ReduceHere();
            postfixExpr.Rule = objRef + PreferShiftHere() + incDecOp;
            unExpr.Rule      = unaryOp + expr + ReduceHere();

            var.Rule = objRef
                       | number
                       | boolVal
                       | nullVal
                       | thisVal
                       | _string
                       | _char
                       | functionCall + ReduceHere()
                       | ("(" + expr + ")");

            ternaryIf.Rule    = expr + "?" + expr + ":" + expr;
            functionCall.Rule = var + PreferShiftHere() + "(" + varList + ")";
            functionCall.NodeCaptionTemplate = "call #{0}(...)";
            varList.Rule = MakeStarRule(varList, ToTerm(","), expr);

            array.Rule          = singleDimArray;
            singleDimArray.Rule = var + PreferShiftHere() + "[" + expr + "]";

            boolVal.Rule = ToTerm("true") | "false";
            nullVal.Rule = ToTerm("null");
            thisVal.Rule = ToTerm("this");

            typeInfoOrEmpty.Rule = ":" + typeInfo | Empty;
            typeInfo.Rule        = ToTerm("string")
                                   | "function"
                                   | "number"
                                   | "bool"
                                   | "table"
                                   | "char";


            unaryOp.Rule  = ToTerm("-") | "!" | "~";
            incDecOp.Rule = ToTerm("++") | "--";

            MarkPunctuation("(", ")", "?", ":", "[", "]", ";", "{", "}", ".", ",", "@", "=>", "??",
                            "return", "if", "else", "for", "while", "break", "continue",
                            "using", "do", "var", "foreach", "in",
                            "try", "catch", "finally", "throw", "extern");
            RegisterBracePair("(", ")");
            RegisterBracePair("[", "]");
            RegisterBracePair("{", "}");

            RegisterOperators(10, "?");
            RegisterOperators(15, "&&", "||", "&", "|", "^");
            RegisterOperators(20, "==", "<", "<=", ">", ">=", "!=");
            RegisterOperators(25, "<<", ">>");
            RegisterOperators(30, "+", "-");
            RegisterOperators(40, "*", "/", "%", "**");
            RegisterOperators(60, "!", "~");
            RegisterOperators(70, "++", "--", "??");
            MarkTransient(var, expr, binOp, unaryOp, block, instruction, embeddedInstruction, objRef, array, arrayDef, assignmentOp, arrayDefListItem, incDecOp, functionBody, lambdaBody, foreachVarDecl, paramsOrEmpty, typeInfoOrEmpty);

            AddTermsReportGroup("assignment", "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=");
            AddTermsReportGroup("statement", "if", "while", "for", "return", "break", "continue", "using", "do", "try", "throw", "foreach");
            AddTermsReportGroup("variable declaration", "var");
            AddTermsReportGroup("function declaration", "function", "extern");
            AddTermsReportGroup("constant", number, _string, _char);
            AddTermsReportGroup("constant", "null", "false", "true", "this", "@");
            AddTermsReportGroup("unary operator", "+", "-", "!");
            AddTermsReportGroup("operator", "+", "-", "*", "/", "%", "**", "&", "&&", "|", "||", "^", "?", "==", "<=", "<", ">=", ">", "!=", "<<", ">>", "??", "..");
            AddToNoReportGroup("(", "[", "{", ".", ",", "++", "--");

            MarkReservedWords("if", "else", "return", "function", "while",
                              "for", "null", "false", "true", "this", "break", "continue",
                              "using", "do", "var", "foreach", "in", "params",
                              "try", "catch", "finally", "throw", "extern");

            number.DefaultFloatType = TypeCode.Double;
            number.DefaultIntTypes  = new TypeCode[] { TypeCode.Int64 };
            number.AddPrefix("0x", NumberOptions.Hex);
            number.AddPrefix("0b", NumberOptions.Binary);
            number.AddSuffix("d", TypeCode.Double);
            number.AddSuffix("l", TypeCode.Int64);
            number.AddSuffix("m", TypeCode.Decimal);

            _string.AddPrefix("@", StringOptions.NoEscapes);
            _string.AddPrefix("$", StringOptions.IsTemplate | StringOptions.AllowsAllEscapes);

            var stringTemplateSettings = new StringTemplateSettings();

            stringTemplateSettings.StartTag       = "{";
            stringTemplateSettings.EndTag         = "}";
            stringTemplateSettings.ExpressionRoot = expr;
            this.SnippetRoots.Add(expr);
            _string.AstConfig.NodeType = typeof(StringTemplateNode);
            _string.AstConfig.Data     = stringTemplateSettings;

            this.Root = start;

            this.LanguageFlags = LanguageFlags.CreateAst;
        }
Esempio n. 29
0
        public CilGrammar()
            : base(true)
        {
            LanguageFlags = LanguageFlags.CreateAst;

            // comments

            var SINGLELINECOMMENT = new CommentTerminal("SINGLELINECOMMENT", "//", "\n", "\r\n");

            ConfigureAstNode(SINGLELINECOMMENT);

            NonGrammarTerminals.Add(SINGLELINECOMMENT);

            // lexical tokens

            var HEXBYTE = new RegexBasedTerminal("HEXBYTE", @"[A-F0-9]{2}"); // DOCS: not specified in ECMA grammar

            ConfigureAstNode(HEXBYTE);

            var DOTTEDNAME = CreateNonTerminal("DOTTEDNAME");

            DOTTEDNAME.Rule = _("TODO: DOTTEDNAME");
            ConfigureAstNode(DOTTEDNAME);

            var ID = new IdentifierTerminal("ID");

            ID.AddPrefix("$", IdOptions.None); // DOCS: ECMA page 110
            ConfigureAstNode(ID);

            var QSTRING = new StringLiteral("QSTRING", "\"");

            ConfigureAstNode(QSTRING);

            var SQSTRING = new StringLiteral("SQSTRING", "'");

            ConfigureAstNode(SQSTRING);

            var INT32 = new NumberLiteral("INT32", NumberOptions.AllowSign | NumberOptions.IntOnly);

            INT32.AddPrefix("0x", NumberOptions.Hex);
            INT32.DefaultIntTypes = new TypeCode[] { TypeCode.Int32 };
            ConfigureAstNode(INT32);

            var INT64 = new NumberLiteral("INT64", NumberOptions.AllowSign | NumberOptions.IntOnly);

            INT64.AddPrefix("0x", NumberOptions.Hex);
            INT64.DefaultIntTypes = new TypeCode[] { TypeCode.Int64 };
            ConfigureAstNode(INT64);

            var FLOAT64 = new NumberLiteral("FLOAT64", NumberOptions.AllowStartEndDot | NumberOptions.AllowSign);

            ConfigureAstNode(FLOAT64);

            // non-terminals

            var decls               = CreateNonTerminal("decls");
            var decl                = CreateNonTerminal("decl");
            var compQstring         = CreateNonTerminal("compQstring");
            var languageDecl        = CreateNonTerminal("languageDecl");
            var customAttrDecl      = CreateNonTerminal("customAttrDecl");
            var moduleHead          = CreateNonTerminal("moduleHead");
            var vtfixupDecl         = CreateNonTerminal("vtfixupDecl");
            var vtableDecl          = CreateNonTerminal("vtableDecl");
            var nameSpaceHead       = CreateNonTerminal("nameSpaceHead");
            var classHead           = CreateNonTerminal("classHead");
            var classAttr           = CreateNonTerminal("classAttr");
            var extendsClause       = CreateNonTerminal("extendsClause");
            var implClause          = CreateNonTerminal("implClause");
            var classNames          = CreateNonTerminal("classNames");
            var classDecls          = CreateNonTerminal("classDecls");
            var classDecl           = CreateNonTerminal("classDecl");
            var fieldDecl           = CreateNonTerminal("fieldDecl");
            var atOpt               = CreateNonTerminal("atOpt");
            var initOpt             = CreateNonTerminal("initOpt");
            var repeatOpt           = CreateNonTerminal("repeatOpt");
            var customHead          = CreateNonTerminal("customHead");
            var customHeadWithOwner = CreateNonTerminal("customHeadWithOwner");
            var memberRef           = CreateNonTerminal("memberRef");
            var customType          = CreateNonTerminal("customType");
            var ownerType           = CreateNonTerminal("ownerType");
            var eventHead           = CreateNonTerminal("eventHead");
            var eventDecls          = CreateNonTerminal("eventDecls");
            var propHead            = CreateNonTerminal("propHead");
            var propDecls           = CreateNonTerminal("propDecls");
            var methodHeadPart1     = CreateNonTerminal("methodHeadPart1");
            var methodHead          = CreateNonTerminal("methodHead");
            var methAttr            = CreateNonTerminal("methAttr");
            var pinvAttr            = CreateNonTerminal("pinvAttr");
            var methodName          = CreateNonTerminal("methodName");
            var paramAttr           = CreateNonTerminal("paramAttr");
            var fieldAttr           = CreateNonTerminal("fieldAttr");
            var implAttr            = CreateNonTerminal("implAttr");
            var localsHead          = CreateNonTerminal("localsHead");
            var methodDecl          = CreateNonTerminal("methodDecl");
            var scopeBlock          = CreateNonTerminal("scopeBlock");
            var sehBlock            = CreateNonTerminal("sehBlock");
            var methodDecls         = CreateNonTerminal("methodDecls");
            var dataDecl            = CreateNonTerminal("dataDecl");
            var ddHead              = CreateNonTerminal("ddHead");
            var tls                = CreateNonTerminal("tls");
            var ddBody             = CreateNonTerminal("ddBody");
            var ddItemList         = CreateNonTerminal("ddItemList");
            var ddItemCount        = CreateNonTerminal("ddItemCount");
            var ddItem             = CreateNonTerminal("ddItem");
            var fieldInit          = CreateNonTerminal("fieldInit");
            var bytearrayhead      = CreateNonTerminal("bytearrayhead");
            var bytes              = CreateNonTerminal("bytes");
            var hexbytes           = CreateNonTerminal("hexbytes");
            var instr_r_head       = CreateNonTerminal("instr_r_head");
            var instr_tok_head     = CreateNonTerminal("instr_tok_head");
            var methodSpec         = CreateNonTerminal("methodSpec");
            var instr              = CreateNonTerminal("instr");
            var sigArgs0           = CreateNonTerminal("sigArgs0");
            var sigArgs1           = CreateNonTerminal("sigArgs1");
            var sigArg             = CreateNonTerminal("sigArg");
            var name1              = CreateNonTerminal("name1");
            var className          = CreateNonTerminal("className");
            var slashedName        = CreateNonTerminal("slashedName");
            var typeSpec           = CreateNonTerminal("typeSpec");
            var callConv           = CreateNonTerminal("callConv");
            var callKind           = CreateNonTerminal("callKind");
            var nativeType         = CreateNonTerminal("nativeType");
            var type               = CreateNonTerminal("type");
            var bounds1            = CreateNonTerminal("bounds1");
            var bound              = CreateNonTerminal("bound");
            var labels             = CreateNonTerminal("labels");
            var id                 = CreateNonTerminal("id");
            var int16s             = CreateNonTerminal("int16s");
            var int32              = CreateNonTerminal("int32");
            var int64              = CreateNonTerminal("int64");
            var float64            = CreateNonTerminal("float64");
            var secDecl            = CreateNonTerminal("secDecl");
            var psetHead           = CreateNonTerminal("psetHead");
            var nameValPairs       = CreateNonTerminal("nameValPairs");
            var nameValPair        = CreateNonTerminal("nameValPair");
            var truefalse          = CreateNonTerminal("truefalse");
            var caValue            = CreateNonTerminal("caValue");
            var secAction          = CreateNonTerminal("secAction");
            var extSourceSpec      = CreateNonTerminal("extSourceSpec");
            var fileDecl           = CreateNonTerminal("fileDecl");
            var hashHead           = CreateNonTerminal("hashHead");
            var assemblyHead       = CreateNonTerminal("assemblyHead");
            var asmAttr            = CreateNonTerminal("asmAttr");
            var assemblyDecls      = CreateNonTerminal("assemblyDecls");
            var assemblyDecl       = CreateNonTerminal("assemblyDecl");
            var asmOrRefDecl       = CreateNonTerminal("asmOrRefDecl");
            var publicKeyHead      = CreateNonTerminal("publicKeyHead");
            var publicKeyTokenHead = CreateNonTerminal("publicKeyTokenHead");
            var localeHead         = CreateNonTerminal("localeHead");
            var assemblyRefHead    = CreateNonTerminal("assemblyRefHead");
            var assemblyRefDecls   = CreateNonTerminal("assemblyRefDecls");
            var assemblyRefDecl    = CreateNonTerminal("assemblyRefDecl");
            var comtypeHead        = CreateNonTerminal("comtypeHead");
            var exportHead         = CreateNonTerminal("exportHead");
            var comtypeDecls       = CreateNonTerminal("comtypeDecls");
            var manifestResHead    = CreateNonTerminal("manifestResHead");
            var manresAttr         = CreateNonTerminal("manresAttr");
            var manifestResDecls   = CreateNonTerminal("manifestResDecls");
            var manifestResDecl    = CreateNonTerminal("manifestResDecl");

            // instructions

            var INSTR_NONE     = CreateNonTerminal("INSTR_NONE");
            var INSTR_VAR      = CreateNonTerminal("INSTR_VAR");
            var INSTR_I        = CreateNonTerminal("INSTR_I");
            var INSTR_I8       = CreateNonTerminal("INSTR_I8");
            var INSTR_R        = CreateNonTerminal("INSTR_R");
            var INSTR_BRTARGET = CreateNonTerminal("INSTR_BRTARGET");
            var INSTR_METHOD   = CreateNonTerminal("INSTR_METHOD");
            var INSTR_FIELD    = CreateNonTerminal("INSTR_FIELD");
            var INSTR_TYPE     = CreateNonTerminal("INSTR_TYPE");
            var INSTR_STRING   = CreateNonTerminal("INSTR_STRING");
            var INSTR_SIG      = CreateNonTerminal("INSTR_SIG");
            var INSTR_RVA      = CreateNonTerminal("INSTR_RVA");
            var INSTR_SWITCH   = CreateNonTerminal("INSTR_SWITCH");
            var INSTR_PHI      = CreateNonTerminal("INSTR_PHI");
            var INSTR_TOK      = CreateNonTerminal("INSTR_TOK");

            INSTR_NONE.Rule =
                _("add") |
                ___("add.ovf") |
                ___("add.ovf.un") |
                _("and") |
                _("arglist") |
                _("break") |
                _("ceq") |
                _("cgt") |
                ___("cgt.un") |
                _("ckfinite") |
                _("clt") |
                ___("clt.un") |
                ___("conv.i") |
                ___("conv.i1") |
                ___("conv.i2") |
                ___("conv.i4") |
                ___("conv.i8") |
                ___("conv.ovf.i") |
                ___("conv.ovf.i.un") |
                ___("conv.ovf.i1") |
                ___("conv.ovf.i1.un") |
                ___("conv.ovf.i2") |
                ___("conv.ovf.i2.un") |
                ___("conv.ovf.i4") |
                ___("conv.ovf.i4.un") |
                ___("conv.ovf.i8") |
                ___("conv.ovf.i8.un") |
                ___("conv.ovf.u") |
                ___("conv.ovf.u.un") |
                ___("conv.ovf.u1") |
                ___("conv.ovf.u1.un") |
                ___("conv.ovf.u2") |
                ___("conv.ovf.u2.un") |
                ___("conv.ovf.u4") |
                ___("conv.ovf.u4.un") |
                ___("conv.ovf.u8") |
                ___("conv.ovf.u8.un") |
                ___("conv.r.un") |
                ___("conv.r4") |
                ___("conv.r8") |
                ___("conv.u") |
                ___("conv.u1") |
                ___("conv.u2") |
                ___("conv.u4") |
                ___("conv.u8") |
                _("cpblk") |
                _("div") |
                ___("div.un") |
                _("dup") |
                _("endfault") |
                _("endfilter") |
                _("endfinally") |
                _("initblk") |
                ___("ldarg.0") |
                ___("ldarg.1") |
                ___("ldarg.2") |
                ___("ldarg.3") |
                ___("ldc.i4.0") |
                ___("ldc.i4.1") |
                ___("ldc.i4.2") |
                ___("ldc.i4.3") |
                ___("ldc.i4.4") |
                ___("ldc.i4.5") |
                ___("ldc.i4.6") |
                ___("ldc.i4.7") |
                ___("ldc.i4.8") |
                ___("ldc.i4.M1") |
                ___("ldc.i4.m1") | // DOCS: non present in ECMA grammar
                ___("ldelem.i") |
                ___("ldelem.i1") |
                ___("ldelem.i2") |
                ___("ldelem.i4") |
                ___("ldelem.i8") |
                ___("ldelem.r4") |
                ___("ldelem.r8") |
                ___("ldelem.ref") |
                ___("ldelem.u1") |
                ___("ldelem.u2") |
                ___("ldelem.u4") |
                ___("ldind.i") |
                ___("ldind.i1") |
                ___("ldind.i2") |
                ___("ldind.i4") |
                ___("ldind.i8") |
                ___("ldind.r4") |
                ___("ldind.r8") |
                ___("ldind.ref") |
                ___("ldind.u1") |
                ___("ldind.u2") |
                ___("ldind.u4") |
                _("ldlen") |
                ___("ldloc.0") |
                ___("ldloc.1") |
                ___("ldloc.2") |
                ___("ldloc.3") |
                _("ldnull") |
                _("localloc") |
                _("mul") |
                ___("mul.ovf") |
                ___("mul.ovf.un") |
                _("neg") |
                _("nop") |
                _("not") |
                _("or") |
                _("pop") |
                _("refanytype") |
                _("rem") |
                ___("rem.un") |
                _("ret") |
                _("rethrow") |
                _("shl") |
                _("shr") |
                ___("shr.un") |
                ___("stelem.i") |
                ___("stelem.i1") |
                ___("stelem.i2") |
                ___("stelem.i4") |
                ___("stelem.i8") |
                ___("stelem.r4") |
                ___("stelem.r8") |
                ___("stelem.ref") |
                ___("stind.i") |
                ___("stind.i1") |
                ___("stind.i2") |
                ___("stind.i4") |
                ___("stind.i8") |
                ___("stind.r4") |
                ___("stind.r8") |
                ___("stind.ref") |
                ___("stloc.0") |
                ___("stloc.1") |
                ___("stloc.2") |
                ___("stloc.3") |
                _("sub") |
                ___("sub.ovf") |
                ___("sub.ovf.un") |
                _("tail.") |
                _("throw") |
                _("volatile.") |
                _("xor");

            INSTR_VAR.Rule =
                _("ladrg") |
                ___("ldarg.s") |
                _("ldarga") |
                ___("ldarga.s") |
                _("ldloc") |
                ___("ldloc.s") |
                _("ldloca") |
                ___("ldloca.s") |
                _("starg") |
                ___("starg.s") |
                _("stloc") |
                ___("stloc.s");

            INSTR_I.Rule =
                ___("ldc.i4") |
                ___("ldc.i4.s") |
                _("unaligned.");

            INSTR_I8.Rule =
                ___("ldc.i8");

            INSTR_R.Rule =
                ___("ldc.r4") |
                ___("ldc.r8");

            INSTR_BRTARGET.Rule =
                _("beq") |
                ___("beq.s") |
                _("bge") |
                ___("bge.s") |
                ___("bge.un") |
                ___("bge.un.s") |
                _("bgt") |
                ___("bgt.s") |
                ___("bgt.un") |
                ___("bgt.un.s") |
                _("ble") |
                ___("ble.s") |
                ___("ble.un") |
                ___("ble.un.s") |
                _("blt") |
                ___("blt.s") |
                ___("blt.un") |
                ___("blt.un.s") |
                ___("bne.un") |
                ___("bne.un.s") |
                _("br") |
                ___("br.s") |
                _("brfalse") |
                ___("brfalse.s") |
                _("brtrue") |
                ___("brtrue.s") |
                _("leave") |
                ___("leave.s");

            INSTR_METHOD.Rule =
                _("call") |
                _("callvirt") |
                _("jmp") |
                _("ldftn") |
                _("ldvirtftn") |
                _("newobj");

            INSTR_FIELD.Rule =
                _("ldfld") |
                _("ldflda") |
                _("ldsfld") |
                _("ldsflda") |
                _("stfld") |
                _("stsfld");

            INSTR_TYPE.Rule =
                _("box") |
                _("castclass") |
                _("cpobj") |
                _("initobj") |
                _("isinst") |
                _("ldelem") | // DOCS: non-present in ECMA grammar
                _("ldelema") |
                _("ldobj") |
                _("mkrefany") |
                _("newarr") |
                _("refanyval") |
                _("sizeof") |
                _("stelem") | // DOCS: non-present in ECMA grammar
                _("stobj") |
                _("unbox") |
                ___("unbox.any"); // DOCS: non-present in ECMA grammar

            INSTR_STRING.Rule =
                _("ldstr");

            INSTR_SIG.Rule = _("TODO: INSTR_SIG");

            INSTR_RVA.Rule = _("TODO: INSTR_RVA");

            INSTR_SWITCH.Rule =
                _("switch");

            INSTR_PHI.Rule = _("TODO: INSTR_PHI");

            INSTR_TOK.Rule =
                _("ldtoken");

            // rules

            Root = decls;

            decls.Rule =
                Empty |
                decls + decl;

            decl.Rule =
                classHead + _("{") + classDecls + _("}") |
                nameSpaceHead + _("{") + decls + _("}") |
                methodHead + methodDecls + _("}") |
                fieldDecl |
                dataDecl |
                vtableDecl |
                vtfixupDecl |
                extSourceSpec |
                fileDecl |
                assemblyHead + _("{") + assemblyDecls + _("}") |
                assemblyRefHead + _("{") + assemblyRefDecls + _("}") |
                comtypeHead + _("{") + comtypeDecls + _("}") |
                manifestResHead + _("{") + manifestResDecls + _("}") |
                moduleHead |
                secDecl |
                customAttrDecl |
                _(".subsystem") + int32 |
                _(".corflags") + int32 |
                _(".file") + _("alignment") + int32 |
                _(".imagebase") + int64 |
                languageDecl |
                _(".stackreserve") + int64; // DOCS: not present in ECMA grammar

            compQstring.Rule =
                QSTRING |
                compQstring + _("+") + QSTRING;

            // TODO - languageDecl
            languageDecl.Rule = _("TODO: languageDecl");

            customAttrDecl.Rule =
                _(".custom") + customType |
                _(".custom") + customType + _("=") + compQstring |
                customHead + bytes + _(")") |
                _(".custom") + _("(") + ownerType + _(")") + customType |
                _(".custom") + _("(") + ownerType + _(")") + customType + _("=") + compQstring |
                customHeadWithOwner + bytes + _(")");

            moduleHead.Rule =
                _(".module") |
                _(".module") + name1 |
                _(".module") + _("extern") + name1;

            // TODO - vtfixupDecl
            vtfixupDecl.Rule = _("TODO: vtfixupDecl");

            // TODO - vtableDecl
            vtableDecl.Rule = _("TODO: vtableDecl");

            // TODO - nameSpaceHead
            nameSpaceHead.Rule = _("TODO: nameSpaceHead");

            classHead.Rule =
                _(".class") + classAttr + id + extendsClause + implClause |
                _(".class") + classAttr + name1 + extendsClause + implClause; // DOCS: not present in ECMA grammar

            classAttr.Rule =
                Empty |
                classAttr + _("public") |
                classAttr + _("private") |
                classAttr + _("value") |
                classAttr + _("enum") |
                classAttr + _("interface") |
                classAttr + _("sealed") |
                classAttr + _("abstract") |
                classAttr + _("auto") |
                classAttr + _("sequential") |
                classAttr + _("explicit") |
                classAttr + _("ansi") |
                classAttr + _("unicode") |
                classAttr + _("autochar") |
                classAttr + _("import") |
                classAttr + _("serializable") |
                classAttr + _("nested") + _("public") |
                classAttr + _("nested") + _("private") |
                classAttr + _("nested") + _("family") |
                classAttr + _("nested") + _("assembly") |
                classAttr + _("nested") + _("famandassem") |
                classAttr + _("nested") + _("famorassem") |
                classAttr + _("beforefieldinit") |
                classAttr + _("specialname") |
                classAttr + _("rtspecialname");

            extendsClause.Rule =
                Empty |
                _("extends") + className;

            implClause.Rule =
                Empty |
                _("implements") + classNames;

            classNames.Rule =
                className + _(",") + className |
                className;

            classDecls.Rule =
                Empty |
                classDecls + classDecl;

            classDecl.Rule =
                methodHead + methodDecls + _("}") |
                classHead + _("{") + classDecls + _("}") |
                eventHead + _("{") + eventDecls + _("}") |
                propHead + _("{") + propDecls + _("}") |
                fieldDecl |
                dataDecl |
                secDecl |
                extSourceSpec |
                customAttrDecl |
                _(".size") + int32 |
                _(".pack") + int32 |
                exportHead + _("{") + comtypeDecls + _("}") |
                _(".override") + typeSpec + _("::") + methodName + _("with") + callConv + type + typeSpec + _("::") + methodName + _("(") + sigArgs0 + _(")") |
                languageDecl;

            fieldDecl.Rule =
                _(".field") + repeatOpt + fieldAttr + type + id + atOpt + initOpt;

            atOpt.Rule =
                Empty |
                _("at") + id;

            initOpt.Rule =
                Empty |
                _("=") + fieldInit;

            repeatOpt.Rule =
                Empty |
                _("[") + int32 + _("]");

            customHead.Rule =
                _(".custom") + customType + _("=") + _("(");

            customHeadWithOwner.Rule =
                _(".custom") + _("(") + ownerType + _(")") + customType + _("=") + _("(");

            memberRef.Rule =
                methodSpec + callConv + type + typeSpec + _("::") + methodName + _("(") + sigArgs0 + _(")") |
                methodSpec + callConv + type + methodName + _("(") + sigArgs0 + _(")") |
                _("field") + type + typeSpec + _("::") + id |
                _("field") + type + id;

            customType.Rule =
                callConv + type + typeSpec + _("::") + _(".ctor") + _("(") + sigArgs0 + _(")") |
                callConv + type + _(".ctor") + _("(") + sigArgs0 + _(")");

            ownerType.Rule =
                typeSpec |
                memberRef;

            // TODO - eventHead
            eventHead.Rule = _("TODO: eventHead");

            // TODO - eventDecls
            eventDecls.Rule = _("TODO: eventDecls");

            // TODO - propHead
            propHead.Rule = _("TODO: propHead");

            // TODO - propDecls
            propDecls.Rule = _("TODO: propDecls");

            methodHeadPart1.Rule =
                _(".method");

            methodHead.Rule =
                methodHeadPart1 + methAttr + callConv + paramAttr + type + methodName + _("(") + sigArgs0 + _(")") + implAttr + _("{") |
                methodHeadPart1 + methAttr + callConv + paramAttr + type + _("marshal") + _("(") + nativeType + _(")") + methodName + _("(") + sigArgs0 + _(")") + implAttr + _("{");

            methAttr.Rule =
                Empty |
                methAttr + _("static") |
                methAttr + _("public") |
                methAttr + _("private") |
                methAttr + _("family") |
                methAttr + _("final") |
                methAttr + _("specialname") |
                methAttr + _("virtual") |
                methAttr + _("abstract") |
                methAttr + _("assembly") |
                methAttr + _("famandassem") |
                methAttr + _("famorassem") |
                methAttr + _("privatescope") |
                methAttr + _("hidebysig") |
                methAttr + _("newslot") |
                methAttr + _("rtspecialname") |
                methAttr + _("unmanagedexp") |
                methAttr + _("reqsecobj") |
                methAttr + _("pinvokeimpl") + _("(") + compQstring + _("as") + compQstring + pinvAttr + _(")") |
                methAttr + _("pinvokeimpl") + _("(") + compQstring + pinvAttr + _(")") |
                methAttr + _("pinvokeimpl") + _("(") + pinvAttr + _(")");

            // TODO - pinvAttr
            pinvAttr.Rule = _("TODO: pinvAttr");

            methodName.Rule =
                _(".ctor") |
                _(".cctor") |
                name1;

            fieldAttr.Rule =
                Empty |
                fieldAttr + _("static") |
                fieldAttr + _("public") |
                fieldAttr + _("private") |
                fieldAttr + _("family") |
                fieldAttr + _("initonly") |
                fieldAttr + _("rtspecialname") |
                fieldAttr + _("specialname") |
                fieldAttr + _("pinvokeimpl") + _("(") + compQstring + _("as") + compQstring + pinvAttr + _(")") |
                fieldAttr + _("pinvokeimpl") + _("(") + compQstring + pinvAttr + _(")") |
                fieldAttr + _("pinvokeimpl") + _("(") + pinvAttr + _(")") |
                fieldAttr + _("marshal") + _("(") + nativeType + _(")") |
                fieldAttr + _("assembly") |
                fieldAttr + _("famandassem") |
                fieldAttr + _("famorassem") |
                fieldAttr + _("privatescope") |
                fieldAttr + _("literal") |
                fieldAttr + _("notserialized");

            paramAttr.Rule =
                Empty |
                paramAttr + _("[") + _("in") + _("]") |
                paramAttr + _("[") + _("out") + _("]") |
                paramAttr + _("[") + _("opt") + _("]") |
                paramAttr + _("[") + int32 + _("]");

            implAttr.Rule =
                Empty |
                implAttr + _("native") |
                implAttr + _("cil") |
                implAttr + _("optil") |
                implAttr + _("managed") |
                implAttr + _("unmanaged") |
                implAttr + _("forwardref") |
                implAttr + _("preservesig") |
                implAttr + _("runtime") |
                implAttr + _("internalcall") |
                implAttr + _("synchronized") |
                implAttr + _("noinlining");

            localsHead.Rule =
                _(".locals");

            methodDecl.Rule =
                _(".emitbyte") + int32 |
                sehBlock |
                _(".maxstack") + int32 |
                localsHead + _("(") + sigArgs0 + _(")") |
                localsHead + _("init") + _("(") + sigArgs0 + _(")") |
                _(".entrypoint") |
                _(".zeroinit") |
                dataDecl |
                instr |
                id + _(":") |
                secDecl |
                extSourceSpec |
                languageDecl |
                customAttrDecl |
                _(".export") + _("[") + int32 + _("]") |
                _(".export") + _("[") + int32 + _("]") + _("as") + id |
                _(".vtentry") + int32 + _(":") + int32 |
                _(".override") + typeSpec + _("::") + methodName |
                scopeBlock |
                _(".param") + _("[") + int32 + _("]") + initOpt;

            // TODO - scopeBlock
            scopeBlock.Rule = _("TODO: scopeBlock");

            // TODO - sehBlock
            sehBlock.Rule = _("TODO: sehBlock");

            methodDecls.Rule =
                Empty |
                methodDecls + methodDecl;

            dataDecl.Rule =
                ddHead + ddBody;

            ddHead.Rule =
                _(".data") + tls + id + _("=") |
                _(".data") + tls;

            tls.Rule =
                Empty |
                _("tls") |
                _("cil"); // DOCS: non-present in ECMA grammar

            ddBody.Rule =
                _("{") + ddItemList + _("}") |
                ddItem;

            ddItemList.Rule =
                ddItem + _(",") + ddItemList |
                ddItem;

            ddItemCount.Rule =
                Empty |
                _("[") + int32 + _("]");

            ddItem.Rule =
                _("char") + _("*") + _("(") + compQstring + _(")") |
                _("&") + _("(") + id + _(")") |
                bytearrayhead + bytes + _(")") |
                _("float32") + _("(") + float64 + _(")") + ddItemCount |
                _("float64") + _("(") + float64 + _(")") + ddItemCount |
                _("int64") + _("(") + int64 + _(")") + ddItemCount |
                _("int32") + _("(") + int32 + _(")") + ddItemCount |
                _("int16") + _("(") + int32 + _(")") + ddItemCount |
                _("int8") + _("(") + int32 + _(")") + ddItemCount |
                _("float32") + ddItemCount |
                _("float64") + ddItemCount |
                _("int64") + ddItemCount |
                _("int32") + ddItemCount |
                _("int16") + ddItemCount |
                _("int8") + ddItemCount;

            fieldInit.Rule =
                _("float32") + _("(") + float64 + _(")") |
                _("float64") + _("(") + float64 + _(")") |
                _("float32") + _("(") + int64 + _(")") |
                _("float64") + _("(") + int64 + _(")") |
                _("int64") + _("(") + int64 + _(")") |
                _("int32") + _("(") + int64 + _(")") |
                _("int16") + _("(") + int64 + _(")") |
                _("char") + _("(") + int64 + _(")") |
                _("int8") + _("(") + int64 + _(")") |
                _("uint8") + _("(") + int64 + _(")") | // DOCS: non-present in ECMA grammar
                _("bool") + _("(") + truefalse + _(")") |
                compQstring |
                bytearrayhead + bytes + _(")") |
                _("nullref");

            bytearrayhead.Rule =
                _("bytearray") + _("(");

            bytes.Rule =
                Empty |
                hexbytes;

            hexbytes.Rule =
                HEXBYTE |
                hexbytes + HEXBYTE;

            // TODO - instr_r_head
            instr_r_head.Rule = _("TODO: instr_r_head");

            instr_tok_head.Rule =
                INSTR_TOK;

            // TODO - methodSpec
            methodSpec.Rule = _("TODO: methodSpec");

            instr.Rule =
                INSTR_NONE |
                INSTR_VAR + int32 |
                INSTR_VAR + id |
                INSTR_I + int32 |
                INSTR_I8 + int64 |
                INSTR_R + float64 |
                INSTR_R + int64 |
                instr_r_head + bytes + _(")") |
                INSTR_BRTARGET + int32 |
                INSTR_BRTARGET + id |
                INSTR_METHOD + callConv + type + typeSpec + _("::") + methodName + _("(") + sigArgs0 + _(")") |
                INSTR_METHOD + callConv + type + methodName + _("(") + sigArgs0 + _(")") |
                INSTR_FIELD + type + typeSpec + _("::") + id |
                INSTR_FIELD + type + id |
                INSTR_TYPE + typeSpec |
                INSTR_STRING + compQstring |
                INSTR_STRING + bytearrayhead + bytes + _(")") |
                INSTR_SIG + callConv + type + _("(") + sigArgs0 + _(")") |
                INSTR_RVA + id |
                INSTR_RVA + int32 |
                instr_tok_head + ownerType |
                INSTR_SWITCH + _("(") + labels + _(")") |
                INSTR_PHI + int16s;

            sigArgs0.Rule =
                Empty |
                sigArgs1;

            sigArgs1.Rule =
                sigArg |
                sigArgs1 + _(",") + sigArg;

            sigArg.Rule =
                _("...") |
                paramAttr + type |
                paramAttr + type + id |
                paramAttr + type + _("marshal") + _("(") + nativeType + _(")") |
                paramAttr + type + _("marshal") + _("(") + nativeType + _(")") + id;

            name1.Rule =
                id |
                DOTTEDNAME |
                name1 + _(".") + name1;

            className.Rule =
                _("[") + name1 + _("]") + slashedName |
                _("[") + _(".module") + name1 + _("]") + slashedName |
                slashedName;

            slashedName.Rule =
                name1 |
                slashedName + _("/") + name1;

            typeSpec.Rule =
                className |
                _("[") + name1 + _("]") |
                _("[") + _(".module") + name1 + _("]") |
                type;

            callConv.Rule =
                _("instance") + callConv |
                _("explicit") + callConv |
                callKind;

            callKind.Rule =
                Empty |
                _("default") |
                _("vararg") |
                _("unmanaged") + _("cdecl") |
                _("unmanaged") + _("stdcall") |
                _("unmanaged") + _("thiscall") |
                _("unmanaged") + _("fastcall");

            // TODO - nativeType
            nativeType.Rule = _("TODO: nativeType");

            type.Rule =
                _("class") + className |
                _("object") |
                _("string") |
                _("value") + _("class") + className |
                _("valuetype") + className |
                type + _("[") + _("]") |
                type + ("[") + bounds1 + _("]") |
                type + _("value") + _("[") + int32 + _("]") |
                type + _("&") |
                type + _("*") |
                type + _("pinned") |
                type + _("modreq") + _("(") + className + _(")") |
                type + _("modopt") + _("(") + className + _(")") |
                _("!") + int32 |
                methodSpec + callConv + type + _("*") + _("(") + sigArgs0 + _(")") |
                _("typedref") |
                _("char") |
                _("void") |
                _("bool") |
                _("int8") |
                _("int16") |
                _("int32") |
                _("int64") |
                _("float32") |
                _("float64") |
                _("unsigned") + _("int8") |
                _("unsigned") + _("int16") |
                _("unsigned") + _("int32") |
                _("unsigned") + _("int64") |
                _("native") + _("int") |
                _("native") + _("unsigned") + _("int") |
                _("native") + _("float") |
                _("uint8") |  // DOCS: not present in ECMA grammar
                _("uint16") | // DOCS: not present in ECMA grammar
                _("uint32") | // DOCS: not present in ECMA grammar
                _("uint64");  // DOCS: not present in ECMA grammar

            bounds1.Rule =
                bound |
                bounds1 + _(",") + bound;

            bound.Rule =
                Empty |
                _("...") |
                int32 |
                int32 + _("...") + int32 |
                int32 + _("...");

            labels.Rule =
                Empty |
                id + _(",") + labels |
                int32 + _(",") + labels |
                id |
                int32;

            id.Rule =
                ID |
                SQSTRING;

            // TODO - int16s
            int16s.Rule = _("TODO: int16s");

            int32.Rule =
                INT32;

            int64.Rule =
                INT64;

            float64.Rule =
                FLOAT64 |
                _("float32") + _("(") + int32 + _(")") |
                _("float64") + _("(") + int64 + _(")");

            secDecl.Rule =
                _(".permission") + secAction + typeSpec + _("(") + nameValPairs + _(")") |
                _(".permission") + secAction + typeSpec |
                psetHead + bytes + _(")") |
                _(".permissionset") + secAction + _("=") + _("{") + nameValPairs + _("}"); // DOCS: non-present in ECMA script

            psetHead.Rule =
                _(".permissionset") + secAction + _("=") + _("(");

            nameValPairs.Rule =
                nameValPair |
                nameValPair + _(",") + nameValPairs;

            nameValPair.Rule =
                compQstring + _("=") + caValue |
                className + _("=") + caValue; // DOCS: non-present in ECMA script

            truefalse.Rule =
                _("true") |
                _("false");

            caValue.Rule =
                truefalse |
                int32 |
                _("int32") + ("(") + int32 + _(")") |
                compQstring |
                className + _("(") + _("int8") + _(":") + int32 + _(")") |
                className + _("(") + _("int16") + _(":") + int32 + _(")") |
                className + _("(") + _("int32") + _(":") + int32 + _(")") |
                className + _("(") + int32 + _(")") |
                _("{") + _("property") + _("bool") + SQSTRING + _("=") + _("bool") + _("(") + _("true") + _(")") + _("}"); // DOCS: non-present in ECMA script

            secAction.Rule =
                _("request") |
                _("demand") |
                _("assert") |
                _("deny") |
                _("permitonly") |
                _("linkcheck") |
                _("inheritcheck") |
                _("reqmin") |
                _("reqopt") |
                _("reqrefuse") |
                _("prejitgrant") |
                _("prejitdeny") |
                _("noncasdemand") |
                _("noncaslinkdemand") |
                _("noncasinheritance");

            // TODO - extSourceSpec
            extSourceSpec.Rule = _("TODO: extSourceSpec");

            // TODO - fileDecl
            fileDecl.Rule = _("TODO: fileDecl");

            // TODO - hashHead
            hashHead.Rule = _("TODO: hashHead");

            assemblyHead.Rule =
                _(".assembly") + asmAttr + name1;

            asmAttr.Rule =
                Empty |
                asmAttr + _("noappdomain") |
                asmAttr + _("noprocess") |
                asmAttr + _("nomachine");

            assemblyDecls.Rule =
                Empty |
                assemblyDecls + assemblyDecl;

            assemblyDecl.Rule =
                _(".hash") + _("algorithm") + int32 |
                secDecl |
                asmOrRefDecl;

            asmOrRefDecl.Rule =
                publicKeyHead + bytes + _(")") |
                _(".ver") + int32 + _(":") + int32 + _(":") + int32 + _(":") + int32 |
                _(".locale") + compQstring |
                localeHead + bytes + _(")") |
                customAttrDecl;

            // TODO - publicKeyHead
            publicKeyHead.Rule = _("TODO: publicKeyHead");

            publicKeyTokenHead.Rule =
                _(".publickeytoken") + _("=") + _("(");

            // TODO - localeHead
            localeHead.Rule = _("TODO: localeHead");

            assemblyRefHead.Rule =
                _(".assembly") + _("extern") + name1 |
                _(".assembly") + _("extern") + name1 + _("as") + name1;

            assemblyRefDecls.Rule =
                Empty |
                assemblyRefDecls + assemblyRefDecl;

            assemblyRefDecl.Rule =
                hashHead + bytes + _(")") |
                asmOrRefDecl |
                publicKeyTokenHead + bytes + _(")");

            // TODO - comtypeHead
            comtypeHead.Rule = _("TODO: comtypeHead");

            // TODO - exportHead
            exportHead.Rule = _("TODO: exportHead");

            // TODO - comtypeDecls
            comtypeDecls.Rule = _("TODO: comtypeDecls");

            manifestResHead.Rule =
                _(".mresource") + manresAttr + name1;

            manresAttr.Rule =
                Empty |
                manresAttr + _("public") |
                manresAttr + _("private");

            manifestResDecls.Rule =
                Empty |
                manifestResDecls + manifestResDecl;

            manifestResDecl.Rule =
                _(".file") + name1 + _("at") + int32 |
                _(".assembly") + _("extern") + name1 |
                customAttrDecl;
        }
Esempio n. 30
0
 //http://docs.python.org/ref/numbers.html
 public static NumberLiteral CreatePythonNumber(string name) {
   NumberLiteral term = new NumberLiteral(name, NumberOptions.AllowStartEndDot);
   //default int types are Integer (32bit) -> LongInteger (BigInt); Try Int64 before BigInt: Better performance?
   term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
   // term.DefaultFloatType = TypeCode.Double; -- it is default
   //float type is implementation specific, thus try decimal first (higher precision)
   //term.DefaultFloatTypes = new TypeCode[] { TypeCode.Decimal, TypeCode.Double };
   term.AddPrefix("0x", NumberOptions.Hex);
   term.AddPrefix("0", NumberOptions.Octal);
   term.AddSuffix("L", TypeCode.Int64, NumberLiteral.TypeCodeBigInt);
   term.AddSuffix("J", NumberLiteral.TypeCodeImaginary);
   return term;
 }
Esempio n. 31
0
        public CovfefeGrammar() : base(false) // true means case sensitive
        {
            GrammarComments = @"A Fantastic Language. Case-insensitive.";

            //comments
            CommentTerminal eolComment = new CommentTerminal("eolComment", "//", "\n", "\r");

            NonGrammarTerminals.Add(eolComment);

            //numbers
            NumberLiteral integer = new NumberLiteral("integer", NumberOptions.IntOnly | NumberOptions.AllowSign, typeof(IntegerAstNode));

            integer.DefaultIntTypes = new TypeCode[] { TypeCode.Int32 };
            integer.AddPrefix("0b", NumberOptions.Binary);
            integer.AddPrefix("0x", NumberOptions.Hex);

            //identifier
            IdentifierTerminal label_terminal = new IdentifierTerminal("label_terminal");

            //keywords
            KeyTerm TRIGGER     = ToTerm("trigger");
            KeyTerm OPENBRACE   = ToTerm("{");
            KeyTerm CLOSEBRACE  = ToTerm("}");
            KeyTerm CUCK        = ToTerm("cuck");
            KeyTerm GRAB        = ToTerm("grab");
            KeyTerm ASSIGNOR    = ToTerm("=");
            KeyTerm ADD         = ToTerm("+++");
            KeyTerm SUB         = ToTerm("---");
            KeyTerm BING        = ToTerm("bing");
            KeyTerm BONG        = ToTerm("bong");
            KeyTerm SHITPOST    = ToTerm("shitpost");
            KeyTerm BTFO        = ToTerm("btfo");
            KeyTerm YERFIRED    = ToTerm("yerfired");
            KeyTerm IF          = ToTerm("if");
            KeyTerm OPENPAREN   = ToTerm("(");
            KeyTerm CLOSEPAREN  = ToTerm(")");
            KeyTerm EQUALS      = ToTerm("==");
            KeyTerm CATERPILLAR = ToTerm("caterpillar");
            KeyTerm IMPORT      = ToTerm("import");



            //label
            NonTerminal label = new NonTerminal("label", typeof(LabelAstNode));

            label.Rule = label_terminal;

            //labels
            NonTerminal labels = new NonTerminal("labels");

            labels.Rule = MakeStarRule(labels, "," + label);

            //operators
            NonTerminal @operator = new NonTerminal("operator", typeof(OperatorAstNode));

            @operator.Rule = ADD | SUB;

            //lValue
            NonTerminal lValue = new NonTerminal("lValue", typeof(LValueAstNode));

            lValue.Rule = (label | integer) | ((label | integer) + @operator + (label | integer));

            //lValues
            NonTerminal lValues = new NonTerminal("lValues");

            lValues.Rule = MakeStarRule(lValues, "," + lValue);

            //assignment
            NonTerminal assignment = new NonTerminal("assignment", typeof(AssignmentAstNode));

            assignment.Rule = label + ASSIGNOR + lValue;

            //cuck
            NonTerminal cuck = new NonTerminal("cuck", typeof(CuckAstNode));

            cuck.Rule = CUCK + label + (ASSIGNOR + lValue | Empty);

            //pop
            NonTerminal pop = new NonTerminal("grab", typeof(GrabAstNode));

            pop.Rule = GRAB + label;

            //bing
            NonTerminal bing = new NonTerminal("bing", typeof(BingAstNode));

            bing.Rule = BING + label;

            //bong
            NonTerminal bong = new NonTerminal("bong", typeof(BongAstNode));

            bong.Rule = BONG + label;

            //shitpost
            NonTerminal shitpost = new NonTerminal("shitpost", typeof(ShitPostAstNode));

            //shitpost.Rule = SHITPOST + ((OPENPAREN + lValue + CLOSEPAREN) | Empty);
            shitpost.Rule = SHITPOST + OPENPAREN + lValue + CLOSEPAREN;

            //btfo
            NonTerminal btfo = new NonTerminal("btfo", typeof(BtfoAstNode));

            btfo.Rule = BTFO + ((OPENPAREN + lValue + CLOSEPAREN) | Empty);

            //yerfired
            NonTerminal yerfired = new NonTerminal("yerfired", typeof(YerFiredAstNode));

            yerfired.Rule = YERFIRED;

            //statements
            NonTerminal statements = new NonTerminal("statements");

            //test
            NonTerminal test = new NonTerminal("test", typeof(TestAstNode));

            @test.Rule = EQUALS;

            //if
            NonTerminal @if = new NonTerminal("if", typeof(IfAstNode));

            @if.Rule = IF + OPENPAREN + lValue + test + lValue + CLOSEPAREN + OPENBRACE + statements + CLOSEBRACE;

            //caterpillar
            NonTerminal caterpillar = new NonTerminal("caterpillar", typeof(CaterpillarAstNode));

            caterpillar.Rule = CATERPILLAR + OPENBRACE + statements + CLOSEBRACE;

            //arguments
            NonTerminal arguments = new NonTerminal("arguments", typeof(ArgumentsAstNode));

            arguments.Rule = (lValue | Empty) + lValues;

            //call
            NonTerminal call = new NonTerminal("call", typeof(CallAstNode));

            call.Rule = label + OPENPAREN + arguments + CLOSEPAREN;

            //statement
            NonTerminal statement = new NonTerminal("statement", typeof(StatementAstNode));

            statement.Rule = cuck | assignment | bing | bong | shitpost | btfo | yerfired | @if | caterpillar | call | pop;

            //build statements rule last to include blocks
            statements.Rule = MakeStarRule(statements, statement);

            //parameters
            NonTerminal parameters = new NonTerminal("parameters", typeof(ParametersAstNode));

            parameters.Rule = (label | Empty) + labels;

            //trigger
            NonTerminal trigger = new NonTerminal("trigger", typeof(TriggerAstNode));

            trigger.Rule = TRIGGER + label + OPENPAREN + parameters + CLOSEPAREN + OPENBRACE + (statements) + CLOSEBRACE;

            //triggers
            NonTerminal triggers = new NonTerminal("triggers");

            triggers.Rule = MakeStarRule(triggers, trigger);

            /*
             * //import
             * NonTerminal import = new NonTerminal("import", typeof(ImportAstNode));
             * import.Rule = IMPORT + label + OPENPAREN + parameters + CLOSEPAREN;
             *
             * //imports
             * NonTerminal imports = new NonTerminal("imports");
             * imports.Rule = MakeStarRule(imports, import);
             */

            //file structure
            NonTerminal source_file = new NonTerminal("source_file", typeof(SourceFileAstNode));

            source_file.Rule = triggers;

            Root = source_file;

            LanguageFlags |= LanguageFlags.CreateAst;
        }
        public PCodeGrammar()
            : base(false)
        {
            // ReSharper disable InconsistentNaming
            this.LanguageFlags = LanguageFlags.NewLineBeforeEOF;

            var integerLiteral = new NumberLiteral("INTEGER");

            integerLiteral.Options        |= NumberOptions.IntOnly;
            integerLiteral.DefaultIntTypes = new[]
            {
                TypeCode.Int64
            };
            integerLiteral.AddPrefix("0x", NumberOptions.Hex);

            var floatLiteral = new NumberLiteral("FLOAT")
            {
                DefaultIntTypes = new[]
                {
                    TypeCode.Double
                },
            };

            var stringLiteral = new StringLiteral("STRING",
                                                  "\"",
                                                  StringOptions.AllowsLineBreak |
                                                  StringOptions.AllowsOctalEscapes |
                                                  StringOptions.AllowsXEscapes);

            var name = new IdentifierTerminal("NAME", IdOptions.IsNotKeyword);

            var comment = new CommentTerminal("comment", "#", "\n");

            var comma = ToTerm(",", "comma");
            var colon = ToTerm(":", "colon");

            var staticLiteral = new NonTerminal("STATIC")
            {
                Rule = this.ToTerm("Activation") | "AdjustLevel" | "Application" |
                       "ClickableTracker" | "Contact" | "Context" | "CurNode" |
                       "CurrentState" | "curStateTracker" | "dependencyVal" |
                       "Encounter" | "Encounter2" | "EncounterDef" | "EncounterTemplate" |
                       "Entity" | "Forever" | "GenData" | "GenInstanceColumn" |
                       "GenInstanceColumnCount" | "GenInstanceCount" | "GenInstanceData" |
                       "GenInstanceNumber" | "GenInstanceRow" | "GenInstanceRowCount" |
                       "HP" | "HPMax" | "iLevelINTERNAL_LayerFSM" | "IsDisabled" |
                       "IsSelectable" | "IsVisible" | "me" | "Mission" |
                       "MissionClickable" | "MissionDef" | "Mod" | "ModDef" | "MouseX" |
                       "MouseY" | "MouseZ" | "NewTreeLevel" | "NumTeamMembers" |
                       "ParentValue" | "pathOldValue" | "Player" | "Power" | "PowerDef" |
                       "PowerMax" | "PowerVolumeData" | "Prediction" | "RowData" |
                       "Self" | "Source" | "SpawnLocation" | "TableValue" | "Target" |
                       "TargetEnt" | "TeamHP" | "TeamHPMax" | "Volume",
            };

            var PROGRAM   = new NonTerminal("PROGRAM");
            var LINE      = new NonTerminal("LINE");
            var STATEMENT = new NonTerminal("STATEMENT");
            var VALUE     = new NonTerminal("VALUE");
            var LABEL     = new NonTerminal("LABEL");

            var LABEL_OPT     = new NonTerminal("LABEL_OPT");
            var STATEMENT_OPT = new NonTerminal("STATEMENT_OPT");
            var COMMENT_OPT   = new NonTerminal("COMMENT_OPT");

            var BINARY = new NonTerminal("BINARY");

            var OP_NON = new NonTerminal("OP_NON");
            var OP_INT = new NonTerminal("OP_INT");
            var OP_FLT = new NonTerminal("OP_FLT");
            var OP_INS = new NonTerminal("OP_INS");
            var OP_FLS = new NonTerminal("OP_FLS");
            var OP_VEC = new NonTerminal("OP_VEC");
            var OP_VC4 = new NonTerminal("OP_VC4");
            var OP_MAT = new NonTerminal("OP_MAT");
            var OP_QAT = new NonTerminal("OP_QAT");
            var OP_STR = new NonTerminal("OP_STR");
            var OP_FIL = new NonTerminal("OP_FIL");
            var OP_ENT = new NonTerminal("OP_ENT");

            var OP_PTR = new NonTerminal("OP_PTR");
            var OP_ADD = new NonTerminal("OP_ADD");
            var OP_SUB = new NonTerminal("OP_SUB");
            var OP_NEG = new NonTerminal("OP_NEG");
            var OP_MUL = new NonTerminal("OP_MUL");
            var OP_DIV = new NonTerminal("OP_DIV");
            var OP_EXP = new NonTerminal("OP_EXP");
            var OP_BAN = new NonTerminal("OP_BAN");
            var OP_BOR = new NonTerminal("OP_BOR");
            var OP_BNT = new NonTerminal("OP_BNT");
            var OP_BXR = new NonTerminal("OP_BXR");
            var OP_O_P = new NonTerminal("OP_O_P");
            var OP_C_P = new NonTerminal("OP_C_P");
            var OP_O_B = new NonTerminal("OP_O_B");
            var OP_C_B = new NonTerminal("OP_C_B");
            var OP_EQU = new NonTerminal("OP_EQU");
            var OP_LES = new NonTerminal("OP_LES");
            var OP_NGR = new NonTerminal("OP_NGR");
            var OP_GRE = new NonTerminal("OP_GRE");
            var OP_NLE = new NonTerminal("OP_NLE");
            var OP_FUN = new NonTerminal("OP_FUN");
            var OP_IDS = new NonTerminal("OP_IDS");
            var OP_S_V = new NonTerminal("OP_S_V");
            var OP_COM = new NonTerminal("OP_COM");
            var OP_AND = new NonTerminal("OP_AND");
            var OP_ORR = new NonTerminal("OP_ORR");
            var OP_NOT = new NonTerminal("OP_NOT");
            var OP_IF_ = new NonTerminal("OP_IF_");
            var OP_ELS = new NonTerminal("OP_ELS");
            var OP_ELF = new NonTerminal("OP_ELF");
            var OP_EIF = new NonTerminal("OP_EIF");
            var OP_RET = new NonTerminal("OP_RET");
            var OP_RZ_ = new NonTerminal("OP_RZ_");
            var OP_J__ = new NonTerminal("OP_J__");
            var OP_JZ_ = new NonTerminal("OP_JZ_");
            var OP_CON = new NonTerminal("OP_CON");
            var OP_STM = new NonTerminal("OP_STM");
            var OP_RP_ = new NonTerminal("OP_RP_");
            var OP_OBJ = new NonTerminal("OP_OBJ");
            var OP_L_M = new NonTerminal("OP_L_M");
            var OP_L_S = new NonTerminal("OP_L_S");

            this.Root = PROGRAM;

            VALUE.Rule = integerLiteral | stringLiteral;

            PROGRAM.Rule = MakePlusRule(PROGRAM, LINE);
            LINE.Rule    = LABEL_OPT + STATEMENT_OPT + COMMENT_OPT + NewLine;

            LABEL_OPT.Rule     = LABEL | Empty;
            STATEMENT_OPT.Rule = STATEMENT | Empty;
            COMMENT_OPT.Rule   = comment | Empty;

            STATEMENT.Rule =
                OP_NON | OP_INT | OP_FLT |
                OP_INS | OP_FLS |
                OP_VEC | OP_VC4 |
                /*OP_MAT | OP_QAT |*/
                OP_STR | /*OP_FIL |*/
                /*OP_ENT | OP_PTR |*/
                OP_ADD | OP_SUB | OP_NEG | OP_MUL | OP_DIV | OP_EXP |
                OP_BAN | OP_BOR | OP_BNT | OP_BXR |
                OP_O_P | OP_C_P |
                OP_O_B | OP_C_B |
                OP_EQU | OP_LES | OP_NGR | OP_GRE | OP_NLE |
                OP_FUN |
                OP_IDS | OP_S_V |
                OP_COM |
                OP_AND | OP_ORR | OP_NOT |
                OP_IF_ | OP_ELS | OP_ELF | OP_EIF |
                OP_RET | OP_RZ_ |
                OP_J__ | OP_JZ_ |
                OP_CON |
                OP_STM |
                OP_RP_ |
                OP_OBJ |
                OP_L_M | OP_L_S;

            LABEL.Rule = name + ":";

            BINARY.Rule = "binary";

            OP_NON.Rule = "null";
            OP_INT.Rule = "int" + integerLiteral;
            OP_FLT.Rule = "float" + floatLiteral;
            OP_INS.Rule = "ints" + stringLiteral;   // todo: fixme
            OP_FLS.Rule = "floats" + stringLiteral; // todo: fixme
            OP_VEC.Rule = "vec3" + stringLiteral;   // todo: fixme
            OP_VC4.Rule = "vec4" + stringLiteral;   // todo: fixme
            OP_STR.Rule = "str" + stringLiteral;

            OP_ADD.Rule = "add";
            OP_SUB.Rule = "sub";
            OP_NEG.Rule = "neg";
            OP_MUL.Rule = "mul";
            OP_DIV.Rule = "div";
            OP_EXP.Rule = "exp";
            OP_BAN.Rule = BINARY + "and";
            OP_BOR.Rule = BINARY + "or";
            OP_BNT.Rule = BINARY + "not";
            OP_BXR.Rule = BINARY + "xor";
            OP_O_P.Rule = "(";
            OP_C_P.Rule = ")";
            OP_O_B.Rule = "[";
            OP_C_B.Rule = "]";
            OP_EQU.Rule = "equals";
            OP_LES.Rule = "less";
            OP_NGR.Rule = "notgreater";
            OP_GRE.Rule = "greater";
            OP_NLE.Rule = "notless";
            OP_FUN.Rule = "call" + stringLiteral;
            OP_IDS.Rule = "ident" + stringLiteral;
            OP_S_V.Rule = "static" + staticLiteral;
            OP_COM.Rule = "comma";
            OP_AND.Rule = "and";
            OP_ORR.Rule = "or";
            OP_NOT.Rule = "not";
            OP_IF_.Rule = "if";
            OP_ELS.Rule = "else";
            OP_ELF.Rule = "elif";
            OP_EIF.Rule = "endif";
            OP_RET.Rule = "return";
            OP_RZ_.Rule = "retifzero";
            OP_J__.Rule = "j" + name;
            OP_JZ_.Rule = "jz" + name;
            OP_CON.Rule = "continue";
            OP_STM.Rule = ";";
            OP_RP_.Rule = "rootpath" + stringLiteral;
            OP_OBJ.Rule = "objpath" + stringLiteral;
            OP_L_M.Rule = "locm" + stringLiteral; // todo: fixme
            OP_L_S.Rule = "locs" + stringLiteral; // todo: fixme

            this.MarkPunctuation(",", ":");
            this.MarkTransient(
                VALUE,
                LABEL_OPT,
                STATEMENT_OPT,
                COMMENT_OPT,
                staticLiteral);
            // ReSharper restore InconsistentNaming
        }
        public UnrealscriptGrammar() : base(false)
        {
            #region Identifiers
            var Identifier = new IdentifierTerminal("Identifer");
            #endregion

            #region Literals
            // Number
            var Number = new NumberLiteral("Number", NumberOptions.AllowSign)
            {
                DefaultIntTypes  = new[] { TypeCode.Int32 },
                DefaultFloatType = TypeCode.Single
            };
            Number.AddPrefix("0x", NumberOptions.Hex);
            // Integer
            var Integer = new NumberLiteral("Integer", NumberOptions.IntOnly);
            // String
            var String = new StringLiteral("String", "\"", StringOptions.None);
            // Name
            var Name = new StringLiteral("Name", "'");
            // Vector
            var VectKeyTerm = ToTerm("vect");
            var Vector      = new NonTerminal("Vector", typeof(VectorNode));
            Vector.Rule = VectKeyTerm + "(" + Number + "," + Number + "," + Number + ")";

            var Literal = new NonTerminal("Literal");
            Literal.Rule = Number | String | Name | "true" | "false" | "none" | Vector;
            #endregion

            var VarEdit = new NonTerminal("VarEdit", typeof(AuxiliaryNode));
            VarEdit.Rule = "(" + Identifier + ")" |
                           "(" + ")";
            var VarEditOpt = new NonTerminal("VarEdit?", typeof(AuxiliaryNode));
            VarEditOpt.Rule = Empty | VarEdit;

            var Extends = new NonTerminal("Extends", typeof(AuxiliaryNode));
            Extends.Rule = ToTerm("extends") + Identifier;
            var ExtendsOpt = Extends.Q();

            var CompilerDirective = new RegexBasedTerminal("#(\\w+)\\s+(.+)");

            #region Variables
            var VarModifier = new NonTerminal("VarModifier", typeof(Modifier));
            VarModifier.Rule = ToTerm("config") |
                               ToTerm("const") |
                               ToTerm("editconst") |
                               ToTerm("editconstarray") |
                               ToTerm("editinline") |
                               ToTerm("export") |
                               ToTerm("noexport") |
                               ToTerm("globalconfig") |
                               ToTerm("input") |
                               ToTerm("localized") |
                               ToTerm("native") |
                               ToTerm("private") |
                               ToTerm("protected") |
                               ToTerm("transient") |
                               ToTerm("travel");

            var VarModifiers = new NonTerminal("VarModifier*", typeof(AuxiliaryNode));
            VarModifiers.Rule = MakeStarRule(VarModifiers, VarModifier);
            #endregion

            #region Comments
            var SingleLineComment = new CommentTerminal("SingleLineComment", "//", "\n");
            var MultiLineComment  = new CommentTerminal("MultiLineComment", "/*", "*/");
            NonGrammarTerminals.Add(SingleLineComment);
            NonGrammarTerminals.Add(MultiLineComment);
            #endregion

            var Identifiers = new NonTerminal("Identifiers", typeof(AuxiliaryNode));
            Identifiers.Rule = MakePlusRule(Identifiers, ToTerm(","), Identifier);

            var Const = new NonTerminal("Const", typeof(Const));
            Const.Rule = ToTerm("const") + Identifier + "=" + Literal + ";";

            var PreClassDeclaration = new NonTerminal("PreClassDeclaration");
            PreClassDeclaration.Rule = Const;

            var Declarations = new NonTerminal("PreClassDeclaration*", typeof(AuxiliaryNode));
            Declarations.Rule = MakeStarRule(Declarations, PreClassDeclaration);

            #region Types
            var ByteTerm   = ToTerm("byte");
            var IntTerm    = ToTerm("int");
            var BoolTerm   = ToTerm("bool");
            var FloatTerm  = ToTerm("float");
            var StringTerm = ToTerm("string");
            var NameTerm   = ToTerm("name");
            var Type       = new NonTerminal("Type", typeof(Ast.Type));

            var Array = new NonTerminal("Array", typeof(Ast.Array));
            Array.Rule = ToTerm("array") + "<" + Type + ">";

            var Class = new NonTerminal("Class", typeof(Ast.Class));
            Class.Rule = ToTerm("class") + "<" + Identifier + ">";  // TODO: won't work for A.Type

            var PackageIdentifier = new NonTerminal("PackageIdentifier");
            PackageIdentifier.Rule = Identifier + "." + Identifier;

            Type.Rule = ByteTerm | IntTerm | BoolTerm | FloatTerm | StringTerm | NameTerm | Array | Class | Identifier | PackageIdentifier;
            #endregion

            var ArraySize = new NonTerminal("ArraySize", typeof(AuxiliaryNode));
            ArraySize.Rule = Empty |
                             "[" + Integer + "]" |
                             "[" + Identifier + "]";


            #region Struct
            var StructVarEdit = new NonTerminal("StructVarEdit");
            StructVarEdit.Rule = Empty | "(" + ")";

            var StructVar = new NonTerminal("StructVar", typeof(Variable));
            StructVar.Rule = ToTerm("var") + StructVarEdit + Type + Identifier + ArraySize + ";";

            var StructVars = new NonTerminal("StructVar+");
            StructVars.Rule = MakePlusRule(StructVars, StructVar);

            var Struct = new NonTerminal("Struct", typeof(Struct));
            Struct.Rule = ToTerm("struct") + Identifier + "{" + StructVars + "}";

            var StructStatement = new NonTerminal("StructStatement", typeof(AuxiliaryNode));
            StructStatement.Rule = Struct + ";";
            #endregion

            // Enum
            var EnumTerm = ToTerm("enum");
            var Enum     = new NonTerminal("Enum", typeof(Ast.Enum));
            Enum.Rule = EnumTerm + Identifier + "{" + Identifiers + "}";

            var EnumStatement = new NonTerminal("EnumStatement", typeof(AuxiliaryNode));
            EnumStatement.Rule = Enum + ";";

            #region Variables
            // Variables
            var VarType  = new NonTerminal("VarType");
            var VarName  = new NonTerminal("VarName", typeof(VariableName));
            var VarNames = new NonTerminal("VarName+", typeof(AuxiliaryNode));
            var Var      = new NonTerminal("Var", typeof(Variable));
            var Vars     = new NonTerminal("Var*", typeof(AuxiliaryNode));

            VarType.Rule  = Type | Struct | Enum;
            VarName.Rule  = Identifier + ArraySize;
            VarNames.Rule = MakePlusRule(VarNames, ToTerm(","), VarName);
            Var.Rule      = ToTerm("var") + VarEditOpt + VarModifiers + VarType + VarNames + ";";
            Vars.Rule     = MakeStarRule(Vars, Var);
            #endregion

            var VarStructEnumConst = new NonTerminal("VarStructEnumConst");
            VarStructEnumConst.Rule = Var | StructStatement | EnumStatement | Const;

            var PreFunctionDeclarations = new NonTerminal("VarStructEnumConst*", typeof(AuxiliaryNode));
            PreFunctionDeclarations.Rule = MakeStarRule(PreFunctionDeclarations, VarStructEnumConst);

            // MEAT OF THE LOGIC!
            var Reference = new NonTerminal("Reference");   // TODO: probably won't work, my guess
            Reference.Rule = Identifier + Name |
                             ToTerm("class") + Name;

            var Allocation = new NonTerminal("Allocation");
            Allocation.Rule = ToTerm("new") + Reference;

            var Atom = new NonTerminal("Atom");
            Atom.Rule = Identifier | Literal | Reference | Class | Allocation;

            var Primary = new NonTerminal("Primary");

            var ExpressionParen = new NonTerminal("ExpressionParen");
            var Expression      = new NonTerminal("Expression");
            Expression.Rule      = Primary | ExpressionParen;
            ExpressionParen.Rule = "(" + Expression + ")";

            var Default = new NonTerminal("Default");
            Default.Rule = ToTerm("default") + "." + Identifier;

            var Subscription = new NonTerminal("Subscription");
            Subscription.Rule = Primary + "[" + Expression + "]";

            var Arguments = new NonTerminal("Argument*");
            Arguments.Rule = MakeStarRule(Arguments, ToTerm(","), Expression.Q());

            var Call = new NonTerminal("Call");
            Call.Rule = Identifier + "(" + Arguments + ")" |
                        Class + "(" + Arguments + ")";  // TODO: what's this one for?

            var SuperCall = new NonTerminal("SuperCall");
            SuperCall.Rule = ToTerm("super") + "." + Call |
                             ToTerm("super") + "(" + Identifier + ")" + "." + Call;

            var StaticCall = new NonTerminal("StaticCall");
            StaticCall.Rule = Primary + "." + ToTerm("static") + "." + Call |
                              ToTerm("static") + "." + Call;

            var GlobalCall = new NonTerminal("GlobalCall");
            GlobalCall.Rule = ToTerm("global") + "." + Call;

            var PreUnaryOperator  = new NonTerminal("PreUnaryOperator", ToTerm("-") | ToTerm("!") | ToTerm("++") | ToTerm("--") | ToTerm("^"));
            var PostUnaryOperator = new NonTerminal("PostUnaryOperator", ToTerm("++") | ToTerm("--"));

            var UnaryOp = new NonTerminal("UnaryOp");
            UnaryOp.Rule = PreUnaryOperator + Expression |
                           Expression + PostUnaryOperator;

            var BinaryOperator = new NonTerminal("BinaryOperator");
            BinaryOperator.Rule = ToTerm("==") |
                                  ToTerm("!=") |
                                  ToTerm("<=") |
                                  ToTerm(">=") |
                                  ToTerm("~=") |
                                  ToTerm("%") |
                                  ToTerm("*") |
                                  ToTerm("/") |
                                  ToTerm("+") |
                                  ToTerm("-") |
                                  ToTerm("<") |
                                  ToTerm(">") |
                                  ToTerm("$") |
                                  ToTerm("@") |
                                  ToTerm("||") |
                                  ToTerm("+=") |
                                  ToTerm("-=") |
                                  ToTerm("*=") |
                                  ToTerm("/=") |
                                  ToTerm("dot") |
                                  ToTerm("&&") |
                                  ToTerm(">>") |
                                  ToTerm("<<") |
                                  ToTerm("<<<") |
                                  ToTerm(">>>") |
                                  ToTerm("**") |
                                  ToTerm("cross") |
                                  ToTerm("&") |
                                  ToTerm("|") |
                                  ToTerm("^") |
                                  ToTerm("^^");

            var AssignmentOperator = new NonTerminal("AssignmentOperator");
            AssignmentOperator.Rule = ToTerm("=") | ToTerm("$=") | ToTerm("@=");

            var Target    = new NonTerminal("Target");
            var Attribute = new NonTerminal("Attribute");
            Target.Rule = Identifier | Attribute | Default | Subscription;

            var Assignment = new NonTerminal("Assignment");
            Assignment.Rule = Target + AssignmentOperator + Expression;

            var BinaryOp = new NonTerminal("BinaryOp", Expression + BinaryOperator + Expression);

            Primary.Rule = Atom | Attribute | Default | Subscription | SuperCall | StaticCall | GlobalCall | Call | UnaryOp | BinaryOp | ExpressionParen;

            Attribute.Rule = Primary + "." + Primary;

            var Return = new NonTerminal("Return");
            Return.Rule = ToTerm("return") + Expression.Q();

            var SimpleStatement = new NonTerminal("SimpleStatement");
            SimpleStatement.Rule = Return | ToTerm("break") | ToTerm("continue") | Assignment /*| Goto*/ | Expression;

            var SimpleStatements = new NonTerminal("SimpleStatements");
            SimpleStatements.Rule = MakeStarRule(SimpleStatements, ToTerm(","), SimpleStatement);

            var Codeline = new NonTerminal("Codeline");
            Codeline.Rule = SimpleStatement + ";";

            var Statement         = new NonTerminal("Statement");
            var CompoundStatement = new NonTerminal("CompoundStatement");
            Statement.Rule = Codeline | Const | CompoundStatement /* | Label*/;

            var Statements = new NonTerminal("Statements");
            Statements.Rule = MakeStarRule(Statements, Statement);

            var For = new NonTerminal("For");
            For.Rule = ToTerm("for") + "(" + SimpleStatements + ";" + Expression.Q() + ";" + SimpleStatement + ")" + "{" + Statements + "}" |
                       ToTerm("for") + "(" + SimpleStatements + ";" + Expression.Q() + ";" + SimpleStatement + ")" + Statement;

            var ForEach = new NonTerminal("ForEeach");
            ForEach.Rule = ToTerm("foreach") + Primary + Statement |
                           ToTerm("foreach") + Primary + "{" + Statements + "}";

            var Until = new NonTerminal("Until");
            Until.Rule = ToTerm("until") + "(" + Expression + ")" + ToTerm(";").Q();

            var Do = new NonTerminal("Do");
            Do.Rule = ToTerm("do") + "{" + Statements + "}" + Until.Q();

            var While = new NonTerminal("While");
            While.Rule = ToTerm("while") + "(" + Expression + ")" + Statement |
                         ToTerm("while") + "(" + Expression + ")" + "{" + Statements + "}";

            var ElseIf = new NonTerminal("ElseIf");
            ElseIf.Rule = ToTerm("else") + ToTerm("if") + "(" + Expression + ")" + Statement |
                          ToTerm("else") + ToTerm("if") + "(" + Expression + ")" + "{" + Statements + "}";

            var ElseIfs = new NonTerminal("ElseIf*");
            ElseIf.Rule = MakeStarRule(ElseIfs, ElseIf);

            var Else = new NonTerminal("Else");
            Else.Rule = ToTerm("else") + Statement |
                        ToTerm("else") + "{" + Statements + "}";

            var If = new NonTerminal("If");
            If.Rule = ToTerm("if") + "(" + Expression + ")" + Statement + ElseIfs + Else.Q() |
                      ToTerm("if") + "(" + Expression + ")" + "{" + Statements + "}" + ElseIfs + Else.Q();

            var DefaultCaseLabel = new RegexBasedTerminal("default\\s*:");

            var SwitchCase = new NonTerminal("SwitchCase");
            SwitchCase.Rule = ToTerm("case") + Atom + ":" + Statements |
                              DefaultCaseLabel + Statements;

            var SwitchCases = new NonTerminal("SwitchCase*");
            SwitchCases.Rule = MakeStarRule(SwitchCases, SwitchCase);

            var Switch = new NonTerminal("Switch");
            Switch.Rule = ToTerm("switch") + "(" + Expression + ")" + "{" + SwitchCases + "}";

            CompoundStatement.Rule = For | ForEach | While | If | Switch | Do;

            #region Functions
            var Local = new NonTerminal("Local", typeof(Local));
            Local.Rule = ToTerm("local") + Type + VarNames + ";";

            var Locals = new NonTerminal("Local*", typeof(AuxiliaryNode));
            Locals.Rule = MakeStarRule(Locals, Local);

            var Ignores = new NonTerminal("Ignores", typeof(AuxiliaryNode));
            Ignores.Rule = ToTerm("ignores") + Identifiers;

            var FunctionModifier = new NonTerminal("FunctionModifier");
            FunctionModifier.Rule = ToTerm("exec") |
                                    ToTerm("final") |
                                    ToTerm("iterator") |
                                    ToTerm("latent") |
                                    ToTerm("native") |
                                    ToTerm("simulated") |
                                    ToTerm("singular") |
                                    ToTerm("static") |
                                    ToTerm("private") |
                                    ToTerm("protected");
            var FunctionModifiers = new NonTerminal("FunctionModifier*", typeof(AuxiliaryNode));
            FunctionModifiers.Rule = MakeStarRule(FunctionModifiers, FunctionModifier);

            var FunctionType = new NonTerminal("FunctionType");
            FunctionType.Rule = ToTerm("function") | ToTerm("event");

            var FunctionArgumentModifer = new NonTerminal("FunctionArgumentModifier");
            FunctionArgumentModifer.Rule = ToTerm("coerce") | ToTerm("optional") | ToTerm("out");

            var FunctionArgumentModifers = new NonTerminal("FunctionArgumentModifer*", typeof(AuxiliaryNode));
            FunctionArgumentModifers.Rule = MakeStarRule(FunctionArgumentModifers, FunctionArgumentModifer);

            var FunctionArgument = new NonTerminal("FunctionArgument", typeof(FunctionArgument));
            FunctionArgument.Rule = FunctionArgumentModifers + Type + Identifier + ArraySize;

            var FunctionArguments = new NonTerminal("FunctionArgument*", typeof(AuxiliaryNode));
            FunctionArguments.Rule = MakeStarRule(FunctionArguments, ToTerm(","), FunctionArgument);

            var FunctionDefinition = new NonTerminal("FunctionDefinition", typeof(Function));
            FunctionDefinition.Rule = FunctionModifiers + FunctionType + FunctionModifiers + Type + Identifier + "(" + FunctionArguments + ")" |
                                      FunctionModifiers + FunctionType + FunctionModifiers + Identifier + "(" + FunctionArguments + ")";

            var FunctionDeclaration = new NonTerminal("FunctionDeclaration", typeof(FunctionDeclaration));
            FunctionDeclaration.Rule = FunctionDefinition + ";" |
                                       FunctionDefinition + "{" + Locals + Statements + "}";
            #endregion

            #region States
            var StateDeclaration = new NonTerminal("StateDeclaration", typeof(AuxiliaryNode));
            StateDeclaration.Rule = Const | FunctionDeclaration;

            var StateDeclarations = new NonTerminal("StateDeclaration*", typeof(AuxiliaryNode));
            StateDeclarations.Rule = MakeStarRule(StateDeclarations, StateDeclaration);

            var Label = new NonTerminal("Label");
            Label.Rule = Identifier + ":" + Statements;

            var LabelOpt = new NonTerminal("LabelOpt");
            LabelOpt.Rule = Label.Q();

            var State          = new NonTerminal("State", typeof(AuxiliaryNode));
            var StateModifier  = new NonTerminal("StateModifier");
            var StateModifiers = new NonTerminal("StateModifier*", typeof(AuxiliaryNode));
            StateModifier.Rule  = ToTerm("simulated") | ToTerm("auto");
            StateModifiers.Rule = MakeStarRule(StateModifiers, StateModifier);
            State.Rule          = StateModifiers + ToTerm("state") + Identifier + ExtendsOpt + "{" + Ignores.Q() + StateDeclarations + LabelOpt + "}";
            #endregion

            // funcstateconst
            var FunctionStateConst = new NonTerminal("FunctionStateConst");
            FunctionStateConst.Rule = FunctionDeclaration | Const | State; // TODO: add state

            var FuncStateConstDeclarations = new NonTerminal("FuncStateConstDeclarations", typeof(AuxiliaryNode));
            FuncStateConstDeclarations.Rule = MakeStarRule(Declarations, FunctionStateConst);

            var ClassModifier = new NonTerminal("ClassModifier", typeof(ClassDeclaration.Modifier));
            ClassModifier.Rule = ToTerm("abstract") |
                                 ToTerm("cacheexempt") |
                                 ToTerm("config") + "(" + Identifier + ")" |
                                 ToTerm("dependson") + "(" + Identifier + ")" |
                                 ToTerm("instanced") |
                                 ToTerm("parseconfig") |
                                 ToTerm("perobjectconfig") |
                                 ToTerm("safereplace") |
                                 ToTerm("transient") |
                                 ToTerm("collapsecategories") + "(" + Identifiers + ")" |
                                 ToTerm("dontcollapsecategories") + "(" + Identifiers + ")" |
                                 ToTerm("editinline") |
                                 ToTerm("noteditinline") |
                                 ToTerm("hidecategories") + "(" + Identifiers + ")" |
                                 ToTerm("showcategories") + "(" + Identifiers + ")" |
                                 ToTerm("hidedropdown") |
                                 ToTerm("placeable") |
                                 ToTerm("notplaceable") |
                                 ToTerm("exportstructs") |
                                 ToTerm("native") |
                                 ToTerm("nativereplication") |
                                 ToTerm("noexport");

            #region Replication
            var Replication            = new NonTerminal("Replication");
            var ReplicationCondition   = new NonTerminal("ReplicationCondition");
            var ReplicationConditions  = new NonTerminal("ReplicationCondition");
            var ReplicationReliability = new NonTerminal("ReplicationReliability");
            ReplicationConditions.Rule  = MakeStarRule(ReplicationConditions, ReplicationCondition);
            ReplicationCondition.Rule   = ReplicationReliability + ToTerm("if") + "(" + Expression + ")" + Identifiers + ";";
            ReplicationReliability.Rule = ToTerm("reliable") | ToTerm("unreliable");
            Replication.Rule            = Empty | ToTerm("replication") + "{" + ReplicationConditions + "}";
            #endregion

            #region DefaultProperties
            var DefaultPropertiesKey               = new NonTerminal("DefaultPropertiesKey", typeof(DefaultPropertiesKey));
            var DefaultPropertiesAssignmentValue   = new NonTerminal("DefaultPropertiesAssignmentValue");
            var DefaultPropertiesAssignment        = new NonTerminal("DefaultPropertiesAssignment", typeof(DefaultPropertiesAssignment));
            var DefaultPropertiesAssignments       = new NonTerminal("DefaultPropertiesAssignments", typeof(AuxiliaryNode));
            var DefaultPropertiesObjectArguments   = new NonTerminal("DefaultPropertiesObjectArguments", typeof(AuxiliaryNode));
            var DefaultPropertiesArrayArgument     = new NonTerminal("DefaultPropertiesArrayArgument");
            var DefaultPropertiesArrayArguments    = new NonTerminal("DefaultPropertiesArrayArguments", typeof(AuxiliaryNode));
            var DefaultPropertiesArray             = new NonTerminal("DefaultPropertiesArray");
            var DefaultPropertiesDeclaration       = new NonTerminal("DefaultPropertiesDeclaration");
            var DefaultPropertiesDeclarations      = new NonTerminal("DefaultPropertiesDeclarations", typeof(AuxiliaryNode));
            var DefaultPropertiesObject            = new NonTerminal("DefaultPropertiesObject");
            var DefaultPropertiesObjectAssignment  = new NonTerminal("DefaultPropertiesObjectAssignment");
            var DefaultPropertiesObjectAssignments = new NonTerminal("DefaultPropertiesObjectAssignments", typeof(AuxiliaryNode));
            var DefaultProperties = new NonTerminal("DefaultProperties", typeof(DefaultProperties));

            DefaultPropertiesKey.Rule = Identifier | Identifier + "(" + Integer + ")" | Identifier + "[" + Integer + "]";
            DefaultPropertiesObjectAssignment.Rule  = DefaultPropertiesKey + "=" + DefaultPropertiesAssignmentValue;
            DefaultPropertiesObjectAssignments.Rule = MakeStarRule(DefaultPropertiesObjectAssignments, DefaultPropertiesObjectAssignment);
            DefaultPropertiesObject.Rule            = ToTerm("Begin") + ToTerm("Object") + DefaultPropertiesObjectAssignments + ToTerm("End") + ToTerm("Object");
            DefaultPropertiesDeclaration.Rule       = DefaultPropertiesAssignment | DefaultPropertiesObject;
            DefaultPropertiesDeclarations.Rule      = MakeStarRule(DefaultPropertiesDeclarations, DefaultPropertiesDeclaration);
            DefaultPropertiesAssignmentValue.Rule   = Literal | Reference | Identifier | DefaultPropertiesObjectArguments | DefaultPropertiesArray;
            DefaultPropertiesAssignment.Rule        = DefaultPropertiesKey + "=" + DefaultPropertiesAssignmentValue;
            DefaultPropertiesAssignments.Rule       = MakeStarRule(DefaultPropertiesAssignments, ToTerm(","), DefaultPropertiesAssignment);
            DefaultPropertiesObjectArguments.Rule   = "(" + DefaultPropertiesAssignments + ")";
            DefaultPropertiesArrayArgument.Rule     = DefaultPropertiesObjectArguments |
                                                      DefaultPropertiesArrayArguments + "," + DefaultPropertiesObjectArguments;
            DefaultPropertiesArrayArguments.Rule = MakeStarRule(DefaultPropertiesArrayArguments, ToTerm(","), DefaultPropertiesArrayArgument);
            DefaultPropertiesArray.Rule          = "(" + DefaultPropertiesArrayArguments + ")";
            DefaultProperties.Rule = Empty | ToTerm("defaultproperties") + "{" + DefaultPropertiesDeclarations + "}";
            #endregion

            var ClassModifiers = new NonTerminal("ClassModifiers", typeof(AuxiliaryNode));
            ClassModifiers.Rule = MakeStarRule(ClassModifiers, ClassModifier);

            var ClassDeclaration = new NonTerminal("ClassDeclaration", typeof(ClassDeclaration));
            ClassDeclaration.Rule = ToTerm("class") + Identifier + Extends + ClassModifiers + ";";

            var Program = new NonTerminal("Program", typeof(Program));
            Program.Rule = Declarations + ClassDeclaration + PreFunctionDeclarations + Replication + FuncStateConstDeclarations + DefaultProperties;

            Root = Program;

            RegisterBracePair("(", ")");
            RegisterBracePair("[", "]");
            //RegisterBracePair("<", ">");  // TODO: complains about matching brace

            MarkPunctuation(".", ":", ";", ",", "(", ")", "<", ">", "=", "[", "]", "{", "}");
            MarkTransient(Literal, PreClassDeclaration, VarType, VarStructEnumConst, FunctionModifier, FunctionArgumentModifer, Primary, Atom, DefaultPropertiesAssignmentValue, DefaultPropertiesDeclaration);

            LanguageFlags = LanguageFlags.None;
        }
Esempio n. 34
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;
		}
Esempio n. 35
0
        protected static NumberLiteral CreateLuaNumber(string name)
        {
            NumberLiteral term = new NumberLiteral(name, NumberOptions.AllowStartEndDot);
            //default int types are Integer (32bit) -> LongInteger (BigInt); Try Int64 before BigInt: Better performance?
            term.DefaultIntTypes = new TypeCode[] { TypeCode.Int32, TypeCode.Int64, NumberLiteral.TypeCodeBigInt };
            term.DefaultFloatType = TypeCode.Double; // it is default
            term.AddPrefix("0x", NumberOptions.Hex);

            return term;
        }
Esempio n. 36
0
        public ASMGrammar()
        {
            this.LanguageFlags = LanguageFlags.CreateAst;

            #region Lexical structure

            // Comments
            var comment = new CommentTerminal("Comment", ";", "\r", "\n", "\u2085", "\u2028", "\u2029");
            this.NonGrammarTerminals.Add(comment);

            // Literals
            var stringLiteral = new StringLiteral("StringLiteral", "\"", StringOptions.AllowsAllEscapes);

            var numberLiteral = new NumberLiteral("NumberLiteral");
            numberLiteral.AddPrefix("0x", NumberOptions.Hex);

            var identifier = new IdentifierTerminal("Label");
            identifier.StartCharCategories.AddRange(new UnicodeCategory[]
            {
                UnicodeCategory.UppercaseLetter,
                UnicodeCategory.LowercaseLetter
            });
            identifier.CharCategories.AddRange(identifier.StartCharCategories);
            identifier.CharCategories.AddRange(new UnicodeCategory[]
            {
                UnicodeCategory.DecimalDigitNumber
            });

            // Symbols
            var colon = ToTerm(":", "colon");
            var comma = ToTerm(",", "comma");
            var plus = ToTerm("+", "plus");

            var bracketLeft = ToTerm("[", "BracketLeft");
            var bracketRight = ToTerm("]", "BracketRight");

            MarkPunctuation(colon, comma, plus, bracketLeft, bracketRight);

            #endregion

            #region Non-terminals

            var lines = new NonTerminal("Lines", typeof(Ast.LinesNode));
            var line = new NonTerminal("Line", typeof(Ast.LineNode));
            var label = new NonTerminal("Label", typeof(Ast.LabelNode));
            var instruction = new NonTerminal("Instruction", typeof(Ast.InstructionNode));
            var instructionWithLabel = new NonTerminal("InstructionWithLabel", typeof(Ast.InstructionWithLabelNode));
            var opcode = new NonTerminal("OpCode", typeof(Ast.DefaultNode));
            var values = new NonTerminal("Values", typeof(Ast.DefaultNode));
            var value = new NonTerminal("Value");
            var simpleValue = new NonTerminal("SimpleValue", typeof(Ast.SimpleValueNode));
            var memoryValue = new NonTerminal("MemoryValue", typeof(Ast.MemoryValueNode));
            var memoryOffsetValue = new NonTerminal("MemoryOffsetValue", typeof(Ast.MemoryOffsetValueNode));
            var labelValue = new NonTerminal("LabelValue", typeof(Ast.LabelValueNode));

            var register = new NonTerminal("Register", typeof(Ast.DefaultNode));
            var misc = new NonTerminal("Misc", typeof(Ast.DefaultNode));

            #endregion

            lines.Rule = MakeListRule(lines, null, line, TermListOptions.PlusList);
            line.Rule = label + Eos | instruction + Eos | instructionWithLabel + Eos;
            label.Rule = colon + identifier;
            instructionWithLabel.Rule = label + instruction;
            instruction.Rule = opcode + values;
            opcode.Rule = identifier;
            values.Rule = MakeListRule(values, comma, value, TermListOptions.PlusList);
            value.Rule = simpleValue | memoryValue | memoryOffsetValue | labelValue;
            simpleValue.Rule = stringLiteral | numberLiteral | register | misc;
            memoryValue.Rule = bracketLeft + simpleValue + bracketRight;
            memoryOffsetValue.Rule = bracketLeft + numberLiteral + plus + register + bracketRight;
            labelValue.Rule = identifier;

            register.Rule = ToTerm("A") | "B" | "C" | "X" | "Y" | "Z" | "I" | "J";
            misc.Rule = ToTerm("SP") | "PC" | "O" | "POP" | "PEEK" | "PUSH";

            // Set the grammar root.
            this.Root = lines;

            MarkTransient(value, register, misc);
        }
Esempio n. 37
0
        public ASMGrammar()
        {
            this.LanguageFlags = LanguageFlags.CreateAst;

            #region Lexical structure

            // Comments
            var comment = new CommentTerminal("Comment", ";", "\r", "\n", "\u2085", "\u2028", "\u2029");
            this.NonGrammarTerminals.Add(comment);

            // Literals
            var stringLiteral = new StringLiteral("StringLiteral", "\"", StringOptions.AllowsAllEscapes);

            var numberLiteral = new NumberLiteral("NumberLiteral");
            numberLiteral.AddPrefix("0x", NumberOptions.Hex);

            var identifier = new IdentifierTerminal("Label");
            identifier.StartCharCategories.AddRange(new UnicodeCategory[]
            {
                UnicodeCategory.UppercaseLetter,
                UnicodeCategory.LowercaseLetter
            });
            identifier.CharCategories.AddRange(identifier.StartCharCategories);
            identifier.CharCategories.AddRange(new UnicodeCategory[]
            {
                UnicodeCategory.DecimalDigitNumber
            });

            // Symbols
            var colon = ToTerm(":", "colon");
            var comma = ToTerm(",", "comma");
            var plus  = ToTerm("+", "plus");

            var bracketLeft  = ToTerm("[", "BracketLeft");
            var bracketRight = ToTerm("]", "BracketRight");

            MarkPunctuation(colon, comma, plus, bracketLeft, bracketRight);

            #endregion

            #region Non-terminals

            var lines                = new NonTerminal("Lines", typeof(Ast.LinesNode));
            var line                 = new NonTerminal("Line", typeof(Ast.LineNode));
            var label                = new NonTerminal("Label", typeof(Ast.LabelNode));
            var instruction          = new NonTerminal("Instruction", typeof(Ast.InstructionNode));
            var instructionWithLabel = new NonTerminal("InstructionWithLabel", typeof(Ast.InstructionWithLabelNode));
            var opcode               = new NonTerminal("OpCode", typeof(Ast.DefaultNode));
            var values               = new NonTerminal("Values", typeof(Ast.DefaultNode));
            var value                = new NonTerminal("Value");
            var simpleValue          = new NonTerminal("SimpleValue", typeof(Ast.SimpleValueNode));
            var memoryValue          = new NonTerminal("MemoryValue", typeof(Ast.MemoryValueNode));
            var memoryOffsetValue    = new NonTerminal("MemoryOffsetValue", typeof(Ast.MemoryOffsetValueNode));
            var labelValue           = new NonTerminal("LabelValue", typeof(Ast.LabelValueNode));

            var register = new NonTerminal("Register", typeof(Ast.DefaultNode));
            var misc     = new NonTerminal("Misc", typeof(Ast.DefaultNode));

            #endregion

            lines.Rule = MakeListRule(lines, null, line, TermListOptions.PlusList);
            line.Rule  = label + Eos | instruction + Eos | instructionWithLabel + Eos;
            label.Rule = colon + identifier;
            instructionWithLabel.Rule = label + instruction;
            instruction.Rule          = opcode + values;
            opcode.Rule            = identifier;
            values.Rule            = MakeListRule(values, comma, value, TermListOptions.PlusList);
            value.Rule             = simpleValue | memoryValue | memoryOffsetValue | labelValue;
            simpleValue.Rule       = stringLiteral | numberLiteral | register | misc;
            memoryValue.Rule       = bracketLeft + simpleValue + bracketRight;
            memoryOffsetValue.Rule = bracketLeft + numberLiteral + plus + register + bracketRight;
            labelValue.Rule        = identifier;

            register.Rule = ToTerm("A") | "B" | "C" | "X" | "Y" | "Z" | "I" | "J";
            misc.Rule     = ToTerm("SP") | "PC" | "O" | "POP" | "PEEK" | "PUSH";

            // Set the grammar root.
            this.Root = lines;

            MarkTransient(value, register, misc);
        }