~alexreg/mathtexdotnet/0.1

« back to all changes in this revision

Viewing changes to TexDotNet/Semantics/TexParser.cs

  • Committer: Alex Regueiro
  • Date: 2009-09-21 00:06:28 UTC
  • Revision ID: alexreg@gmail.com-20090921000628-88xvb2n2v57vsr0d
Updated grammar specification.
Modified parser so that it now creates a binary tree for implicitly multiplied values (rather than a node with n children).

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
        private ParseNode ParseTerm(TokenStream tokenStream, ref ParserState state)
56
56
        {
57
57
            var node = new ParseNode(ParseNodeKind.InfixOperator);
58
 
            node.Children.Add(ParseImplicitTermOptional(tokenStream, ref state));
 
58
            node.Children.Add(ParseFirstImplicitTermOptional(tokenStream, ref state));
59
59
            switch (tokenStream.Current.Symbol)
60
60
            {
61
61
                case SymbolKind.Cross:
70
70
            return node;
71
71
        }
72
72
 
 
73
        private ParseNode ParseFirstImplicitTermOptional(TokenStream tokenStream, ref ParserState state)
 
74
        {
 
75
            var node = new ParseNode(ParseNodeKind.PrefixOperator);
 
76
            node.Children.Add(new ParseNode(Token.FromKind(SymbolKind.Dot, tokenStream.Current.Position)));
 
77
            node.Children.Add(ParseSignedValue(tokenStream, ref state));
 
78
            var implicitTermNode = ParseImplicitTermOptional(tokenStream, ref state);
 
79
            if (implicitTermNode != null)
 
80
                node.Children.Add(implicitTermNode);
 
81
            return node;
 
82
        }
 
83
 
73
84
        private ParseNode ParseImplicitTermOptional(TokenStream tokenStream, ref ParserState state)
74
85
        {
75
 
            var node = new ParseNode(ParseNodeKind.PostfixOperator);
76
 
            node.Children.Add(ParseSignedValue(tokenStream, ref state));
77
 
            ParseNode valueNode;
78
 
            while ((valueNode = ParseValueOptional(tokenStream, ref state)) != null)
79
 
                node.Children.Add(valueNode);
 
86
            var valueNode = ParseValueOptional(tokenStream, ref state);
 
87
            if (valueNode == null)
 
88
                return null;
 
89
            var node = new ParseNode(ParseNodeKind.PrefixOperator);
80
90
            node.Children.Add(new ParseNode(Token.FromKind(SymbolKind.Dot, tokenStream.Current.Position)));
 
91
            node.Children.Add(valueNode);
 
92
            var implicitTermNode = ParseImplicitTermOptional(tokenStream, ref state);
 
93
            if (implicitTermNode != null)
 
94
                node.Children.Add(implicitTermNode);
81
95
            return node;
82
96
        }
83
97