YARD bin Exproperand bin Op loperand r opbin
Пример с калькулятором (YARD) bin. Expr<<operand bin. Op>> : l=operand r=( op=bin. Op r=operand { (op, r) } )* { List. fold_left ( fun l (op, r) -> op l r ) l r } ; term. Op: PLUS { ( +. ) } | MINUS { ( -. ) } ; factor. Op : MULT { ( *. ) } | DIV { ( /. ) } ; pow. Op: "^" { ( ** ) } ; pow. Expr: n=NUMBER { float n } | "(" e=expr ")" { e } ; factor: res=bin. Expr<<pow. Expr pow. Op>> { res } ; term: res=bin. Expr<<factor. Op>> { res } ; expr: res=bin. Expr<<term. Op>> { res } ;
Пример с калькулятором (ANTLR) options { language="Cpp"; } { #include <math. h> } class Calc. Parser extends Parser; expr returns [float res] { res = 0; float r = 0; bool plus = false; } : res=term ( ( PLUS { plus = true; } | MINUS { plus = false; } ) r=term { if (plus) res += r; else res -= r; } )* ;
Пример с калькулятором (ANTLR) term returns [float res] { res = 0; float r = 0; bool mult = false; } : res=factor ( ( MULT { mult = true; } | DIV { mult = false; } ) r=factor { if (mult) res *= r; else res /= r; } )* ; factor returns [float res] { res = 0; float r = 0; } : res=pow. Expr ( POW r=pow. Expr { res = pow(res, r); } )* ; pow. Expr returns [float res] { res = 0; } : i: INT { res = atof(i->get. Text(). c_str()); } | LPAREN res=expr RPAREN ;
- Slides: 9