mirror of
				https://github.com/DanilaFe/abacus
				synced 2025-10-30 17:33:42 -07:00 
			
		
		
		
	Add operator types.
This commit is contained in:
		
							parent
							
								
									df0b1829ff
								
							
						
					
					
						commit
						082b2f8783
					
				| @ -9,6 +9,10 @@ public class Operator { | |||||||
|      * The associativity of the operator. |      * The associativity of the operator. | ||||||
|      */ |      */ | ||||||
|     private OperatorAssociativity associativity; |     private OperatorAssociativity associativity; | ||||||
|  |     /** | ||||||
|  |      * The type of this operator. | ||||||
|  |      */ | ||||||
|  |     private OperatorType type; | ||||||
|     /** |     /** | ||||||
|      * The precedence of the operator. |      * The precedence of the operator. | ||||||
|      */ |      */ | ||||||
| @ -24,7 +28,7 @@ public class Operator { | |||||||
|      * @param precedence the precedence of the operator. |      * @param precedence the precedence of the operator. | ||||||
|      * @param function the function that the operator calls. |      * @param function the function that the operator calls. | ||||||
|      */ |      */ | ||||||
|     public Operator(OperatorAssociativity associativity, int precedence, Function function){ |     public Operator(OperatorAssociativity associativity, OperatorType operatorType, int precedence, Function function){ | ||||||
|         this.associativity = associativity; |         this.associativity = associativity; | ||||||
|         this.precedence = precedence; |         this.precedence = precedence; | ||||||
|         this.function = function; |         this.function = function; | ||||||
| @ -38,6 +42,14 @@ public class Operator { | |||||||
|         return associativity; |         return associativity; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets the operator's type. | ||||||
|  |      * @return the type. | ||||||
|  |      */ | ||||||
|  |     public OperatorType getType() { | ||||||
|  |         return type; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the operator's precedence. |      * Gets the operator's precedence. | ||||||
|      * @return the precedence. |      * @return the precedence. | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								src/org/nwapw/abacus/function/OperatorType.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/org/nwapw/abacus/function/OperatorType.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | package org.nwapw.abacus.function; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type of an operator, describing how it should behave. | ||||||
|  |  */ | ||||||
|  | public enum OperatorType { | ||||||
|  |     BINARY_INFIX, UNARY_POSTFIX | ||||||
|  | } | ||||||
| @ -3,6 +3,7 @@ package org.nwapw.abacus.plugin; | |||||||
| import org.nwapw.abacus.function.Function; | import org.nwapw.abacus.function.Function; | ||||||
| import org.nwapw.abacus.function.Operator; | import org.nwapw.abacus.function.Operator; | ||||||
| import org.nwapw.abacus.function.OperatorAssociativity; | import org.nwapw.abacus.function.OperatorAssociativity; | ||||||
|  | import org.nwapw.abacus.function.OperatorType; | ||||||
| import org.nwapw.abacus.number.NaiveNumber; | import org.nwapw.abacus.number.NaiveNumber; | ||||||
| import org.nwapw.abacus.number.NumberInterface; | import org.nwapw.abacus.number.NumberInterface; | ||||||
| 
 | 
 | ||||||
| @ -20,7 +21,7 @@ public class StandardPlugin extends Plugin { | |||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void onEnable() { |     public void onEnable() { | ||||||
|         registerOperator("+", new Operator(OperatorAssociativity.LEFT, 0, new Function() { |         registerOperator("+", new Operator(OperatorAssociativity.LEFT, OperatorType.BINARY_INFIX, 0, new Function() { | ||||||
|             @Override |             @Override | ||||||
|             protected boolean matchesParams(NumberInterface[] params) { |             protected boolean matchesParams(NumberInterface[] params) { | ||||||
|                 return params.length >= 1; |                 return params.length >= 1; | ||||||
| @ -36,7 +37,7 @@ public class StandardPlugin extends Plugin { | |||||||
|             } |             } | ||||||
|         })); |         })); | ||||||
| 
 | 
 | ||||||
|         registerOperator("-", new Operator(OperatorAssociativity.LEFT, 0, new Function() { |         registerOperator("-", new Operator(OperatorAssociativity.LEFT, OperatorType.BINARY_INFIX, 0, new Function() { | ||||||
|             @Override |             @Override | ||||||
|             protected boolean matchesParams(NumberInterface[] params) { |             protected boolean matchesParams(NumberInterface[] params) { | ||||||
|                 return params.length == 2; |                 return params.length == 2; | ||||||
| @ -48,7 +49,7 @@ public class StandardPlugin extends Plugin { | |||||||
|             } |             } | ||||||
|         })); |         })); | ||||||
| 
 | 
 | ||||||
|         registerOperator("*", new Operator(OperatorAssociativity.LEFT, 1, new Function() { |         registerOperator("*", new Operator(OperatorAssociativity.LEFT, OperatorType.BINARY_INFIX,1, new Function() { | ||||||
|             @Override |             @Override | ||||||
|             protected boolean matchesParams(NumberInterface[] params) { |             protected boolean matchesParams(NumberInterface[] params) { | ||||||
|                 return params.length >= 1; |                 return params.length >= 1; | ||||||
| @ -64,7 +65,7 @@ public class StandardPlugin extends Plugin { | |||||||
|             } |             } | ||||||
|         })); |         })); | ||||||
| 
 | 
 | ||||||
|         registerOperator("/", new Operator(OperatorAssociativity.LEFT, 1, new Function() { |         registerOperator("/", new Operator(OperatorAssociativity.LEFT, OperatorType.BINARY_INFIX,1, new Function() { | ||||||
|             @Override |             @Override | ||||||
|             protected boolean matchesParams(NumberInterface[] params) { |             protected boolean matchesParams(NumberInterface[] params) { | ||||||
|                 return params.length == 2; |                 return params.length == 2; | ||||||
| @ -76,7 +77,7 @@ public class StandardPlugin extends Plugin { | |||||||
|             } |             } | ||||||
|         })); |         })); | ||||||
| 
 | 
 | ||||||
|         registerOperator("^", new Operator(OperatorAssociativity.RIGHT, 2, new Function() { |         registerOperator("^", new Operator(OperatorAssociativity.RIGHT, OperatorType.BINARY_INFIX, 2, new Function() { | ||||||
|             @Override |             @Override | ||||||
|             protected boolean matchesParams(NumberInterface[] params) { |             protected boolean matchesParams(NumberInterface[] params) { | ||||||
|                 return params.length == 2; |                 return params.length == 2; | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package org.nwapw.abacus.tree; | package org.nwapw.abacus.tree; | ||||||
| 
 | 
 | ||||||
| import org.nwapw.abacus.function.OperatorAssociativity; | import org.nwapw.abacus.function.OperatorAssociativity; | ||||||
|  | import org.nwapw.abacus.function.OperatorType; | ||||||
| import org.nwapw.abacus.lexing.Lexer; | import org.nwapw.abacus.lexing.Lexer; | ||||||
| import org.nwapw.abacus.lexing.pattern.Match; | import org.nwapw.abacus.lexing.pattern.Match; | ||||||
| import org.nwapw.abacus.lexing.pattern.Pattern; | import org.nwapw.abacus.lexing.pattern.Pattern; | ||||||
| @ -24,6 +25,10 @@ public class TreeBuilder { | |||||||
|      * The map of operator associativity. |      * The map of operator associativity. | ||||||
|      */ |      */ | ||||||
|     private Map<String, OperatorAssociativity> associativityMap; |     private Map<String, OperatorAssociativity> associativityMap; | ||||||
|  |     /** | ||||||
|  |      * The map of operator types. | ||||||
|  |      */ | ||||||
|  |     private Map<String, OperatorType> typeMap; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Comparator used to sort token types. |      * Comparator used to sort token types. | ||||||
| @ -43,6 +48,7 @@ public class TreeBuilder { | |||||||
|         }}; |         }}; | ||||||
|         precedenceMap = new HashMap<>(); |         precedenceMap = new HashMap<>(); | ||||||
|         associativityMap = new HashMap<>(); |         associativityMap = new HashMap<>(); | ||||||
|  |         typeMap = new HashMap<>(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -59,10 +65,12 @@ public class TreeBuilder { | |||||||
|      * @param precedence the precedence of the operator. |      * @param precedence the precedence of the operator. | ||||||
|      * @param associativity the associativity of the operator. |      * @param associativity the associativity of the operator. | ||||||
|      */ |      */ | ||||||
|     public void registerOperator(String operator, int precedence, OperatorAssociativity associativity){ |     public void registerOperator(String operator, OperatorAssociativity associativity, | ||||||
|  |                                  OperatorType operatorType, int precedence){ | ||||||
|         lexer.register(Pattern.sanitize(operator), TokenType.OP); |         lexer.register(Pattern.sanitize(operator), TokenType.OP); | ||||||
|         precedenceMap.put(operator, precedence); |         precedenceMap.put(operator, precedence); | ||||||
|         associativityMap.put(operator, associativity); |         associativityMap.put(operator, associativity); | ||||||
|  |         typeMap.put(operator, operatorType); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -269,7 +269,10 @@ public class Window extends JFrame implements PluginListener { | |||||||
|         } |         } | ||||||
|         for(String operator : manager.getAllOperators()){ |         for(String operator : manager.getAllOperators()){ | ||||||
|             Operator operatorObject = manager.operatorFor(operator); |             Operator operatorObject = manager.operatorFor(operator); | ||||||
|             builder.registerOperator(operator, operatorObject.getPrecedence(), operatorObject.getAssociativity()); |             builder.registerOperator(operator, | ||||||
|  |                     operatorObject.getAssociativity(), | ||||||
|  |                     operatorObject.getType(), | ||||||
|  |                     operatorObject.getPrecedence()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user