aboutsummaryrefslogblamecommitdiff
path: root/example/math_expression/main.go
blob: b89a28b47319985544780e86103d062d98acbcae (plain) (tree)
1
2
3
4
5
6
7
8




             
                             

 






                                
             


















                                                                                                    
                          
                           
                          
                                  
                              
                                
                                







                                                    
package main

import (
	"fmt"

	"neonxp.ru/go/unilex"
)

const (
	LP unilex.LexType = iota
	RP
	NUMBER
	OPERATOR
)

func main() {
	l := unilex.New("10 * (20.0 + 30.0)")

	go l.Run(lexExpression) // Start lexer

	// Read infix expression lexems from lexer and convert them to RPN (reverse polish notation)
	rpn := infixToRPNotation(l)
	fmt.Println("RPN:", rpn)

	// Calculate RPN
	result := calculateRPN(rpn)
	fmt.Println("Result:", result)
}

func lexExpression(l *unilex.Lexer) unilex.StateFunc {
	l.AcceptWhile(" \t")
	l.Ignore() // Ignore whitespaces

	switch {
	case l.Accept("("):
		l.Emit(LP)
	case l.Accept(")"):
		l.Emit(RP)
	case unilex.ScanNumber(l):
		l.Emit(NUMBER)
	case l.Accept("+-*/^!"):
		l.Emit(OPERATOR)
	case l.Peek() == unilex.EOF:
		return nil
	default:
		return l.Errorf("Unexpected symbol")
	}

	return lexExpression
}