grammar Wolfram { } class Root { Statements* EOI } class Eos { [;] } union Statements { | Expression } // === expressions === -------------------------------------------------------------------------------------------------- class Expression { Term+ Eos? } union Term { | Prefix | Infix | InfixExpr | GroupExpr | Atomic | Suffix } text class Prefix { / [!] / } text class Infix { / [\\^+\\-*\/]=? | [\/]{2} / } class InfixExpr { '~' Expression '~' } class GroupExpr { '(' Expression ')' } text class Suffix { / ' / } class FunctionCall { '[' Expression (',' Expression)* ']' } class PartCall { '[[' Expression (',' Expression)* ']]' } // === containers === -------------------------------------------------------------------------------------------------- union Atomic { | List | Dict | Symbol | Integer } class List { '{' Expression (',' Expression)* '}' } class Dict { '<|' Expression (',' Expression)* '|>' } // === symbol === ------------------------------------------------------------------------------------------------------ atomic class Symbol { IDENTIFIER ('`' IDENTIFIER)* } text class IDENTIFIER { /[$\p{XID_start}][$\p{XID_continue}]*/ } // === string === ------------------------------------------------------------------------------------------------------ atomic class String { '"' TEXT* '"' } token { TEXT: /[^"]*/ } // === number === ------------------------------------------------------------------------------------------------------ text class Integer { /0|[1-9][0-9]*/ } // === ignores === ----------------------------------------------------------------------------------------------------- @railroad(false) hide class WhiteSpace { /\p{White_Space}+/ } @style(comment) @railroad(false) hide class Comment { '(*' (Comment | !'*)' | ANY)* '*)' }