~alexreg/mathtexdotnet/0.1

« back to all changes in this revision

Viewing changes to TexDotNet/Semantics/TexParser.cs

  • Committer: Alex Regueiro
  • Date: 2009-10-07 21:36:26 UTC
  • Revision ID: alexreg@gmail.com-20091007213626-8kaxszo50pmi7jse
Parser and composer now properly handle relation expressions/operators.
Major refactoring of TexComposer and TexUtilities classes; minor refactoring elsewhere. More comments also added.
Completed initial version of F# bindings for common utility methods.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
        {
27
27
            var state = CreateDefaultState();
28
28
            tokenStream.ForceMoveNext();
29
 
            var node = ParseFractionalExpression(tokenStream, ref state);
 
29
            var node = ParseRelationalExpression(tokenStream, ref state);
30
30
            if (tokenStream.Current.Symbol != TexSymbolKind.EndOfStream)
31
31
                throw new ParserException(tokenStream.Current, errorMessageExpectedEndOfStream);
32
32
            return node;
40
40
            return state;
41
41
        }
42
42
 
 
43
        private ParseNode ParseRelationalExpression(TokenStream tokenStream, ref ParserState state)
 
44
        {
 
45
            return ParseRelationalExpression(tokenStream, ref state, false);
 
46
        }
 
47
 
 
48
        private ParseNode ParseRelationalExpression(TokenStream tokenStream, ref ParserState state, bool isSubTree)
 
49
        {
 
50
            var node = new ParseNode(ParseNodeKind.InfixOperator);
 
51
            node.Children.Add(ParseFractionalExpression(tokenStream, ref state));
 
52
            switch (tokenStream.Current.Symbol)
 
53
            {
 
54
                case TexSymbolKind.EndOfStream:
 
55
                    return node;
 
56
                case TexSymbolKind.Equals:
 
57
                case TexSymbolKind.NotEquals:
 
58
                case TexSymbolKind.DotEquals:
 
59
                case TexSymbolKind.Approximates:
 
60
                case TexSymbolKind.Equivalent:
 
61
                case TexSymbolKind.LessThan:
 
62
                case TexSymbolKind.LessThanOrEqualTo:
 
63
                case TexSymbolKind.GreaterThan:
 
64
                case TexSymbolKind.GreaterThanOrEqualTo:
 
65
                case TexSymbolKind.MuchLessThan:
 
66
                case TexSymbolKind.MuchGreaterThan:
 
67
                case TexSymbolKind.Proportional:
 
68
                case TexSymbolKind.Asymptotic:
 
69
                case TexSymbolKind.Bowtie:
 
70
                case TexSymbolKind.Models:
 
71
                case TexSymbolKind.Precedes:
 
72
                case TexSymbolKind.PrecedesOrEquals:
 
73
                case TexSymbolKind.Succedes:
 
74
                case TexSymbolKind.SuccedesOrEquals:
 
75
                case TexSymbolKind.Congruent:
 
76
                case TexSymbolKind.Similar:
 
77
                case TexSymbolKind.SimilarOrEquals:
 
78
                case TexSymbolKind.Perpendicular:
 
79
                case TexSymbolKind.Parallel:
 
80
                case TexSymbolKind.Middle:
 
81
                case TexSymbolKind.Subset:
 
82
                case TexSymbolKind.SubsetOrEqualTo:
 
83
                case TexSymbolKind.Superset:
 
84
                case TexSymbolKind.SupersetOrEqualTo:
 
85
                case TexSymbolKind.SquareSubset:
 
86
                case TexSymbolKind.SquareSubsetOrEqualTo:
 
87
                case TexSymbolKind.SquareSuperset:
 
88
                case TexSymbolKind.SquareSupersetOrEqualTo:
 
89
                case TexSymbolKind.Member:
 
90
                case TexSymbolKind.NotMember:
 
91
                case TexSymbolKind.Contains:
 
92
                case TexSymbolKind.NotContains:
 
93
                case TexSymbolKind.Smile:
 
94
                case TexSymbolKind.Frown:
 
95
                case TexSymbolKind.VLineDash:
 
96
                case TexSymbolKind.DashVLine:
 
97
                    node.IsSubExpression = isSubTree;
 
98
                    node.Children.Add(new ParseNode(tokenStream.Current));
 
99
                    tokenStream.ForceMoveNext();
 
100
                    break;
 
101
                default:
 
102
                    return node;
 
103
            }
 
104
            node.Children.Add(ParseRelationalExpression(tokenStream, ref state, true));
 
105
            return node;
 
106
        }
 
107
 
43
108
        private ParseNode ParseFractionalExpression(TokenStream tokenStream, ref ParserState state)
44
109
        {
45
110
            var node = new ParseNode(ParseNodeKind.InfixOperator);
305
370
            {
306
371
                case TexSymbolKind.GroupOpen:
307
372
                    tokenStream.ForceMoveNext();
308
 
                    var node = ParseFractionalExpression(tokenStream, ref state);
 
373
                    var node = ParseRelationalExpression(tokenStream, ref state);
309
374
                    if (tokenStream.Current.Symbol != TexSymbolKind.GroupClose)
310
375
                        throw new ParserException(tokenStream.Current, new[] {
311
376
                            TexSymbolKind.GroupClose });
356
421
                    return null;
357
422
            }
358
423
            tokenStream.ForceMoveNext();
359
 
            var node = ParseExpression(tokenStream, ref newState);
 
424
            var node = ParseRelationalExpression(tokenStream, ref newState);
360
425
            if (tokenStream.Current.Symbol != bracketCloseToken)
361
426
                throw new ParserException(tokenStream.Current, new[] {
362
427
                    bracketCloseToken });
446
511
                    var indicesNode = ParseIndicesPairOptional(tokenStream, ref state);
447
512
                    indicesNode.IsArgument = true;
448
513
                    node.Children.Add(indicesNode);
449
 
                    node.Children.Add(ParseFractionalExpression(tokenStream, ref state));
 
514
                    node.Children.Add(ParseRelationalExpression(tokenStream, ref state));
450
515
                    return node;
451
516
                default:
452
517
                    return null;
504
569
                    var indicesNode = ParseIndicesPairOptional(tokenStream, ref state);
505
570
                    indicesNode.IsArgument = true;
506
571
                    node.Children.Add(indicesNode);
507
 
                    node.Children.Add(ParseFractionalExpression(tokenStream, ref state));
 
572
                    node.Children.Add(ParseRelationalExpression(tokenStream, ref state));
508
573
                    return node;
509
574
                default:
510
575
                    return null;