I\'m still on my quest for a really simple language and I know now that there are none. So I\'m writing one myself using ANTLR3.
I found a really great example in t
Bah, took the time to implement this so might as well post it, even though I was beat to the punch :)
In the grammar below I have implemented the format of variable assigning you were looking to do.
grammar Exp;
eval returns [double value]
scope
{
java.util.Hashtable varMap;
}
@init
{
$eval::varMap = new java.util.Hashtable();
}
: exp=additionExp {$value = $exp.value;}
| varList
;
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
( '+' m2=multiplyExp {$value += $m2.value;}
| '-' m2=multiplyExp {$value -= $m2.value;}
)*
;
multiplyExp returns [double value]
: a1=atomExp {$value = $a1.value;}
( '*' a2=atomExp {$value *= $a2.value;}
| '/' a2=atomExp {$value /= $a2.value;}
)*
;
atomExp returns [double value]
: n=Number {$value = Double.parseDouble($n.text);}
| v=ID {$value = $eval::varMap.get($v);}
| '(' exp=additionExp ')' {$value = $exp.value;}
;
varList
:
OPEN_BRACE assignVar (COMMA assignVar)+ CLOSE_BRACE
;
assignVar
:QUOTE var=ID n=Number QUOTE COLON { $eval::varMap.put($var, $n); }
;
Number
: ('0'..'9')+ ('.' ('0'..'9')+)?
;
WS
: (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}
;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
OPEN_BRACE
: '{'
;
CLOSE_BRACE
: '}'
;
COLON : ';';
COMMA : ',';
QUOTE : '"';
ID
: LETTER*;