示例#1
0
        static NicodemGrammarProductions()
        {
            DecimalNumberLiteral.SetProduction(DecimalNumberLiteralToken);
            CharacterLiteral.SetProduction(CharacterLiteralToken);
            StringLiteral.SetProduction(StringLiteralToken);
            BooleanLiteral.SetProduction(BooleanLiteralToken);
            Literals.SetProduction(DecimalNumberLiteral + CharacterLiteral + StringLiteral + BooleanLiteral);

            Program.SetProduction((Function + RecordTypeDeclaration).Star * Eof);
            RecordTypeDeclaration.SetProduction(TypeSpecifier * "{" * RecordTypeFieldsDeclarationList * "}");
            RecordTypeFieldsDeclarationList.SetProduction(RecordTypeFieldDeclaration.Star * RecordTypeFieldDeclaration);
            RecordTypeFieldDeclaration.SetProduction(ObjectDeclaration * ";");
            Function.SetProduction(ObjectName * "(" * ParametersList * ")" * "->" * TypeSpecifier * Expression);
            ParametersList.SetProduction(((ObjectDeclaration * ",").Star * ObjectDeclaration).Optional);
            ObjectDeclaration.SetProduction(TypeSpecifier * ObjectName);
            TypeSpecifier.SetProduction(TypeName * ("mutable".Optional() * "[" * Expression.Optional * "]").Star * "mutable".Optional());
            Expression.SetProduction(RecordVariableDefinitionExpression + RecordFieldAccessExpression + OperatorExpression);
            RecordFieldAccessExpression.SetProduction(ObjectName * "[" * ObjectName * "]");
            OperatorExpression.SetProduction(Operator19Expression);
            Operator19Expression.SetProduction(ObjectDefinitionExpression + Operator18Expression);
            ObjectDefinitionExpression.SetProduction(TypeSpecifier * ObjectName * "=" * Expression);  // NOTE: "=" is _not_ an assignment operator here
            RecordVariableDefinitionExpression.SetProduction(TypeSpecifier * ObjectName * "{" * RecordInitializationList * "}");
            RecordInitializationList.SetProduction((RecordInitializationField * ",").Star * RecordInitializationField);
            RecordInitializationField.SetProduction(ObjectName * "=" * Expression);
            Operator18Expression.SetProduction(IfExpression + WhileExpression + Operator17Expression);
            IfExpression.SetProduction("if" * Expression * Expression * ("else" * Expression).Optional);
            WhileExpression.SetProduction("while" * Expression * Expression * ("else" * Expression).Optional);
            Operator17Expression.SetProduction(Operator16Expression);
            Operator16Expression.SetProduction(Operator15Expression);
            Operator15Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator14Expression, "= += -= *= /= %= <<= >>= &= ^= |=".Split(' ')));
            Operator14Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator13Expression, "||"));
            Operator13Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator12Expression, "&&"));
            Operator12Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator11Expression, "|"));
            Operator11Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator10Expression, "^"));
            Operator10Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator9Expression, "&"));
            Operator9Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator8Expression, "==", "!="));
            Operator8Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator7Expression, "< <= > >=".Split(' ')));
            Operator7Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator6Expression, "<< >>".Split(' ')));
            Operator6Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator5Expression, "+ -".Split(' ')));
            Operator5Expression.SetProduction(MakeInfixOperatorExpressionRegex(Operator4Expression, "* / %".Split(' ')));
            Operator4Expression.SetProduction(Operator3Expression);
            Operator3Expression.SetProduction(RegexSymbol.MakeUnion("++ -- + - ! ~".Split(' ')).Star *Operator2Expression);
            Operator2Expression.SetProduction(Operator1Expression * (RegexSymbol.MakeUnion("++", "--") + ("(" * (Expression * ",").Star * Expression.Optional * ")") + ("[" * Expression * "]") + ("[" * Expression.Optional * ".." * Expression.Optional * "]")).Star);
            Operator1Expression.SetProduction(Operator0Expression);
            Operator0Expression.SetProduction(AtomicExpression + ("(" * Expression * ")"));
            AtomicExpression.SetProduction(
                BlockExpression +
                ArrayLiteralExpression +
                ObjectUseExpression +
                LoopControlExpression
                );
            BlockExpression.SetProduction("{" * (Expression * ";").Star * "}");               // No left-recursion thanks to '{'
            ArrayLiteralExpression.SetProduction("[" * (Expression * ",").Star * Expression.Optional * "]");
            ObjectUseExpression.SetProduction(ObjectName + Literals);
            LoopControlExpression.SetProduction(("break".Token() + "continue") * (Expression * DecimalNumberLiteral.Optional).Optional);
        }