@@ -33,38 +33,44 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
33
33
private def lower : Parser [ASTNode ] = terminal | ROUND_BRACKET_OPEN ~> root <~ ROUND_BRACKET_CLOSE
34
34
35
35
private val overAndUnderscript : Parser [ASTNode ] = chainr1(lower,
36
- UNDERSCRIPT ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => UnderscriptNode (e1, e2) }
37
- | OVERSCRIPT ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => OverscriptNode (e1, e2) }
36
+ UNDERSCRIPT ^^ {_=> UnderscriptNode .createBinary }
37
+ | OVERSCRIPT ^^ {_=> OverscriptNode .createBinary }
38
38
)
39
39
40
40
private val subscript : Parser [ASTNode ] = rep1sep(overAndUnderscript, SUBSCRIPT ) ^^
41
- (subscripts => subscripts.reduceRight((e1, e2) => SubscriptNode (e1, e2) ))
41
+ (subscripts => subscripts.reduceRight(SubscriptNode .apply ))
42
42
43
43
private val part : Parser [ASTNode ] = {
44
- ((underparts : Parser [ASTNode ]) => underparts ~ rep(
45
- (SQUARE_BRACKET_OPEN ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE )
46
- | (SQUARE_BRACKET_OPEN2 ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE2 )
47
- | (SQUARE_BRACKET_OPEN3 ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE3 )
44
+ ((underparts : Parser [ASTNode ]) => underparts ~ rep1(
45
+ SQUARE_BRACKET_OPEN ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE
48
46
) ^^ {
49
- case expr ~ parts => parts.flatten.foldLeft(expr)(PartNode .apply)
50
- })(subscript)
47
+ case expr ~ parts =>
48
+ FunctionNode (expr, parts.flatten)
49
+ }
50
+ | underparts ~ rep1(
51
+ (SQUARE_BRACKET_OPEN2 ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE2 )
52
+ | (SQUARE_BRACKET_OPEN3 ~> rep1sep(underparts, COMMA ) <~ SQUARE_BRACKET_CLOSE3 )
53
+ ) ^^ {
54
+ case expr ~ parts => PartNode (expr +: parts.flatten)
55
+ } | underparts
56
+ )(subscript)
51
57
}
52
58
53
59
private val incrementAndDecrement : Parser [ASTNode ] = lastFolderRight(part,
54
- INCREASE ^^ { _=> ( e1 : ASTNode ) => IncrementNode .apply(e1) }
55
- | DECREASE ^^ { _=> ( e1 : ASTNode ) => DecrementNode .apply(e1) }
60
+ INCREASE ^^ { _=> IncrementNode .createUnary }
61
+ | DECREASE ^^ { _=> DecrementNode .createUnary }
56
62
)
57
63
58
64
private val preincrementAndPredecrement : Parser [ASTNode ] = firstFolderRight(
59
- INCREASE ^^ { _=> ( e1 : ASTNode ) => PreincrementNode .apply(e1) }
60
- | DECREASE ^^ { _=> ( e1 : ASTNode ) => PredecrementNode .apply(e1) }
65
+ INCREASE ^^ { _=> PreincrementNode .createUnary }
66
+ | DECREASE ^^ { _=> PredecrementNode .createUnary }
61
67
,
62
68
incrementAndDecrement
63
69
)
64
70
65
71
private val composition : Parser [ASTNode ] = chainl1(preincrementAndPredecrement,
66
- COMPOSITION ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => CompositionNode (e1,e2) }
67
- | RIGHT_COMPOSITION ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => RightCompositionNode (e1,e2) }
72
+ COMPOSITION ^^ {_=> CompositionNode .createBinary }
73
+ | RIGHT_COMPOSITION ^^ {_=> RightCompositionNode .createBinary }
68
74
)
69
75
70
76
// private def mapAndApply: Parser[ASTNode] = composition ~ ("/@" | "//@" | "@@" | "@@@") ~ composition ^^ {
@@ -75,15 +81,15 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
75
81
// } | composition
76
82
77
83
private val factorial : Parser [ASTNode ] = lastFolderRight(composition,
78
- (EXCLAMATION_MARK ~ EXCLAMATION_MARK ) ^^ {_=> ( e : ASTNode ) => Factorial2Node (e) }
84
+ (EXCLAMATION_MARK ~ EXCLAMATION_MARK ) ^^ {_=> Factorial2Node .createUnary }
79
85
) ~ opt(EXCLAMATION_MARK ) ^^ {
80
86
case expr ~ factorialOpt => factorialOpt.map(_=> ast.FactorialNode (expr)).getOrElse(expr)
81
87
}
82
88
83
89
private val conjugateAndTranspose : Parser [ASTNode ] = lastFolderRight(factorial,
84
- CONJUGATE ^^ {_=> (e : ASTNode ) => ConjugateNode (e) }
85
- | TRANSPOSE ^^ {_=> (e : ASTNode ) => TransposeNode (e) }
86
- | (CONJUGATE_TRANSPOSE | CONJUGATE_TRANSPOSE2 ) ^^ {_=> (e : ASTNode ) => ConjugateTransposeNode (e) }
90
+ CONJUGATE ^^ {_=> ConjugateNode .createUnary }
91
+ | TRANSPOSE ^^ {_=> TransposeNode .createUnary }
92
+ | (CONJUGATE_TRANSPOSE | CONJUGATE_TRANSPOSE2 ) ^^ {_=> ConjugateTransposeNode .createUnary }
87
93
)
88
94
89
95
private val derivative : Parser [ASTNode ] = conjugateAndTranspose ~ rep(" '" ) ^^ {
@@ -97,17 +103,16 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
97
103
98
104
private val power : Parser [ASTNode ] = rep1sep(derivative, CARET ) ^^ (values => values.reduceRight(PowerNode .apply))
99
105
100
- private val verticalArrowAndVectorOperators : Parser [ASTNode ] = CURLY_BRACKET_OPEN ~> rep1sep(power, COMMA ) <~ CURLY_BRACKET_CLOSE ^^ {
101
- elements => FunctionNode (SymbolNode (" List" ), elements)
102
- } | power
106
+ private val verticalArrowAndVectorOperators : Parser [ASTNode ] =
107
+ CURLY_BRACKET_OPEN ~> rep1sep(power, COMMA ) <~ CURLY_BRACKET_CLOSE ^^ ListNode .createMany | power
103
108
104
109
private val sqrt : Parser [ASTNode ] = firstFolderRight(
105
- SQRT ^^ {_=> (e : ASTNode ) => SqrtNode (e) },
110
+ SQRT ^^ {_=> SqrtNode .createUnary },
106
111
verticalArrowAndVectorOperators
107
112
)
108
113
109
114
private val differentialD : Parser [ASTNode ] = firstFolderRight(
110
- " d" ^^ {_=> (e : ASTNode ) => DifferentialDNode (e) },
115
+ " d" ^^ {_=> DifferentialDNode .createUnary },
111
116
sqrt
112
117
)
113
118
@@ -155,10 +160,10 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
155
160
// // } | integrate
156
161
157
162
private val plusAndMinus : Parser [ASTNode ] = chainr1(times,
158
- PLUS ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => PlusNode (e1, e2) }
163
+ PLUS ^^ {_=> PlusNode .createBinary }
159
164
| MINUS ^^ {_=> (expr1 : ASTNode , expr2 : ASTNode ) => PlusNode (expr1, TimesNode (NumberNode (" -1" ), expr2))}
160
- | PLUS_MINUS ^^ {_=> ( expr1 : ASTNode , expr2 : ASTNode ) => PlusMinusNode (expr1, expr2) }
161
- | MINUS_PLUS ^^ {_=> ( expr1 : ASTNode , expr2 : ASTNode ) => MinusPlusNode (expr1, expr2) }
165
+ | PLUS_MINUS ^^ {_=> PlusMinusNode .createBinary }
166
+ | MINUS_PLUS ^^ {_=> MinusPlusNode .createBinary }
162
167
)
163
168
164
169
private val intersection : Parser [ASTNode ] = rep1sep(plusAndMinus, INTERSECTION ) ^^ (_.reduce(IntersectionNode .apply))
@@ -170,27 +175,27 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
170
175
} | union
171
176
172
177
private val equalities : Parser [ASTNode ] = chainl1(span,
173
- (" ==" | " \uF7D9 " ) ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => EqualNode (e1, e2) }
174
- | " !=" ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => UnequalNode (e1, e2) }
175
- | " >" ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => GreaterNode (e1, e2) }
176
- | (" >=" | " ≥" | " ⩾" ) ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => GreaterEqualNode (e1, e2) }
177
- | " <" ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => LessNode (e1, e2) }
178
- | (" <=" | " ≤" | " ⩽" ) ^^ { _ => ( e1 : ASTNode , e2 : ASTNode ) => LessEqualNode (e1, e2) }
178
+ (" ==" | " \uF7D9 " ) ^^ { _ => EqualNode .createBinary }
179
+ | " !=" ^^ { _ => UnequalNode .createBinary }
180
+ | " >" ^^ { _ => GreaterNode .createBinary }
181
+ | (" >=" | " ≥" | " ⩾" ) ^^ { _ => GreaterEqualNode .createBinary }
182
+ | " <" ^^ { _ => LessNode .createBinary }
183
+ | (" <=" | " ≤" | " ⩽" ) ^^ { _ => LessEqualNode .createBinary }
179
184
)
180
185
181
186
// private val horizontalArrowAndVectorOperators: Parser[ASTNode] = equalities
182
187
// private val diagonalArrowOperators: Parser[ASTNode] = horizontalArrowAndVectorOperators
183
188
184
189
private val sameQ : Parser [ASTNode ] = chainl1(equalities,
185
- " ===" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => SameQNode (e1,e2) }
186
- | " =!=" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => UnSameQNode (e1,e2) }
190
+ " ===" ^^ {_ => SameQNode .createBinary }
191
+ | " =!=" ^^ {_ => UnSameQNode .createBinary }
187
192
)
188
193
189
194
private val setRelationOperators : Parser [ASTNode ] = chainl1(sameQ,
190
- " ∈" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => ElementNode (e1, e2) }
191
- | " ∉" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => NotElementNode (e1, e2) }
192
- | " ⊂" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => SubsetNode (e1, e2) }
193
- | " ⊃" ^^ {_ => ( e1 : ASTNode , e2 : ASTNode ) => SupersetNode (e1, e2) }
195
+ " ∈" ^^ {_ => ElementNode .createBinary }
196
+ | " ∉" ^^ {_ => NotElementNode .createBinary }
197
+ | " ⊂" ^^ {_ => SubsetNode .createBinary }
198
+ | " ⊃" ^^ {_ => SupersetNode .createBinary }
194
199
)
195
200
196
201
// private def forallAndExists: Parser[ASTNode] = setRelationOperators ~ ("∀" | "∃" | "∄") ~ setRelationOperators ^^ {
@@ -199,7 +204,7 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
199
204
// case expr1 ~ "∄" ~ expr2 => NotExistsNode(expr1, expr2)
200
205
// } | setRelationOperators
201
206
//
202
- private val not : Parser [ASTNode ] = firstFolderRight((" !" | " ¬" )^^ {_=> (e : ASTNode ) => NotNode (e) },
207
+ private val not : Parser [ASTNode ] = firstFolderRight((" !" | " ¬" )^^ {_=> NotNode .createUnary },
203
208
setRelationOperators
204
209
)
205
210
@@ -236,8 +241,8 @@ class MathematicaParser extends StdTokenParsers with ParserUtil with LazyLogging
236
241
// } | implies
237
242
238
243
private val rules = chainl1(not,
239
- (" ->" | " \uF522 " ) ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => RuleNode (e1, e2) }
240
- | (" :>" | " \uF51F " ) ^^ {_=> ( e1 : ASTNode , e2 : ASTNode ) => RuleDelayedNode (e1, e2) }
244
+ (" ->" | " \uF522 " ) ^^ {_=> RuleNode .createBinary }
245
+ | (" :>" | " \uF51F " ) ^^ {_=> RuleDelayedNode .createBinary }
241
246
)
242
247
243
248
private def root = rules
0 commit comments