The Grammar

Here's the complete EBNF grammar of Asha.

document = {(include | expression | comment) boe} | ε;

comment = com, {char};

include = inclusion [comment];
inclusion = library-include | file-include;
library-include = use filename;
file-include = inc filename;
filename = filechar,{filechar};

expression = exp1 [if-statement] [comment];
exp1 = exp2 {arrow exp2};
exp2 = exp3 {eqop exp3};
exp3 = exp4 {or exp4};
exp4 = exp5 {addop};
exp5 = exp6 {mulop exp6};
exp6 = exp7 {expop exp7};
exp7 = function | parentheses | value;

function = var whitestuff exp4 {exp4};

parentheses = lparen whitestuff exp4 rparen whitestuff;

if-statement = if ifexp;
ifexp = ifexp2 {ifandor ifexp2};
ifexp2 = exp4 eqop exp4;

value = whitestuff value2 whitestuff;
value2 = var | number;

var = generic | global;
generic = lochar,{namingchar};
global = [inversion],upchar,{namingchar};

number = [sign],{digit},[decimal,digit,{digit}];
whitestuff = {whitespace} [comment] [break whitespace {whitespace}];


addop = plus | minus; arrow = '->'; boe = break | ε break = ?line-break characters?; char = ?all visible characters?; com = '#'; eqop = '=' | "!=" | '&st;' | '>' | "&st;=" | ">="; expop = '^'; filechar = ?a valid character in a filename?; ifandor = "/\" | "\/"; inc = "include"; inversion = '''; lparen = '('; minus = '-'; or = '|'; plus = '+'; rparen = ')'; sign = minus; undefined = '?'; use = "use"; whitespace = ?white space characters?;