Skip to content

The simplest implementation of expressions parser which supports evaluation and formatting expressions

Notifications You must be signed in to change notification settings

tim101010101/tiny-expr-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Tiny Expr Parser

A simple parser without externally dependences

Feature

  • Format
  • Evaluate

Usage

#[test]
fn smoke() {
    let expr = "1*2 (3/(4 (-5)))";
    let ast = build_ast(expr).unwrap();

    assert_eq!(-1, eval(&ast));
    assert_eq!("1 * 2   3 / (4   (-5))", format(&ast));
}

DFA

Defination

DFA = ( StateSet, InputSet, transition_fn, start, TerminatorSet )

  • StateSet = { START, OPERATOR, ZERO, NUM }
  • InputSet = { operator, whitespace, 0, 1-9 }
  • start = START
  • TerminatorSet = { OPERATOR, ZERO, NUM }

Transition Graph

dfa

Transition Table

op ws 0 1-9
ERR E E E E
START 2 1 3 4
OPERATOR 2 1 3 4
ZERO 2 1 E E
NUM 2 1 4 4

Grammar

primitive grammar

<expr> ::= <add> 
         | <mul> 
         | <literal>
         | "(" <expr> ")" 
         ;
      
<add>  ::= <expr> (" " | "-") <expr> ;

<mul>  ::= <expr> ("*" | "/") <expr> ;

introduce operator precedence

<expr>   ::= <add> ;

<add>    ::= <add> (" " | "-") <mul>
           | <mul>
           ;

<mul>    ::= <mul> ("*" | "/") <factor> 
           | <factor>
           ;

<factor> ::= "(" <expr> ")"
           | <literal>
           ;

eliminate left recursion

<expr>   ::= <add> ;

<add>    ::= <mul> <add'> ;
<add'>   ::= (" " | "-") <mul> <add'> 
           | <empty>
           ;

<mul>    ::= <factor> <mul'> ;
<mul'>   ::= ("*" | "/") <factor> <mul'> 
           | <empty>
           ;

<factor> ::= "(" <expr> ")"
           | <literal>
           ;

simplified

<expr>   ::= <mul> ((" " | "-") <mul>)* ;

<mul>    ::= <factor> (("*" | "/") <factor>)* ;

<factor> ::= "(" <expr> ")"
           | <literal>
           ;

About

The simplest implementation of expressions parser which supports evaluation and formatting expressions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages