算術,比較,論理演算子の優先順位付けを行うようにした.
1 parent 33be407 commit 867db762bf54e62d837c43ed40d229821e47d802
Naoya Nitta authored on 25 Aug
Showing 1 changed file
View
47
AlgebraicDataflowArchitectureModel/src/parser/Parser.java
stream.next();
} else if (operator.equals(OR)) {
operators.add(DataTransferModel.or);
stream.next();
} else if (operator.equals(NEG)) {
operators.add(DataTransferModel.neg);
stream.next();
} else if (operator.equals(DOT)) {
// json accessor
Expression exp = expressions.remove(0);
stream.next(); // DOT
ArrayList<Expression> monomials = new ArrayList<>();
ArrayList<Symbol> addSubs = new ArrayList<>();
Expression first = expressions.get(0);
int i = 1;
Term rootTerm = null;
for (Symbol op: operators) {
Expression second = expressions.get(i);
if (op.getName().equals(MUL) || op.getName().equals(DIV) || op.getName().equals(MOD)
|| op.getName().equals(EQ) || op.getName().equals(NEQ) || op.getName().equals(GT) || op.getName().equals(LT)
|| op.getName().equals(GE) || op.getName().equals(LE) || op.getName().equals(AND) || op.getName().equals(OR)) {
if (op.getName().equals(MUL) || op.getName().equals(DIV) || op.getName().equals(MOD)) {
// higher priority than add and sub
Term term = new Term(op);
term.addChild(first);
term.addChild(second);
first = term;
} else if (op.getName().equals(EQ) || op.getName().equals(NEQ) || op.getName().equals(GT) || op.getName().equals(LT)
|| op.getName().equals(GE) || op.getName().equals(LE) || op.getName().equals(AND) || op.getName().equals(OR)) {
// lower priority than add and sub
if (first != null) monomials.add(first);
Expression firstMonomial = monomials.get(0);
i = 1;
for (Symbol op2: addSubs) {
Expression secondMonomial = monomials.get(i);
Term term = new Term(op2);
term.addChild(firstMonomial);
term.addChild(secondMonomial);
firstMonomial = term;
i++;
}
if (rootTerm == null) {
rootTerm = new Term(op);
rootTerm.addChild(firstMonomial);
} else {
rootTerm.addChild(firstMonomial);
firstMonomial = rootTerm;
rootTerm = new Term(op);
rootTerm.addChild(firstMonomial);
}
monomials.clear();
addSubs.clear();
} else {
// add or sub ==> new monomial
monomials.add(first);
addSubs.add(op);
term.addChild(secondMonomial);
firstMonomial = term;
i++;
}
return firstMonomial;
if (rootTerm == null) {
return firstMonomial;
} else {
rootTerm.addChild(firstMonomial);
return rootTerm;
}
}
 
private Expression parseJsonTerm(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon {
Term jsonTerm = new Constant(DataConstraintModel.nil);