Giter Site home page Giter Site logo

Support for Unary operators about evalex HOT 5 CLOSED

ezylang avatar ezylang commented on June 19, 2024 1
Support for Unary operators

from evalex.

Comments (5)

uklimaschewski avatar uklimaschewski commented on June 19, 2024 1

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.

yoavst avatar yoavst commented on June 19, 2024

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.

uklimaschewski avatar uklimaschewski commented on June 19, 2024

Thank you very much for this code snippet!

from evalex.

micabytes avatar micabytes commented on June 19, 2024

'not' or '!' as a unary operator would be nice, as that is pretty common in many expressions.

from evalex.

Sub6Resources avatar Sub6Resources commented on June 19, 2024

I would love to see this added to the project. It appears it hasn't been worked on recently.

from evalex.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.