Example

Mathematical Expressions

Small expression language.

Parse mathematical statements: assignments, comparisons, calls, variables, and arithmetic.

What it shows

  • Expression covers numbers, variables, calls, groups, powers, products, and sums.
  • Sum and Product use a first value plus repeated signed or multiplicative parts.
  • Powers are recognised before products, and products before sums.
  • Statement distinguishes assignments, function definitions, and comparisons.

Try adding sqrt(x^2 + y^2) >= 10.

Specs

spec.yml
$flags: 'OPTIONAL_WHITESPACE'

Identifier: '[A-Za-z][A-Za-z0-9_]*'

MultiplicativeOperator:
  Multiply: '\*'
  Divide: '/'

AdditiveOperator:
  Plus: '\+'
  Minus: '-'

ComparisonOperator:
  GreaterOrEqual: '>='
  LessOrEqual: '<='
  NotEqual: '<>|!='
  Equal: '=='
  GreaterThan: '>'
  LessThan: '<'

Expression:

  NumberLiteral: '\d+(\.\d+)?'

  Variable: '${Identifier}(?!\s*\()'

  FunctionCall:
    $fields:
      name: Identifier
      arguments: 'Expression[]'
    $patterns: '#{name}\( (#{arguments}(, #{arguments})*)? \)'

  GroupedExpression:
    $fields:
      expression: Expression
    $patterns: '\( #{expression} \)'

  Power:
    $fields:
      base: Expression
      exponent: Expression
    $patterns: '#{base} \^ #{exponent}'

  Product:
    $fields:
      firstOperand: Expression
      operations: 'ProductOperation[]'
    $patterns: '#{firstOperand}( #{operations})+'

  Sum:
    $fields:
      firstTerm: Expression
      terms: 'SignedTerm[]'
    $patterns: '#{firstTerm}( #{terms})+'

ProductOperation:
  $fields:
    operator: MultiplicativeOperator
    operand: Expression
  $patterns: '#{operator} #{operand}'

SignedTerm:
  $fields:
    sign: AdditiveOperator
    value: Expression
  $patterns: '#{sign} #{value}'

Statement:

  Assignment:
    $fields:
      target: Variable
      value: Expression
    $patterns: '#{target} = #{value}'

  FunctionDefinition:
    $fields:
      signature: Expression::FunctionCall
      value: Expression
    $patterns: '#{signature} = #{value}'

  Comparison:
    $fields:
      left: Expression
      operator: ComparisonOperator
      right: Expression
    $patterns: '#{left} #{operator} #{right}'
Try it liveOpen Mathematical Expressions in StudioTweak the spec, paste your own input, and see the parse tree update in real time.

Or browse other examples →