Skip to main content

module lang::java::\syntax::Disambiguate


Import this module to Disambiguate the ambiguity cause by the prefix operators +/- and infix operators +/-. An example of this ambiguity is (A) + (B) . This could be (A)(+ (B)) or(A + B). We need to have a symbol table to decide if A is a type and thus a TypeCast, or it is a field/variable access.

Java lacks operator overloading, therefore, prefix operators only work on numeric types.
Moreover, there is no support for custom covariance and contravariance.
Therefore, only if (A) is a primary/boxed numeric type can it be a prefix expression.

We therefore have added this complete but not sound disambiguation as a separate module.

These following cases will result in a incorrect parse tree:

- Shadowing of Integer/Double/Float
- An invalid type cast: (String)+(A) where A has a numeric type
(This expression would be an uncompilable, and we would disambiguate it as a infix expression)


import lang::java::\syntax::Disambiguate;


import ParseTree;
import Relation;
import List;
import Set;
import lang::java::\syntax::Java15;

function isNumeric

bool isNumeric((RefType)`Byte`)

bool isNumeric((RefType)`java.lang.Byte`)

bool isNumeric((RefType)`Character`)

bool isNumeric((RefType)`java.lang.Character`)

bool isNumeric((RefType)`Short`)

bool isNumeric((RefType)`java.lang.Short`)

bool isNumeric((RefType)`Integer`)

bool isNumeric((RefType)`java.lang.Integer`)

bool isNumeric((RefType)`Long`)

bool isNumeric((RefType)`java.lang.Long`)

bool isNumeric((RefType)`Float`)

bool isNumeric((RefType)`java.lang.Float`)

bool isNumeric((RefType)`Double`)

bool isNumeric((RefType)`java.lang.Double`)

default bool isNumeric(RefType r)

function isPrefix

bool isPrefix((Expr)`+ <Expr _>`)

bool isPrefix((Expr)`++ <Expr _>`)

bool isPrefix((Expr)`- <Expr _>`)

bool isPrefix((Expr)`-- <Expr _>`)

default bool isPrefix(Expr x)

function amb

Tree amb(set[Tree] alts)

function containsPrefixExpressions

bool containsPrefixExpressions(set[Tree] trees)

function containsPrefixExpression

bool containsPrefixExpression(Tree t)