예제 #1
0
        private static Grammar MakeParser()
        {
            // Literals
            var ws    = Terminals.WhiteSpace.Repeat(0);
            var comma = ws.Then(Terminals.Set(','), ws);
            var subExpressionAccess = ws.Then(Terminals.Set('.'), ws);
            var number = new NumberParser
            {
                AllowDecimal  = true,
                AllowExponent = true,
                AllowSign     = true,
                ValueType     = typeof(float)
            };

            var identifier = Terminals.Letter.Or(Terminals.Set(_identifierAllowedCharacters))
                             .Then(Terminals.LetterOrDigit.Or(Terminals.Set(_identifierAllowedCharacters)).Repeat(0));

            // Expressions
            var expression    = new UnaryParser();
            var subExpression = expression.Named(ElementAST.SubExpressionRoot)
                                .Then(subExpressionAccess, identifier.Named(ElementAST.SubExpressionName));
            var arguments = expression.Named(ElementAST.CallArgument).Repeat(0).SeparatedBy(comma);
            var call      = expression.Named(ElementAST.Callee)
                            .Then(ws, Terminals.Set('('), ws, arguments.Named(ElementAST.CallArguments), ws,
                                  Terminals.Set(')'));

            expression.Inner = new AlternativeParser(
                number.Named(ElementAST.NumberExpression),
                identifier.Named(ElementAST.VariableExpression),
                subExpression.Named(ElementAST.SubExpression),
                call.Named(ElementAST.CallExpression)
                );

            // Functions
            var portType = ws.Then(Terminals.Literal(":"), ws, identifier.Named(ElementAST.PortType)).Optional();
            var port     = identifier.Named(ElementAST.PortName).Then(portType).Named(ElementAST.Port);
            var ports    = port.Repeat(0).SeparatedBy(comma);
            var fnInputs = Terminals.Set('(')
                           .Then(ws, ports.Named(ElementAST.FunctionInputs), ws, Terminals.Set(')')).Optional();
            var fnOutputs   = Terminals.Literal("->").Then(ws, ports.Named(ElementAST.FunctionOutputs)).Or(portType);
            var fnSignature = identifier.Named(ElementAST.FunctionName).Then(ws, fnInputs, ws, fnOutputs, ws);

            // Statements
            var statement = new UnaryParser();
            var body      = Terminals.Set('{').Then(ws, statement.Then(ws).Repeat(0).Named(ElementAST.FunctionBody), ws,
                                                    Terminals.Set('}'));
            var assign = Terminals.Set('=').Then(ws, expression.Named(ElementAST.AssignmentStatement), ws,
                                                 Terminals.Set(';'));

            statement.Inner = fnSignature
                              .Then(body.Or(assign).Or(Terminals.Set(';').Named(ElementAST.TypeStatement)))
                              .Named(ElementAST.Statement);

            var start = ws.Then(statement, ws).Repeat(0);

            start.Until = Terminals.End;

            return(new Grammar(start));
        }
예제 #2
0
        public void Initialize(MarkdownGrammar grammar)
        {
            var parens = +(Terminals.Set("\\").Not() & Terminals.Literal("`"));

            Add(new BalancedParser {
                Surrounding = parens
            } /*, (parens & new RepeatParser().Until(Terminals.Literal("`"), true) & parens)*/);
        }
예제 #3
0
        public void Initialize(MarkdownGrammar grammar)
        {
            var prefix = Terms.sp.Repeat(0, 3);
            var value  = Terminals.Set("\n\r").Inverse().Repeat(1).WithName("value");
            var suffix = Terminals.Eol & ((+Terminals.Literal("=")).Named("h1") | (+Terminals.Literal("-")).Named("h2")) & Terms.ows & Terminals.Eol;

            this.Add(prefix, value, suffix, -Terms.blankLine);
        }
예제 #4
0
        public void Initialize(MarkdownGrammar grammar)
        {
            var prefix     = Terminals.Repeat(c => c == ' ' || c == '\t', 0, 3);
            var dash       = Terminals.Literal("-").Repeat(3).SeparatedBy(Terms.ows).Until(Terms.eolorf);
            var star       = Terminals.Literal("*").Repeat(3).SeparatedBy(Terms.ows).Until(Terms.eolorf);
            var underscore = Terminals.Literal("_").Repeat(3).SeparatedBy(Terms.ows).Until(Terms.eolorf);

            this.Add(prefix, dash | star | underscore, -Terms.blankLine);
        }
예제 #5
0
        public void Initialize(MarkdownGrammar grammar)
        {
            var prefix = Terminals.Literal("#").Repeat(1);
            var value  = Terminals.Set("\n\r").Inverse().Repeat(1).Until(Terms.ows & -Terminals.Literal("#") & Terms.eolorf, true);

            prefix.Name = "prefix";
            value.Name  = "value";
            this.Add(prefix, Terms.ows, value, -Terms.blankLine);
        }
예제 #6
0
        public void Initialize(MarkdownGrammar grammar)
        {
            this.grammar = grammar;
            var prefix = (grammar.Prefix & -Terms.sp) & Terminals.Literal(">");
            var value  = new RepeatParser(1).Until(Terms.eolorf, true);

            prefix.Name  = "prefix";
            value.Name   = "value";
            this.Inner   = prefix.Separate() & Terms.ows & value & -Terms.blankLine;
            this.Minimum = 1;
        }
예제 #7
0
        public void Initialize(MarkdownGrammar grammar)
        {
            var inner     = grammar.Encoding.Replacements();
            var name      = ~Terminals.Literal("!") & "[" & (+(inner | Terminals.Set("]").Inverse())).WithName("name") & "]";
            var reference = ~(Terms.sporht | Terms.eol) & "[" & (-Terminals.Set("]\n\r").Inverse()).WithName("ref") & "]";
            var title     = new StringParser {
                Name = "title", BeginQuoteCharacters = "\"'(".ToCharArray(), EndQuoteCharacters = "\"')".ToCharArray()
            };
            var enclosedLink = Terminals.Literal("\\").Not() & "<" & (Terminals.Set(">\r\n ").Inverse().Except("\\>").Repeat(1)).WithName("link") & ">";
            var openLink     = (+("\\)" | Terminals.Set(") \t\r\n").Inverse())).WithName("link");
            var link         = "(" & Terms.ows & (enclosedLink | openLink | new EmptyParser().WithName("link")) & ~((Terms.ws | (Terms.ows & Terms.eol & Terms.ows)) & title) & Terms.ows & ")";

            Add(enclosedLink, name & ~(reference | link));
        }
예제 #8
0
 public void Initialize(MarkdownGrammar grammar)
 {
     this.Add("&" & ~(+Terminals.Letter & ";"), Terminals.Set("<>\""), Terminals.Literal("\\") & Terminals.Set("&><\\`*_{}[]()#+-.!"));
 }