/* Coco/R lexer and parser specification for arithmetic expressions. */ /* 2006-09-14 */ /* Build with: * Coco.exe -namespace Expressions Expressions.ATG */ using System.Collections.Generic; COMPILER Expressions public Expression expression; /*--------------------------------------------------------------------------*/ CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". digit = "0123456789". cr = '\r'. lf = '\n'. tab = '\t'. TOKENS ident = letter {letter | digit}. number = digit {digit}. IGNORE cr + lf + tab PRODUCTIONS /*------------------------------------------------------------------------*/ Expr (. Expression e1, e2; Operator op; e = null; .) = SimExpr (. e = e1; .) [ RelOp SimExpr (. e = new BinOp(op, e, e2); .) ] . /*------------------------------------------------------------------------*/ SimExpr (. Expression e1, e2; Operator op; .) = Term (. e = e1; .) { AddOp Term (. e = new BinOp(op, e, e2); .) } . /*------------------------------------------------------------------------*/ RelOp (. op = Operator.Bad; .) = ( "==" (. op = Operator.Eq; .) | "!=" (. op = Operator.Ne; .) | "<" (. op = Operator.Lt; .) | "<=" (. op = Operator.Le; .) | ">" (. op = Operator.Gt; .) | ">=" (. op = Operator.Ge; .) ) . /*------------------------------------------------------------------------*/ Term (. Operator op; Expression e1, e2; .) = Factor (. e = e1; .) { MulOp Factor (. e = new BinOp(op, e, e2); .) } . /*------------------------------------------------------------------------*/ AddOp (. op = Operator.Bad; .) = ( '+' (. op = Operator.Add; .) | '-' (. op = Operator.Sub; .) ) . /*------------------------------------------------------------------------*/ Factor (. String name; Expression e1; e = null; .) = ( Ident (. e = new Variable(name); .) | number (. e = new Constant(Convert.ToInt32(t.val), Type.intType); .) | '-' Factor (. e = new UnOp(Operator.Neg, e1); .) | '(' Expr ')' (. e = e1; .) ) . /*------------------------------------------------------------------------*/ MulOp (. op = Operator.Bad; .) = ( '*' (. op = Operator.Mul; .) | '/' (. op = Operator.Div; .) ) . /*------------------------------------------------------------------------*/ Ident = ident (. name = t.val; .) . /*------------------------------------------------------------------------*/ Expressions (. Expression e; .) = Expr (. expression = e; .) . END Expressions.