Skip to main content
Arduino

Return to Answer

basic interactive console
Source Link

Your example

12 + (2 * 5)
 = 22

Since term is known at compile-time, this example is not very useful, and it simply outputs 22 in an endless loop.

Basic interactive console

If you use the input from Serial, you can write a very basic interactive console. A String has been used for conciseness, but this example could be rewritten with cstrings :

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 if (Serial.available() > 0) {
 String expression = Serial.readStringUntil('\n');
 Serial.print("> ");
 Serial.println(expression);
 int error;
 double result = te_interp(expression.c_str(), &error);
 if (error) {
 Serial.print(" ");
 for (int i = 0; i < error; i++) {
 Serial.print(" ");
 }
 Serial.println("↑");
 Serial.println("I didn't understand this part.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 }
 delay(50);
}
> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038

If there's a syntax error somewhere, error tells you the position of the first encountered error:

> 3 + 
 ↑
I didn't understand this part.
> sin() * 5
 ↑
I didn't understand this part.
> 3 / (4 + 5 * 7
 ↑
I didn't understand this part.
12 + (2 * 5)
 = 22
> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038

Your example

12 + (2 * 5)
 = 22

Since term is known at compile-time, this example is not very useful, and it simply outputs 22 in an endless loop.

Basic interactive console

If you use the input from Serial, you can write a very basic interactive console. A String has been used for conciseness, but this example could be rewritten with cstrings :

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 if (Serial.available() > 0) {
 String expression = Serial.readStringUntil('\n');
 Serial.print("> ");
 Serial.println(expression);
 int error;
 double result = te_interp(expression.c_str(), &error);
 if (error) {
 Serial.print(" ");
 for (int i = 0; i < error; i++) {
 Serial.print(" ");
 }
 Serial.println("↑");
 Serial.println("I didn't understand this part.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 }
 delay(50);
}
> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038

If there's a syntax error somewhere, error tells you the position of the first encountered error:

> 3 + 
 ↑
I didn't understand this part.
> sin() * 5
 ↑
I didn't understand this part.
> 3 / (4 + 5 * 7
 ↑
I didn't understand this part.
deleted 2 characters in body
Source Link

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.cppc next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22

TinyExpr knows the order of operations, and it understands many other mathematical expressions:

> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.cpp next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22

TinyExpr knows the order of operations, and it understands many other mathematical expressions:

> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.c next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22

TinyExpr knows the order of operations, and it understands many other mathematical expressions:

> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038
Better output thanks to %.10g
Source Link

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.cpp next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.printprintf(" = ");
  Serial%.println(10g\n", result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22.00

TinyExpr knows the order of operations, so 12 + 2 * 5 would also return 22.00.

It alsoand it understands many other mathematical expressions:

> 12 + 2 * 5
 = 22
> 3^5
 = 243.00
> exp(7)
 = 1096.63633158
> (1 + sqrt(5)) / 2
 = 1.62618033989
> 1 + 2 * 3 + 4 * 5
 = 27.00
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.008660254038

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.cpp next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.print(" = ");
  Serial.println(result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22.00

TinyExpr knows the order of operations, so 12 + 2 * 5 would also return 22.00.

It also understands other mathematical expressions:

> 3^5
 = 243.00
> exp(7)
 = 1096.63
> (1 + sqrt(5)) / 2
 = 1.62
> 1 + 2 * 3 + 4 * 5
 = 27.00
> sin(pi/2)
 = 1.00

TinyExpr does what you want, and more.

TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to evaluation math expressions at runtime without adding a bunch of cruft to you project.

In addition to the standard math operators and precedence, TinyExpr also supports the standard C math functions and runtime binding of variables.

You'd just need to save tinyexpr.h and tinyexpr.cpp next to your Sketch.

#include "tinyexpr.h"
void setup() {
 Serial.begin(115200);
}
void loop() {
 char term[] = "12 + (2 * 5)";
 Serial.println(term);
 int error;
 double result = te_interp(term, &error);
 if (error){
 Serial.println("Problem with expression.");
 } else {
 Serial.printf(" = %.10g\n", result);
 }
 delay(1000);
}

It outputs:

12 + (2 * 5)
 = 22

TinyExpr knows the order of operations, and it understands many other mathematical expressions:

> 12 + 2 * 5
 = 22
> 3^5
 = 243
> exp(7)
 = 1096.633158
> (1 + sqrt(5)) / 2
 = 1.618033989
> 1 + 2 * 3 + 4 * 5
 = 27
> sin(pi/2)
 = 1
> sin(pi/3)
 = 0.8660254038
added 218 characters in body
Source Link
Loading
Source Link
Loading

AltStyle によって変換されたページ (->オリジナル) /