Comments (5)
This will require some tricky changes in the parser locgic. I will leave this issue open, maybe I will find some time, or there is a clever contributor who wants to earn eternal fame and honour ... ;-)
from evalex.
I've wrote a parser that support unary operator in Kotlin.
Here is my project - https://gitlab.com/yoav-sternberg/algebraEval (it was done for learning how to parse expressions, but yes it is based on EvalEx.), if someone want to port the unary part, you are welcome.
I've find that is not so hard to support 1 char unary operator for start.
private var previousToken: Token? = null
public var index: Int = 0
override fun next(): Token {
if (index >= input.length()) throw IllegalStateException()
val token = StringBuilder()
var char = input[index]
while (char.isWhitespace() && index < input.length()) {
char = input[++index]
}
if (char.isDigit()) {
while ((Character.isDigit(char) || char == ExpressionParser.DecimalSeparator) && (index < input.length())) {
token.append(input.charAt(index++))
char = if (index == input.length()) ' ' else input[index]
}
previousToken = Token(TokenType.Number, token.toString())
return previousToken!!
} else if (char in unaryOperators.keySet() && !peek().isWhitespace()
&& (previousToken == null || "(" == previousToken!!.text || "," == previousToken!!.text
|| previousToken!!.text in operators.keySet() || previousToken!!.text in unaryOperators.keySet())) {
token.append(char)
index++
previousToken = Token(TokenType.UnaryOperator, token.toString())
return previousToken!!
} else if (char.isLetter() || char == '_') {
while ((char.isLetter() || char.isDigit() || char == '_') && index < input.length()) {
token.append(input[index++])
char = if (index == input.length()) ' ' else input[index]
}
previousToken = Token(TokenType.Name, token.toString())
return previousToken!!
} else if (char == '(') {
index++
previousToken = Token(TokenType.LeftParen, "(")
return previousToken!!
} else if (char == ')') {
index++
previousToken = Token(TokenType.RightParen, ")")
return previousToken!!
} else if (char == ',') {
index++
previousToken = Token(TokenType.Comma, ",")
return previousToken!!
} else {
while (!char.isLetter() && !char.isDigit() && char != '_' && !Character.isWhitespace(char)
&& char != '(' && char != ')' && char != ',' && index < input.length()) {
token.append(input[index])
index++
char = if (index == input.length()) ' ' else input[index]
if (char in unaryOperators) {
break
}
}
if (token.toString() !in operators.keySet()) {
throw IllegalArgumentException("Unknown operator '" + token + "' at indexition " + (index - token.length() + 1))
}
previousToken = Token(TokenType.Operator, token.toString())
return previousToken!!
}
from evalex.
Thank you very much for this code snippet!
from evalex.
'not' or '!' as a unary operator would be nice, as that is pretty common in many expressions.
from evalex.
I would love to see this added to the project. It appears it hasn't been worked on recently.
from evalex.
Related Issues (20)
- Function ACOTH(x) is missing
- using E as a variable behaves different from 1.6 release HOT 1
- acot(-1) produces wrong result HOT 1
- Using library breaks R8/Proguard HOT 4
- java.lang.AssertionError: annotation container = @com.ezylang.evalex.functions.FunctionParameters()annotation element class = interface com.ezylang.evalex.functions.FunctionParameter; missing value() method HOT 3
- Incorrect token string that causes parsing error
- Negative power returns incorrect result HOT 1
- 2ab(a+b) => ParseException Undefined function 'ab' HOT 7
- ShuntingYardConverter silently drops tokens HOT 10
- Remove variable value HOT 1
- Evaluation throws NPE when a structure value is not defined
- Caching of parsed evaluation and subtree HOT 2
- Fraction calculation, is that possible?
- Expression should provide a thread-safe api HOT 4
- BUG: Undefined operator '.' ParseException when letter 'e' is after dot '.' HOT 2
- Evaluation of asin(1.5) will throw NumberFormatException which is a bit misleading HOT 1
- Structure access with arbitrary key format HOT 5
- OutOfMemoryError/memory leak on `e.<number>` input HOT 1
- Consider some wildcards for `Map<String, Object> values` HOT 2
- Unsupported data type 'java.time.LocalDate' HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from evalex.