diff --git a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java index b42a607..3697787 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java @@ -63,6 +63,10 @@ public static final String SINGLE_LINE_COMMENT = "//"; public static final String SINGLE_LINE_COMMENT_REGX = "\\/\\/"; + public static final String MULTILINE_COMMENT_START = "/*"; + public static final String MULTILINE_COMMENT_START_REGX = "\\/\\*"; + public static final String MULTILINE_COMMENT_END = "*/"; + public static final String MULTILINE_COMMENT_END_REGX = "\\*\\/"; public Parser(final TokenStream stream) { this.stream = stream; @@ -75,23 +79,18 @@ while ((line = reader.readLine()) != null) { stream.addLine(line); } + stream.removeMultilineComments(); reader.close(); } catch (IOException e) { e.printStackTrace(); } } - public DataTransferModel doParse() - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, - ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public DataTransferModel doParse() throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { return parseDataFlowModel(); } - public DataTransferModel parseDataFlowModel() - throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, - ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public DataTransferModel parseDataFlowModel() throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferModel model = new DataTransferModel(); DataTransferChannel channel; while ((channel = parseChannel(model)) != null) { @@ -104,11 +103,7 @@ return model; } - public DataTransferChannel parseChannel(DataTransferModel model) - throws ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedAssignment, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, - ExpectedChannel, ExpectedChannelName, ExpectedInOrOutOrRefOrSubKeyword, - ExpectedStateTransition, ExpectedEquals, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public DataTransferChannel parseChannel(DataTransferModel model) throws ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedAssignment, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedChannel, ExpectedChannelName, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { if (!stream.hasNext()) return null; if (stream.checkNext().equals(RIGHT_CURLY_BRACKET)) return null; @@ -190,9 +185,7 @@ return channel; } - public void parseInit(DataTransferModel model) - throws ExpectedLeftCurlyBracket, ExpectedAssignment, ExpectedRHSExpression, WrongRHSExpression, - ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public void parseInit(DataTransferModel model) throws ExpectedLeftCurlyBracket, ExpectedAssignment, ExpectedRHSExpression, WrongRHSExpression, ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { String leftBracket = stream.next(); if (!leftBracket.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); while (stream.hasNext() && !stream.checkNext().equals(RIGHT_CURLY_BRACKET)) { @@ -218,9 +211,7 @@ if (stream.hasNext()) stream.next(); } - public ChannelMember parseChannelMember(DataTransferModel model, final String inOrOutOrRef) - throws ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedStateTransition, ExpectedEquals, - ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public ChannelMember parseChannelMember(DataTransferModel model, final String inOrOutOrRef) throws ExpectedRightBracket, ExpectedRightCurlyBracket, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { if (!stream.hasNext()) throw new ExpectedStateTransition(stream.getLine()); StateTransitionTerm leftTerm = parseStateTransitionTerm(stream, model); if (leftTerm == null || !(leftTerm instanceof Term)) throw new WrongLHSExpression(stream.getLine()); @@ -507,8 +498,7 @@ 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)) { + } 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.getFirst(); @@ -634,8 +624,7 @@ return var; } - public StateTransitionTerm parseStateTransitionTerm(TokenStream stream, DataTransferModel model) - throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public StateTransitionTerm parseStateTransitionTerm(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ResourcePath resourcePath = parseResourcePath(stream, model); StateTransitionTerm term = new StateTransitionTerm(resourcePath); int arity = 0; @@ -652,8 +641,7 @@ return term; } - public ResourceHierarchy parseResourceHierarchy(TokenStream stream, DataTransferModel model) - throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression { + public ResourceHierarchy parseResourceHierarchy(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression { ResourceHierarchy hierarchy = null; do { String literalOrLeftCurlyBracket = stream.next(); @@ -675,8 +663,7 @@ return hierarchy; } - public ResourcePath parseResourcePath(TokenStream stream, DataTransferModel model) - throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + public ResourcePath parseResourcePath(TokenStream stream, DataTransferModel model) throws ExpectedRightBracket, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { ResourcePath path = null; do { String literalOrLeftCurlyBracket = stream.next(); @@ -738,6 +725,8 @@ return; } ArrayList tokenList = splitByDoubleQuotation(line); + tokenList = splitBy(tokenList, MULTILINE_COMMENT_START, MULTILINE_COMMENT_START_REGX); + tokenList = splitBy(tokenList, MULTILINE_COMMENT_END, MULTILINE_COMMENT_END_REGX); tokenList = splitBy(tokenList, ADD, ADD_REGX); tokenList = splitBy(tokenList, MUL, MUL_REGX); tokenList = splitBy(tokenList, SUB, SUB_REGX); @@ -765,6 +754,32 @@ tokens.add(tokenList); } + public void removeMultilineComments() { + ArrayList> newTokens = new ArrayList<>(); + boolean isComment = false; + for (ArrayList tokenList : tokens) { + ArrayList newTokenList = new ArrayList<>(); + for (Token token : tokenList) { + if (token.getTokenStr().equals(MULTILINE_COMMENT_START)) { + isComment = true; + continue; + } + if (token.getTokenStr().equals(MULTILINE_COMMENT_END)) { + isComment = false; + continue; + } + if (isComment) { + continue; + } + newTokenList.add(token); + } + if (!newTokenList.isEmpty()) { + newTokens.add(newTokenList); + } + } + tokens = newTokens; + } + private ArrayList splitBy(final List tokens, final String delimiter, final String delimiterRegx) { ArrayList newTokens = new ArrayList<>(); for (Token token : tokens) {