/* (c) https://github.com/MontiCore/monticore */ package de.monticore.expressions; /* This is a MontiCore stable grammar. * Adaptations -- if any -- are conservative. */ import de.monticore.expressions.*; /** * This grammar defines a typical standard set of operations for * expressions. This is a subset of Java as well as OCL/P, * mainly for arithmetic, comparisons, variable use (v), * attribute use (o.att), method call (foo(arg,arg2)), brackets (exp), * and array access (v[2]). * * There are also other kinds of expressions defined in the * grammars mentioned below. These expression definitions can savely be * composed if desired. * * The language developer may choose the subset of expressions * of interest and combine these with the appropriate typing infrastructure * * This modularity of expressions and associated types greatly eases * the reuse of type structures in languages similar to Java * * This grammar is part of a hierarchy of expressions, which can be found * under * https://github.com/MontiCore/monticore/blob/dev/monticore-grammar/ * src/main/grammars/de/monticore/expressions/Expressions.md * */ component grammar CommonExpressions extends ExpressionsBasis { /*=================================================================*/ /** InfixExpression is the common interface for all forms of * infixes defined there. The operator contains the concrete value, e.g. "+" */ interface InfixExpression = left:Expression operator:"" right:Expression; /*=================================================================*/ /** CallExpression is a Method-Call like foo() * Expression on the left can be an expression, like: * a Class-Name: A.f(), variable-Name a.f(), * BracketExpression ("foo"+"Bar").toLowerCase() * an expression with value of type function: f()() or a[0]() * or other Method Calls: * c.getA().getB() */ CallExpression implements Expression <240> = Expression Arguments; /*=================================================================*/ /** Field access: e.g. obj.attr or also (b ? getobject() : obj).attr * This is syntactically similar to package names: * So when the language shall also allow QualifiedNames as Expressions, * they might be parsed here. E.g. in "x.y.Person", "x" is * parsed as NameExpression, even though it is a package name. * This is to be resolved via SymbolTable. * When resolved, the AST should be restructured directly after the parsing. */ FieldAccessExpression implements Expression <290> = Expression "." Name; /*=================================================================*/ PlusPrefixExpression implements Expression <210> = "+" Expression; MinusPrefixExpression implements Expression <210> = "-" Expression; /*=================================================================*/ BooleanNotExpression implements Expression <200> = "~" Expression; LogicalNotExpression implements Expression <190> = "!" Expression; /*=================================================================*/ MultExpression implements Expression <180>, InfixExpression = left:Expression operator:"*" right:Expression; DivideExpression implements Expression <180>, InfixExpression = left:Expression operator:"/" right:Expression; ModuloExpression implements Expression <180>, InfixExpression = left:Expression operator:"%" right:Expression; PlusExpression implements Expression <170>, InfixExpression = left:Expression operator:"+" right:Expression; MinusExpression implements Expression <170>, InfixExpression = left:Expression operator:"-" right:Expression; /*=================================================================*/ LessEqualExpression implements Expression <150>, InfixExpression = left:Expression operator:"<=" right:Expression; GreaterEqualExpression implements Expression <150>, InfixExpression = left:Expression operator:">=" right:Expression; LessThanExpression implements Expression <150>, InfixExpression = left:Expression operator:"<" right:Expression; GreaterThanExpression implements Expression <150>, InfixExpression = left:Expression operator:">" right:Expression; EqualsExpression implements Expression <130>, InfixExpression = left:Expression operator:"==" right:Expression; NotEqualsExpression implements Expression <130>, InfixExpression = left:Expression operator:"!=" right:Expression; /*=================================================================*/ BooleanAndOpExpression implements Expression <120>, InfixExpression = left:Expression operator:"&&" right:Expression; BooleanOrOpExpression implements Expression <117>, InfixExpression = left:Expression operator:"||" right:Expression; /*=================================================================*/ ConditionalExpression implements Expression <114> = condition:Expression "?" trueExpression:Expression ":" falseExpression:Expression; /*=================================================================*/ BracketExpression implements Expression <310> = "(" Expression ")"; /*=================================================================*/ ArrayAccessExpression implements Expression <250> = Expression "[" indexExpression:Expression "]"; }