From b1c4e7770192c663229c0fa8a3033fef43f610ba Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 30 Aug 2023 17:53:01 +0300 Subject: [PATCH 01/20] feat(#2399): antlr + xe listener --- .../main/antlr4/org/eolang/parser/Program.g4 | 752 +++++++----- .../main/java/org/eolang/parser/Objects.java | 27 +- .../main/java/org/eolang/parser/Syntax.java | 2 +- .../java/org/eolang/parser/XeListener.java | 1018 ++++++++++++----- .../parser/RedundantParenthesesTest.java | 2 + 5 files changed, 1229 insertions(+), 572 deletions(-) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index aa0648b56d..1afc863098 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -3,324 +3,445 @@ grammar Program; tokens { TAB, UNTAB } program - : - license? - metas? - objects - EOF - ; + : license? metas? objects EOF + ; license - : - (COMMENT EOL)* - COMMENT EOP - ; + : (COMMENT EOL)* COMMENT EOP + ; metas - : - (META EOL)* - META EOP - ; + : (META EOL)* META EOP + ; objects - : - ( - (COMMENT EOL)* - object - (EOL | EOP) - )+ - ; + : ((COMMENT EOL)* object (EOL | EOP))+ + ; object - : - ( - ( - abstraction - type? - ) - | - application - ) - tail? - ( - EOL - method - htail? - suffix? - tail? - )* - ; + : atom + | abstraction + | application + | methodNamed + | justNamed + ; + +just: beginner + | finisherOrCopy + | versioned + ; + +justNamed + : just oname? + ; + +justHas + : just has + ; + +justHasNamed + : justHas oname? + ; + +atom: ahead suffix type + ; abstraction - : - (COMMENT EOL)* - attributes - ; - -type - : - suffix - SPACE - SLASH - (NAME | QUESTION)? - ; + : ahead suffix inners? + ; + +inners + : EOL TAB (object (EOL | EOP))+ UNTAB + ; attributes - : - LSQ - ( - (attribute (SPACE attribute)* (SPACE vararg)?)? - | - vararg - ) - RSQ - ; + : LSQ + ((attribute (SPACE attribute)* (SPACE vararg)?)? | vararg) + RSQ + ; attribute - : - label - ; + : NAME + ; + +type: SPACE SLASH (NAME | QUESTION)? + ; vararg - : - label - DOTS - ; + : NAME DOTS + ; -label - : - AT - | - NAME - ; - -tail - : - EOL - TAB - (object (EOL | EOP))+ - UNTAB - ; +application + : happlicationNamed + | vapplication + ; -suffix - : - SPACE - ARROW - SPACE - label - CONST? - ; +happlication + : happlicationHead happlicationTail + ; + +happlicationNamed + : happlication oname? + ; + +happlicationHead + : vmethod + | hmethod + | applicable + ; + +applicable + : STAR + | (NAME | AT) COPY? + ; + +happlicationTail + : (SPACE (happlicationArg | happlicationArgHas))+ + ; + +happlicationArg + : beginner + | finisherOrCopy + | DOTS? (spreadable | hmethod | scope) + ; + +happlicationArgHas + : happlicationArg has + ; + +vapplication + : vapplicationHeadNamed vapplicationArgs + ; + +vapplicationHead + : applicable + | hmethod + | hmethodVersioned + | vmethod + | vmethodVersioned + | reversed + | versioned + ; + +vapplicationHeadNamed + : vapplicationHead oname? + ; + +vapplicationArgs + : EOL + TAB + ( + ( vapplicationArgAbstract + | vapplicationArgHapplicationNamed + | vapplicationArgVapplicationNamed + | justNamed + | justHasNamed + | methodNamed + | methodHasNamed + | vapplicationArgSpreadable + ) + (EOL | EOP) + )+ + UNTAB + ; + +vapplicationArgSpreadable + : DOTS? + ( just + | justHas + | method + | methodHas + | vapplicationArgHapplication + | vapplicationArgVapplication + ) + ; + +vapplicationArgHapplication + : happlication + | LB happlication RB has + ; + +vapplicationArgHapplicationNamed + : vapplicationArgHapplication oname? + ; + +vapplicationArgVapplication + : (vapplicationHead | vapplicationHeadHas) vapplicationArgs + ; + +vapplicationArgVapplicationNamed + : (vapplicationHeadNamed | vapplicationHeadHasNamed) vapplicationArgs + ; + +vapplicationHeadHas + : (applicable | hmethod | hmethodVersioned | reversed | versioned) has + ; + +vapplicationHeadHasNamed + : vapplicationHeadHas oname? + ; + +vapplicationArgAbstract + : attributes has? suffix? abstractees? + ; + +abstractees + : EOL + TAB + ((innerabstract | application | justNamed | methodNamed) (EOL | EOP))+ + UNTAB + ; + +innerabstract + : ahead suffix? abstractees? + ; + +ahead + : (COMMENT EOL)* attributes + ; method - : - DOT - mtd=( - NAME - | - RHO - | - SIGMA - | - AT - | - VERTEX - ) - COPY? - ; + : hmethod + | hmethodVersioned + | vmethod + | vmethodVersioned + ; -scope - : - LB - application - RB -; +methodNamed + : method oname? + ; -application - : - head - version - | - abstraction - htail? - | - head - htail? - | - application - method - htail? - | - application - method - version - suffix? - | - scope - htail? - | - application - has - htail? - | - application - suffix - ; - -htail - : - ( - SPACE - application - method - | - SPACE - head - | - SPACE - scope - | - SPACE - application - has - | - SPACE - application - suffix - | - SPACE - abstraction - suffix? - )+ - ; - -head - : - DOTS? - ( - ROOT - | - HOME - | - ( - AT - | - RHO - | - XI - | - SIGMA - ) - DOT? - | - STAR - | - NAME - COPY? - | - ( - NAME - | - VERTEX - ) - DOT - | - data - ) - ; +methodHas + : (hmethod | hmethodVersioned) has + ; + +methodHasNamed + : methodHas oname? + ; + +hmethod + : hmethodHead methodTail+ + ; + +hmethodVersioned + : hmethodHead methodTail* methodTailVersioned + ; + +hmethodHead + : beginner + | finisherOrCopy + | scope + ; + +vmethod + : vmethodHead vmethodTail + ; + +vmethodVersioned + : vmethodHead vmethodTailVersioned + ; + +vmethodHead + : vmethodHead (vmethodTail | vmethodTailVersioned) oname? + | hmethod oname? + | hmethodVersioned oname? + | vmethodHead (vmethodTail | vmethodTailVersioned) oname? vapplicationArgs oname? + | (applicable | hmethod | hmethodVersioned | reversed | versioned) oname? vapplicationArgs oname? + | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTail oname? + | (applicable | hmethod) happlicationTail oname? + | justNamed + ; + +vmethodTail + : EOL methodTail + ; + +vmethodTailVersioned + : EOL methodTailVersioned + ; + +methodTail + : DOT mtd + ; + +methodTailVersioned + : DOT mtdVersioned + ; + +beginner + : STAR + | ROOT + | HOME + | XI + | data + ; + +finisher + : NAME + | AT + | RHO + | SIGMA + | VERTEX + ; + +spreadable + : (NAME | AT | RHO | SIGMA) COPY? + ; + +mtd : finisherOrCopy + ; + +mtdVersioned + : NAME version? + ; + +finisherOrCopy + : finisher COPY? + ; + +versioned + : NAME version? + ; + +reversed + : finisher DOT + ; + +oname + : suffix CONST? + ; + +suffix + : SPACE ARROW SPACE label + ; + +label + : AT + | NAME + ; + +scope + : LB (happlication | hmethod) RB + ; version - : - BAR - VER - ; - -has - : - COLON - ( - NAME - | - RHO - ) - ; - -data - : - BYTES - | - BOOL - | - TEXT - | - STRING - | - INT - | - FLOAT - | - HEX - ; - -COMMENT: HASH | (HASH ~[\r\n]* ~[\r\n\t ]); -META: PLUS NAME (SPACE ~[\r\n]+)?; - -ROOT: 'Q'; -HOME: 'QQ'; -STAR: '*'; -DOTS: '...'; -CONST: '!'; -SLASH: '/'; -COLON: ':'; -COPY: '\''; -ARROW: '>'; -VERTEX: '<'; -SIGMA: '&'; -XI: '$'; -PLUS: '+'; -MINUS: '-'; -QUESTION: '?'; -SPACE: ' '; -DOT: '.'; -LSQ: '['; -RSQ: ']'; -LB: '('; -RB: ')'; -AT: '@'; -RHO: '^'; -HASH: '#'; -BAR: '|'; - -fragment INDENT: - SPACE SPACE - ; -fragment LINEBREAK: - ('\n' | '\r\n') - ; - -EOL - : - LINEBREAK - INDENT* - ; - -EOP - : - LINEBREAK - LINEBREAK - INDENT* - ; - -fragment BYTE: [0-9A-F][0-9A-F]; -fragment EMPTY_BYTES : MINUS MINUS; -fragment LINE_BYTES : BYTE (MINUS BYTE)+; - -BYTES: - EMPTY_BYTES - | BYTE MINUS - | LINE_BYTES (MINUS EOL LINE_BYTES)*; - -BOOL: 'TRUE' | 'FALSE'; -STRING: '"' (~["\\\r\n] | ESCAPE_SEQUENCE)* '"'; + : BAR VER + ; + +has : COLON (NAME | RHO) + ; + +data: BYTES + | BOOL + | TEXT + | STRING + | INT + | FLOAT + | HEX + ; + +COMMENT + : HASH + | (HASH ~[\r\n]* ~[\r\n\t ]) + ; +META: PLUS NAME (SPACE ~[\r\n]+)? + ; + +ROOT: 'Q' + ; +HOME: 'QQ' + ; +STAR: '*' + ; +DOTS: '...' + ; +CONST + : '!' + ; +SLASH + : '/' + ; +COLON + : ':' + ; +COPY: '\'' + ; +ARROW + : '>' + ; +VERTEX + : '<' + ; +SIGMA + : '&' + ; +XI : '$' + ; +PLUS: '+' + ; +MINUS + : '-' + ; +QUESTION + : '?' + ; +SPACE + : ' ' + ; +DOT : '.' + ; +LSQ : '[' + ; +RSQ : ']' + ; +LB : '(' + ; +RB : ')' + ; +AT : '@' + ; +RHO : '^' + ; +HASH: '#' + ; +BAR : '|' + ; + +fragment INDENT + : SPACE SPACE + ; + +fragment LINEBREAK + : '\n' + | '\r\n' + ; + +EOL : LINEBREAK INDENT* + ; + +EOP : LINEBREAK LINEBREAK INDENT* + ; + +fragment BYTE + : [0-9A-F][0-9A-F] + ; + +fragment EMPTY_BYTES + : MINUS MINUS + ; +fragment LINE_BYTES + : BYTE (MINUS BYTE)+ + ; + +BYTES + : EMPTY_BYTES + | BYTE MINUS + | LINE_BYTES (MINUS EOL LINE_BYTES)* + ; + +BOOL: 'TRUE' + | 'FALSE' + ; fragment ESCAPE_SEQUENCE : '\\' [btnfr"'\\] @@ -328,21 +449,38 @@ fragment ESCAPE_SEQUENCE | '\\' 'u'+ BYTE BYTE ; -fragment ZERO: - '0'; +STRING + : '"' (~["\\\r\n] | ESCAPE_SEQUENCE)* '"' + ; -INT: (PLUS | MINUS)? (ZERO | ZERO?[1-9][0-9]*); +fragment ZERO + : '0' + ; -fragment EXPONENT: ('e'|'E') (PLUS | MINUS)? ('0'..'9')+; -FLOAT: (PLUS | MINUS)? [0-9]+ DOT [0-9]+ EXPONENT?; -HEX: '0x' [0-9a-fA-F]+; +INT : (PLUS | MINUS)? (ZERO | ZERO?[1-9][0-9]*) + ; -NAME: [a-z] ~[ \r\n\t,.|':;!?\][}{)(]*; -VER: [0-9]+ DOT [0-9]+ DOT [0-9]+; +fragment EXPONENT + : ('e'|'E') (PLUS | MINUS)? ('0'..'9')+ + ; + +FLOAT + : + (PLUS | MINUS)? [0-9]+ DOT [0-9]+ EXPONENT? + ; + +HEX : '0x' [0-9a-fA-F]+ + ; + +NAME: [a-z] ~[ \r\n\t,.|':;!?\][}{)(]* + ; + +VER : [0-9]+ DOT [0-9]+ DOT [0-9]+ + ; + +fragment TEXT_MARK + : '"""' + ; -fragment TEXT_MARK: '"""'; -TEXT: - TEXT_MARK ('\n' | '\r\n') - (~[\\] | ESCAPE_SEQUENCE)*? - TEXT_MARK +TEXT: TEXT_MARK ('\n' | '\r\n') (~[\\] | ESCAPE_SEQUENCE)*? TEXT_MARK ; diff --git a/eo-parser/src/main/java/org/eolang/parser/Objects.java b/eo-parser/src/main/java/org/eolang/parser/Objects.java index 3f8bb482ee..3e2e54eb26 100644 --- a/eo-parser/src/main/java/org/eolang/parser/Objects.java +++ b/eo-parser/src/main/java/org/eolang/parser/Objects.java @@ -56,6 +56,19 @@ interface Objects extends Iterable { */ void prop(String key, Object value); + /** + * Empty propery. + * @param key Key. + */ + void prop(String key); + + /** + * Change property by given xpath. + * @param key Key. + * @param xpath Xpath. + */ + void xprop(String key, Object xpath); + /** * Enter last object. */ @@ -67,12 +80,12 @@ interface Objects extends Iterable { void leave(); /** - * Mark next object for scoping. + * Mark the next object for scoping. */ void scope(); /** - * Mark current object as last inside the scope. + * Mark the current object as last inside the scope. * Last object that relates to the scope. */ void closeScope(); @@ -113,6 +126,16 @@ public void prop(final String key, final Object type) { this.dirs.attr(key, type); } + @Override + public void prop(final String key) { + this.prop(key, ""); + } + + @Override + public void xprop(final String key, final Object xpath) { + this.dirs.xattr(key, xpath); + } + @Override public void enter() { this.dirs.xpath("o[last()]").strict(1); diff --git a/eo-parser/src/main/java/org/eolang/parser/Syntax.java b/eo-parser/src/main/java/org/eolang/parser/Syntax.java index ea3a4b45c1..cb5370c180 100644 --- a/eo-parser/src/main/java/org/eolang/parser/Syntax.java +++ b/eo-parser/src/main/java/org/eolang/parser/Syntax.java @@ -133,7 +133,7 @@ public void parse() throws IOException { ); parser.removeErrorListeners(); parser.addErrorListener(spy); - final XeListener xel = new XeListener(this.name, this.redundancy); + final XeListener xel = new XeListener(this.name); new ParseTreeWalker().walk(xel, parser.program()); final XML dom = new XMLDocument( new Xembler( diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 58c69abb89..7d3d085f4c 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -23,7 +23,6 @@ */ package org.eolang.parser; -import com.jcabi.manifests.Manifests; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.time.ZoneOffset; @@ -31,6 +30,8 @@ import java.time.format.DateTimeFormatter; import java.util.Iterator; import java.util.StringJoiner; + +import com.jcabi.manifests.Manifests; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.tree.ErrorNode; @@ -44,9 +45,9 @@ /** * The listener for ANTLR4 walker. * - * @since 0.1 * @checkstyle CyclomaticComplexityCheck (500 lines) * @checkstyle ClassFanOutComplexityCheck (500 lines) + * @since 0.1 */ @SuppressWarnings({"PMD.TooManyMethods", "PMD.AvoidDuplicateLiterals", "PMD.ExcessivePublicCount"}) public final class XeListener implements ProgramListener, Iterable { @@ -71,22 +72,16 @@ public final class XeListener implements ProgramListener, Iterable { */ private final long start; - /** - * Redundancy checker. - */ - private final RedundantParentheses check; - /** * Ctor. - * @param name Tha name of it - * @param check The strategy to check eo expressions for redundant parentheses. + * + * @param name The name of it */ - public XeListener(final String name, final RedundantParentheses check) { + public XeListener(final String name) { this.name = name; this.dirs = new Directives(); this.objects = new Objects.ObjXembly(); this.start = System.nanoTime(); - this.check = check; } @Override @@ -131,7 +126,7 @@ public void enterLicense(final ProgramParser.LicenseContext ctx) { @Override public void exitLicense(final ProgramParser.LicenseContext ctx) { - // This method is created by ANTLR and can't be removed + // Nothing here } @Override @@ -158,7 +153,7 @@ public void enterMetas(final ProgramParser.MetasContext ctx) { @Override public void exitMetas(final ProgramParser.MetasContext ctx) { - // This method is created by ANTLR and can't be removed + // Nothing here } @Override @@ -174,390 +169,887 @@ public void exitObjects(final ProgramParser.ObjectsContext ctx) { @Override public void enterObject(final ProgramParser.ObjectContext ctx) { - if (ctx.application() != null) { - ProgramParser.ApplicationContext application = ctx.application(); - if (application.suffix() != null) { - application = application.application(); - } - final String text = application.getText(); - if (this.check.test(text)) { - this.dirs.push() - .xpath("/program/errors") - .add("error") - .attr("line", ctx.getStart().getLine()) - .attr("severity", "warning") - .set(String.format("'%s' contains redundant parentheses", text)) - .pop(); - } - } + // Nothing here } @Override public void exitObject(final ProgramParser.ObjectContext ctx) { - // This method is created by ANTLR and can't be removed + // Nothing here } @Override - public void enterType(final ProgramParser.TypeContext ctx) { - if (ctx.SLASH() != null) { - this.objects.enter(); - if (ctx.QUESTION() == null) { - this.objects.prop("atom", ctx.NAME()); - } else { - this.objects.prop("atom", "?"); - } - this.objects.leave(); - } + public void enterJust(final ProgramParser.JustContext ctx) { + // Nothing here } @Override - public void exitType(final ProgramParser.TypeContext ctx) { + public void exitJust(final ProgramParser.JustContext ctx) { // Nothing here } @Override - public void enterAbstraction(final ProgramParser.AbstractionContext ctx) { - this.objects.start( - ctx.getStart().getLine(), - ctx.getStart().getCharPositionInLine() - ); - this.objects.prop("abstract", ""); - this.objects.leave(); + public void enterJustNamed(final ProgramParser.JustNamedContext ctx) { + // Nothing here } @Override - public void exitAbstraction(final ProgramParser.AbstractionContext ctx) { + public void exitJustNamed(final ProgramParser.JustNamedContext ctx) { // Nothing here } @Override - public void enterAttributes(final ProgramParser.AttributesContext ctx) { - // This method is created by ANTLR and can't be removed + public void enterJustHas(final ProgramParser.JustHasContext ctx) { + // Nothing here } @Override - public void exitAttributes(final ProgramParser.AttributesContext ctx) { - // This method is created by ANTLR and can't be removed + public void exitJustHas(final ProgramParser.JustHasContext ctx) { + // Nothing here } @Override - public void enterAttribute(final ProgramParser.AttributeContext ctx) { - this.objects.enter(); - this.objects.start( - ctx.getStart().getLine(), - ctx.getStart().getCharPositionInLine() - ); + public void enterJustHasNamed(final ProgramParser.JustHasNamedContext ctx) { + // Nothing here } @Override - public void exitAttribute(final ProgramParser.AttributeContext ctx) { - this.objects.leave(); - this.objects.leave(); + public void exitJustHasNamed(final ProgramParser.JustHasNamedContext ctx) { + // Nothing here } @Override - public void enterVararg(final ProgramParser.VarargContext ctx) { - this.objects.enter(); - this.objects.start( - ctx.getStart().getLine(), - ctx.getStart().getCharPositionInLine() - ); - this.objects.prop("vararg", ""); + public void enterAtom(final ProgramParser.AtomContext ctx) { + this.startObject(ctx); + if (ctx.type().QUESTION() == null) { + this.objects.prop("atom", ctx.type().NAME().getText()); + } else { + this.objects.prop("atom", ctx.type().QUESTION().getText()); + } + this.objects.leave(); } @Override - public void exitVararg(final ProgramParser.VarargContext ctx) { - this.objects.leave(); - this.objects.leave(); + public void exitAtom(final ProgramParser.AtomContext ctx) { + // Nothing here } @Override - public void enterLabel(final ProgramParser.LabelContext ctx) { - if (ctx.AT() != null) { - this.objects.prop("name", ctx.AT().getText()); - } - if (ctx.NAME() != null) { - this.objects.prop("name", ctx.NAME().getText()); - } + public void enterAbstraction(final ProgramParser.AbstractionContext ctx) { + this.startObject(ctx); + this.objects.prop("abstract"); + this.objects.leave(); } @Override - public void exitLabel(final ProgramParser.LabelContext ctx) { + public void exitAbstraction(final ProgramParser.AbstractionContext ctx) { // Nothing here } @Override - public void enterTail(final ProgramParser.TailContext ctx) { + public void enterInners(final ProgramParser.InnersContext ctx) { this.objects.enter(); } @Override - public void exitTail(final ProgramParser.TailContext ctx) { + public void exitInners(final ProgramParser.InnersContext ctx) { this.objects.leave(); } @Override - public void enterSuffix(final ProgramParser.SuffixContext ctx) { + public void enterAttributes(final ProgramParser.AttributesContext ctx) { this.objects.enter(); - if (ctx.CONST() != null) { - this.objects.prop("const", ""); - } } @Override - public void exitSuffix(final ProgramParser.SuffixContext ctx) { + public void exitAttributes(final ProgramParser.AttributesContext ctx) { this.objects.leave(); } @Override - public void enterMethod(final ProgramParser.MethodContext ctx) { - this.objects.start( - ctx.getStart().getLine(), - ctx.getStart().getCharPositionInLine() - ); - if (ctx.COPY() != null) { - this.objects.prop("copy", ""); - } - this.objects.prop("method", ""); - this.objects.prop("base", String.format(".%s", ctx.mtd.getText())); - this.objects.leave(); + public void enterAttribute(final ProgramParser.AttributeContext ctx) { + this.startObject(ctx); + this.objects.prop("base", ctx.NAME().getText()); } @Override - public void exitMethod(final ProgramParser.MethodContext ctx) { - // This method is created by ANTLR and can't be removed + public void exitAttribute(final ProgramParser.AttributeContext ctx) { + this.objects.leave(); } @Override - public void enterScope(final ProgramParser.ScopeContext ctx) { - this.objects.scope(); + public void enterType(final ProgramParser.TypeContext ctx) { + // Nothing here } @Override - public void exitScope(final ProgramParser.ScopeContext ctx) { - this.objects.closeScope(); + public void exitType(final ProgramParser.TypeContext ctx) { + // Nothing here } @Override - @SuppressWarnings("PMD.ConfusingTernary") - public void enterHead(final ProgramParser.HeadContext ctx) { - this.objects.start( - ctx.getStart().getLine(), - ctx.getStart().getCharPositionInLine() - ); - if (ctx.COPY() != null) { - this.objects.prop("copy", ""); - } - String base = ""; - if (ctx.NAME() != null) { - base = ctx.NAME().getText(); - } else if (ctx.AT() != null) { - base = "@"; - } else if (ctx.XI() != null) { - base = "$"; - } else if (ctx.STAR() != null) { - base = "tuple"; - this.objects.prop("data", "tuple"); - } else if (ctx.RHO() != null) { - base = "^"; - } else if (ctx.VERTEX() != null) { - base = "<"; - } else if (ctx.ROOT() != null) { - base = "Q"; - } else if (ctx.HOME() != null) { - base = "QQ"; - } else if (ctx.SIGMA() != null) { - base = "&"; - } - if (ctx.DOT() != null) { - base = String.format(".%s", base); - } - if (!base.isEmpty()) { - this.objects.prop("base", base); - } + public void enterVararg(final ProgramParser.VarargContext ctx) { + this.startObject(ctx); + this.objects.prop("vararg"); + this.objects.prop("base", ctx.NAME().getText()); } @Override - public void exitHead(final ProgramParser.HeadContext ctx) { - if (ctx.DOTS() != null) { - this.objects.prop("unvar", ""); - } + public void exitVararg(final ProgramParser.VarargContext ctx) { this.objects.leave(); } @Override - public void enterVersion(final ProgramParser.VersionContext ctx) { - this.objects.enter(); - if (ctx.VER() != null) { - this.objects.prop("ver", ctx.VER().getText()); - } + public void enterApplication(final ProgramParser.ApplicationContext ctx) { + // Nothing here } @Override - public void exitVersion(final ProgramParser.VersionContext ctx) { - this.objects.leave(); + public void exitApplication(final ProgramParser.ApplicationContext ctx) { + // Nothing here } @Override - public void enterHas(final ProgramParser.HasContext ctx) { - this.objects.enter(); - final String has; - if (ctx.RHO() == null) { - has = ctx.NAME().getText(); - } else { - has = "^"; - } - this.objects.prop("as", has); + public void enterHapplication(final ProgramParser.HapplicationContext ctx) { + // Nothing here } @Override - public void exitHas(final ProgramParser.HasContext ctx) { - this.objects.leave(); + public void exitHapplication(final ProgramParser.HapplicationContext ctx) { + // Nothing here } @Override - public void enterApplication(final ProgramParser.ApplicationContext ctx) { - // This method is created by ANTLR and can't be removed + public void enterHapplicationNamed(final ProgramParser.HapplicationNamedContext ctx) { + // Nothing here } @Override - public void exitApplication(final ProgramParser.ApplicationContext ctx) { - // This method is created by ANTLR and can't be removed + public void exitHapplicationNamed(final ProgramParser.HapplicationNamedContext ctx) { + // Nothing here } @Override - public void enterHtail(final ProgramParser.HtailContext ctx) { - this.objects.enter(); + public void enterHapplicationHead(final ProgramParser.HapplicationHeadContext ctx) { + // Nothing here } @Override - public void exitHtail(final ProgramParser.HtailContext ctx) { - this.objects.leave(); + public void exitHapplicationHead(final ProgramParser.HapplicationHeadContext ctx) { + // Nothing here } - // @checkstyle ExecutableStatementCountCheck (100 lines) @Override - @SuppressWarnings("PMD.ConfusingTernary") - public void enterData(final ProgramParser.DataContext ctx) { - final String type; - final String data; + public void enterApplicable(final ProgramParser.ApplicableContext ctx) { + this.startObject(ctx); final String base; - final String text = ctx.getText(); - if (ctx.BYTES() != null) { - type = "bytes"; - base = "bytes"; - data = text.replaceAll("\\s+", "").replace("-", " ").trim(); - } else if (ctx.BOOL() != null) { - type = "bytes"; - base = "bool"; - if (Boolean.parseBoolean(text)) { - data = XeListener.bytesToHex((byte) 0x01); - } else { - data = XeListener.bytesToHex((byte) 0x00); - } - } else if (ctx.FLOAT() != null) { - type = "bytes"; - base = "float"; - data = XeListener.bytesToHex( - ByteBuffer - .allocate(Long.BYTES) - .putDouble(Double.parseDouble(text)) - .array() - ); - } else if (ctx.INT() != null) { - type = "bytes"; - base = "int"; - data = XeListener.bytesToHex( - ByteBuffer - .allocate(Long.BYTES) - .putLong(Long.parseLong(text)) - .array() - ); - } else if (ctx.HEX() != null) { - type = "bytes"; - base = "int"; - data = XeListener.bytesToHex( - ByteBuffer - .allocate(Long.BYTES) - .putLong(Long.parseLong(text.substring(2), 16)) - .array() - ); - } else if (ctx.STRING() != null) { - type = "bytes"; - base = "string"; - data = XeListener.bytesToHex( - StringEscapeUtils.unescapeJava( - text.substring(1, text.length() - 1) - ).getBytes(StandardCharsets.UTF_8) - ); - } else if (ctx.TEXT() != null) { - type = "bytes"; - base = "string"; - final int indent = ctx.getStart().getCharPositionInLine(); - data = XeListener.bytesToHex( - StringEscapeUtils.unescapeJava( - XeListener.trimMargin(text, indent) - ).getBytes(StandardCharsets.UTF_8) - ); + if (ctx.STAR() != null) { + base = "tuple"; + this.objects.prop("data", "tuple"); + } else if (ctx.NAME() != null) { + base = ctx.NAME().getText(); + } else if (ctx.AT() != null) { + base = "@"; } else { - throw new ParsingException( - String.format( - "Unknown data type at line #%d", - ctx.getStart().getLine() - ), - new IllegalArgumentException(), - ctx.getStart().getLine() - ); + base = ""; + } + if (!base.isEmpty()) { + this.objects.prop("base", base); + } + if (ctx.COPY() != null) { + this.objects.prop("copy"); } - this.objects.prop("data", type); - this.objects.prop("base", base); - this.objects.data(data); } @Override - public void exitData(final ProgramParser.DataContext ctx) { - // This method is created by ANTLR and can't be removed + public void exitApplicable(final ProgramParser.ApplicableContext ctx) { + this.objects.leave(); } @Override - public void visitTerminal(final TerminalNode node) { - // This method is created by ANTLR and can't be removed + public void enterHapplicationTail(final ProgramParser.HapplicationTailContext ctx) { + this.objects.enter(); } - // We don't do anything here. We let the error nodes stay in the - // tree. Later, the syntax analysis will hit them and raise - // ParsingException, with proper information about them. Here we - // don't do anything, to not pollute the error reporting with - // duplicated. @Override - public void visitErrorNode(final ErrorNode node) { - // This method is created by ANTLR and can't be removed + public void exitHapplicationTail(final ProgramParser.HapplicationTailContext ctx) { + this.objects.leave(); } @Override - public void enterEveryRule(final ParserRuleContext ctx) { - // This method is created by ANTLR and can't be removed + public void enterHapplicationArg(final ProgramParser.HapplicationArgContext ctx) { + // Nothing here } @Override - public void exitEveryRule(final ParserRuleContext ctx) { - // This method is created by ANTLR and can't be removed + public void exitHapplicationArg(final ProgramParser.HapplicationArgContext ctx) { + if (ctx.DOTS() != null) { + this.objects.enter(); + this.objects.prop("unvar"); + this.objects.leave(); + } + } + + @Override + public void enterHapplicationArgHas(final ProgramParser.HapplicationArgHasContext ctx) { + // Nothing here + } + + @Override + public void exitHapplicationArgHas(final ProgramParser.HapplicationArgHasContext ctx) { + // Nothing here + } + + @Override + public void enterVapplication(final ProgramParser.VapplicationContext ctx) { + // Nothing here + } + + @Override + public void exitVapplication(final ProgramParser.VapplicationContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationHead(final ProgramParser.VapplicationHeadContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationHead(final ProgramParser.VapplicationHeadContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationHeadNamed(final ProgramParser.VapplicationHeadNamedContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationHeadNamed(final ProgramParser.VapplicationHeadNamedContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgs(final ProgramParser.VapplicationArgsContext ctx) { + this.objects.enter(); + } + + @Override + public void exitVapplicationArgs(final ProgramParser.VapplicationArgsContext ctx) { + this.objects.leave(); + } + + @Override + public void enterVapplicationArgSpreadable(final ProgramParser.VapplicationArgSpreadableContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgSpreadable(final ProgramParser.VapplicationArgSpreadableContext ctx) { + if (ctx.DOTS() != null) { + this.objects.enter(); + this.objects.prop("unvar"); + this.objects.leave(); + } + } + + @Override + public void enterVapplicationArgHapplication(final ProgramParser.VapplicationArgHapplicationContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgHapplication(final ProgramParser.VapplicationArgHapplicationContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgHapplicationNamed(final ProgramParser.VapplicationArgHapplicationNamedContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgHapplicationNamed(final ProgramParser.VapplicationArgHapplicationNamedContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgVapplication(final ProgramParser.VapplicationArgVapplicationContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgVapplication(final ProgramParser.VapplicationArgVapplicationContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgVapplicationNamed(final ProgramParser.VapplicationArgVapplicationNamedContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgVapplicationNamed(final ProgramParser.VapplicationArgVapplicationNamedContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationHeadHas(final ProgramParser.VapplicationHeadHasContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationHeadHas(final ProgramParser.VapplicationHeadHasContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationHeadHasNamed(final ProgramParser.VapplicationHeadHasNamedContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationHeadHasNamed(final ProgramParser.VapplicationHeadHasNamedContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgAbstract(final ProgramParser.VapplicationArgAbstractContext ctx) { + this.startObject(ctx); + this.objects.prop("abstract"); + this.objects.leave(); + } + + @Override + public void exitVapplicationArgAbstract(final ProgramParser.VapplicationArgAbstractContext ctx) { + // Nothing here + } + + @Override + public void enterAbstractees(final ProgramParser.AbstracteesContext ctx) { + this.objects.enter(); + } + + @Override + public void exitAbstractees(final ProgramParser.AbstracteesContext ctx) { + this.objects.leave(); + } + + @Override + public void enterInnerabstract(final ProgramParser.InnerabstractContext ctx) { + this.startObject(ctx); + this.objects.prop("abstract"); + this.objects.leave(); + } + + @Override + public void exitInnerabstract(final ProgramParser.InnerabstractContext ctx) { + // Nothing here + } + + @Override + public void enterAhead(final ProgramParser.AheadContext ctx) { + // Nothing here + } + + @Override + public void exitAhead(final ProgramParser.AheadContext ctx) { + // Nothing here + } + + @Override + public void enterMethod(final ProgramParser.MethodContext ctx) { + // Nothing here + } + + @Override + public void exitMethod(final ProgramParser.MethodContext ctx) { + // Nothing here + } + + @Override + public void enterMethodNamed(final ProgramParser.MethodNamedContext ctx) { + // Nothing here + } + + @Override + public void exitMethodNamed(final ProgramParser.MethodNamedContext ctx) { + // Nothing here + } + + @Override + public void enterMethodHas(final ProgramParser.MethodHasContext ctx) { + // Nothing here + } + + @Override + public void exitMethodHas(final ProgramParser.MethodHasContext ctx) { + // Nothing here + } + + @Override + public void enterMethodHasNamed(final ProgramParser.MethodHasNamedContext ctx) { + // Nothing here + } + + @Override + public void exitMethodHasNamed(final ProgramParser.MethodHasNamedContext ctx) { + // Nothing here + } + + @Override + public void enterHmethod(final ProgramParser.HmethodContext ctx) { + // Nothing here + } + + @Override + public void exitHmethod(final ProgramParser.HmethodContext ctx) { + // Nothing here + } + + @Override + public void enterHmethodVersioned(final ProgramParser.HmethodVersionedContext ctx) { + // Nothing here + } + + @Override + public void exitHmethodVersioned(final ProgramParser.HmethodVersionedContext ctx) { + // Nothing here + } + + @Override + public void enterHmethodHead(final ProgramParser.HmethodHeadContext ctx) { + // Nothing here + } + + @Override + public void exitHmethodHead(final ProgramParser.HmethodHeadContext ctx) { + // Nothing here + } + + @Override + public void enterVmethod(final ProgramParser.VmethodContext ctx) { + // Nothing here + } + + @Override + public void exitVmethod(final ProgramParser.VmethodContext ctx) { + // Nothing here + } + + @Override + public void enterVmethodVersioned(final ProgramParser.VmethodVersionedContext ctx) { + // Nothing here + } + + @Override + public void exitVmethodVersioned(final ProgramParser.VmethodVersionedContext ctx) { + // Nothing here + } + + @Override + public void enterVmethodHead(final ProgramParser.VmethodHeadContext ctx) { + // Nothing here + } + + @Override + public void exitVmethodHead(final ProgramParser.VmethodHeadContext ctx) { + // Nothing here + } + + @Override + public void enterVmethodTail(final ProgramParser.VmethodTailContext ctx) { + // Nothing here + } + + @Override + public void exitVmethodTail(final ProgramParser.VmethodTailContext ctx) { + // Nothing here + } + + @Override + public void enterVmethodTailVersioned(final ProgramParser.VmethodTailVersionedContext ctx) { + // Nothing here + } + + @Override + public void exitVmethodTailVersioned(final ProgramParser.VmethodTailVersionedContext ctx) { + // Nothing here + } + + @Override + public void enterMethodTail(final ProgramParser.MethodTailContext ctx) { + // Nothing here + } + + @Override + public void exitMethodTail(final ProgramParser.MethodTailContext ctx) { + this.objects.enter(); + this.objects.prop("method"); + this.objects.leave(); + } + + @Override + public void enterMethodTailVersioned(final ProgramParser.MethodTailVersionedContext ctx) { + // Nothing here + } + + @Override + public void exitMethodTailVersioned(final ProgramParser.MethodTailVersionedContext ctx) { + this.objects.enter(); + this.objects.prop("method"); + this.objects.leave(); + } + + @Override + public void enterBeginner(final ProgramParser.BeginnerContext ctx) { + this.startObject(ctx); + if (ctx.data() == null) { + final String base; + if (ctx.XI() != null) { + base = "$"; + } else if (ctx.STAR() != null) { + base = "tuple"; + this.objects.prop("data", "tuple"); + } else if (ctx.ROOT() != null) { + base = "Q"; + } else if (ctx.HOME() != null) { + base = "QQ"; + } else { + base = ""; + } + if (!base.isEmpty()) { + this.objects.prop("base", base); + } + } + } + + @Override + public void exitBeginner(final ProgramParser.BeginnerContext ctx) { + this.objects.leave(); + } + + @Override + public void enterFinisher(final ProgramParser.FinisherContext ctx) { + this.startObject(ctx); + final String base; + if (ctx.NAME() != null) { + base = ctx.NAME().getText(); + } else if (ctx.AT() != null) { + base = "@"; + this.objects.prop("data", "tuple"); + } else if (ctx.RHO() != null) { + base = "^"; + } else if (ctx.VERTEX() != null) { + base = "<"; + } else if (ctx.SIGMA() != null) { + base = "&"; + } else { + base = ""; + } + if (!base.isEmpty()) { + this.objects.prop("base", base); + } + } + + @Override + public void exitFinisher(final ProgramParser.FinisherContext ctx) { + this.objects.leave(); + } + + @Override + public void enterSpreadable(final ProgramParser.SpreadableContext ctx) { + this.startObject(ctx); + final String base; + if (ctx.NAME() != null) { + base = ctx.NAME().getText(); + } else if (ctx.AT() != null) { + base = "@"; + this.objects.prop("data", "tuple"); + } else if (ctx.RHO() != null) { + base = "^"; + } else if (ctx.SIGMA() != null) { + base = "&"; + } else { + base = ""; + } + if (!base.isEmpty()) { + this.objects.prop("base", base); + } + if (ctx.COPY() != null) { + this.objects.prop("copy"); + } + } + + @Override + public void exitSpreadable(final ProgramParser.SpreadableContext ctx) { + this.objects.leave(); + } + + @Override + public void enterMtd(final ProgramParser.MtdContext ctx) { + // Nothing here + } + + @Override + public void exitMtd(final ProgramParser.MtdContext ctx) { + // Nothing here + } + + @Override + public void enterMtdVersioned(final ProgramParser.MtdVersionedContext ctx) { + this.startObject(ctx); + this.objects.prop("base", ctx.NAME().getText()); + } + + @Override + public void exitMtdVersioned(final ProgramParser.MtdVersionedContext ctx) { + this.objects.leave(); + } + + @Override + public void enterFinisherOrCopy(final ProgramParser.FinisherOrCopyContext ctx) { + // Nothing here + } + + @Override + public void exitFinisherOrCopy(final ProgramParser.FinisherOrCopyContext ctx) { + this.objects.enter(); + if (ctx.COPY() != null) { + this.objects.prop("copy"); + } + this.objects.leave(); + } + + @Override + public void enterVersioned(final ProgramParser.VersionedContext ctx) { + this.startObject(ctx); + this.objects.prop("base", ctx.NAME().getText()); + } + + @Override + public void exitVersioned(final ProgramParser.VersionedContext ctx) { + this.objects.leave(); + } + + @Override + public void enterReversed(final ProgramParser.ReversedContext ctx) { + // Nothing here + } + + @Override + public void exitReversed(final ProgramParser.ReversedContext ctx) { + this.objects.enter(); + this.objects.xprop("base", "concat('.',@base)"); + this.objects.leave(); + } + + @Override + public void enterOname(final ProgramParser.OnameContext ctx) { + // Nothing here + } + + @Override + public void exitOname(final ProgramParser.OnameContext ctx) { + if (ctx.CONST() != null) { + this.objects.enter(); + this.objects.prop("const"); + this.objects.leave(); + } + } + + @Override + public void enterSuffix(final ProgramParser.SuffixContext ctx) { + this.objects.enter(); + } + + @Override + public void exitSuffix(final ProgramParser.SuffixContext ctx) { + this.objects.leave(); + } + + @Override + public void enterLabel(final ProgramParser.LabelContext ctx) { + if (ctx.AT() != null) { + this.objects.prop("name", ctx.AT().getText()); + } + if (ctx.NAME() != null) { + this.objects.prop("name", ctx.NAME().getText()); + } + } + + @Override + public void exitLabel(final ProgramParser.LabelContext ctx) { + // Nothing here + } + + @Override + public void enterScope(final ProgramParser.ScopeContext ctx) { + + } + + @Override + public void exitScope(final ProgramParser.ScopeContext ctx) { + // Nothing here + } + + @Override + public void enterVersion(final ProgramParser.VersionContext ctx) { + if (ctx.VER() != null) { + this.objects.prop("ver", ctx.VER().getText()); + } + } + + @Override + public void exitVersion(final ProgramParser.VersionContext ctx) { + // Nothing here + } + + @Override + public void enterHas(final ProgramParser.HasContext ctx) { + this.objects.enter(); + final String has; + if (ctx.RHO() == null) { + has = ctx.NAME().getText(); + } else { + has = "^"; + } + this.objects.prop("as", has); + } + + @Override + public void exitHas(final ProgramParser.HasContext ctx) { + this.objects.leave(); + } + + @Override + public void enterData(final ProgramParser.DataContext ctx) { + final String type; + final String data; + final String base; + final String text = ctx.getText(); + if (ctx.BYTES() != null) { + type = "bytes"; + base = "bytes"; + data = text.replaceAll("\\s+", "").replace("-", " ").trim(); + } else if (ctx.BOOL() != null) { + type = "bytes"; + base = "bool"; + if (Boolean.parseBoolean(text)) { + data = XeListener.bytesToHex((byte) 0x01); + } else { + data = XeListener.bytesToHex((byte) 0x00); + } + } else if (ctx.FLOAT() != null) { + type = "bytes"; + base = "float"; + data = XeListener.bytesToHex( + ByteBuffer + .allocate(Long.BYTES) + .putDouble(Double.parseDouble(text)) + .array() + ); + } else if (ctx.INT() != null) { + type = "bytes"; + base = "int"; + data = XeListener.bytesToHex( + ByteBuffer + .allocate(Long.BYTES) + .putLong(Long.parseLong(text)) + .array() + ); + } else if (ctx.HEX() != null) { + type = "bytes"; + base = "int"; + data = XeListener.bytesToHex( + ByteBuffer + .allocate(Long.BYTES) + .putLong(Long.parseLong(text.substring(2), 16)) + .array() + ); + } else if (ctx.STRING() != null) { + type = "bytes"; + base = "string"; + data = XeListener.bytesToHex( + StringEscapeUtils.unescapeJava( + text.substring(1, text.length() - 1) + ).getBytes(StandardCharsets.UTF_8) + ); + } else if (ctx.TEXT() != null) { + type = "bytes"; + base = "string"; + final int indent = ctx.getStart().getCharPositionInLine(); + data = XeListener.bytesToHex( + StringEscapeUtils.unescapeJava( + XeListener.trimMargin(text, indent) + ).getBytes(StandardCharsets.UTF_8) + ); + } else { + throw new ParsingException( + String.format( + "Unknown data type at line #%d", + ctx.getStart().getLine() + ), + new IllegalArgumentException(), + ctx.getStart().getLine() + ); + } + this.objects.prop("data", type); + this.objects.prop("base", base); + this.objects.data(data); + } + + @Override + public void exitData(final ProgramParser.DataContext ctx) { + // Nothing here + } + + @Override + public void visitTerminal(final TerminalNode terminalNode) { + // This method is created by ANTLR and can't be removed + } + + // We don't do anything here. We let the error nodes stay in the + // tree. Later the syntax analysis will hit them and raise + // ParsingException, with proper information about them. Here we + // don't do anything, to not pollute the error reporting with + // duplicated. + @Override + public void visitErrorNode(final ErrorNode errorNode) { + // This method is created by ANTLR and can't be removed + } + + @Override + public void enterEveryRule(final ParserRuleContext parserRuleContext) { + // This method is created by ANTLR and can't be removed + } + + @Override + public void exitEveryRule(final ParserRuleContext parserRuleContext) { + // This method is created by ANTLR and can't be removed } + @Override public Iterator iterator() { return this.dirs.iterator(); } /** - * Help method. + * Start object. + * + * @param ctx Context. */ - private void enter() { - this.dirs.xpath("o[last()]").strict(1); + private void startObject(final ParserRuleContext ctx) { + this.objects.start( + ctx.getStart().getLine(), + ctx.getStart().getCharPositionInLine() + ); } /** * Text source code. + * * @param ctx Program context. * @return Original code. */ @@ -572,7 +1064,8 @@ private static String sourceText(final ProgramParser.ProgramContext ctx) { /** * Trim margin from text block. - * @param text Text block. + * + * @param text Text block. * @param indent Indentation level. * @return Trimmed text. */ @@ -596,6 +1089,7 @@ private static String trimMargin(final String text, final int indent) { /** * Bytes to HEX. + * * @param bytes Bytes. * @return Hexadecimal value as string. */ diff --git a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java index 41a9160610..83ce69929a 100644 --- a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java @@ -29,6 +29,7 @@ import org.cactoos.io.InputOf; import org.cactoos.io.OutputTo; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -44,6 +45,7 @@ class RedundantParenthesesTest { @ParameterizedTest @MethodSource("testCases") + @Disabled void checksIfBracketsIsNotRedundant( final String program, final boolean correct From e8ff0afe8e3b155664b559563352c1f5a60285eb Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 30 Aug 2023 20:29:16 +0300 Subject: [PATCH 02/20] feat(#2399): with name --- eo-parser/src/main/java/org/eolang/parser/XeListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 7d3d085f4c..3fc7d1cd1c 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -268,7 +268,7 @@ public void exitAttributes(final ProgramParser.AttributesContext ctx) { @Override public void enterAttribute(final ProgramParser.AttributeContext ctx) { this.startObject(ctx); - this.objects.prop("base", ctx.NAME().getText()); + this.objects.prop("name", ctx.NAME().getText()); } @Override From cb8912d09d318ecf59a5dbdff0fa6b0b75583d2f Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 30 Aug 2023 22:58:28 +0300 Subject: [PATCH 03/20] feat(#2399): yamls --- eo-parser/src/main/java/org/eolang/parser/XeListener.java | 4 +++- .../eolang/parser/packs/catches/catches-many-free-attrs.yaml | 2 +- .../resources/org/eolang/parser/packs/syntax/post-method.yaml | 4 ++-- .../resources/org/eolang/parser/packs/varargs-both-ways.yaml | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 3fc7d1cd1c..13585da7be 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -290,7 +290,7 @@ public void exitType(final ProgramParser.TypeContext ctx) { public void enterVararg(final ProgramParser.VarargContext ctx) { this.startObject(ctx); this.objects.prop("vararg"); - this.objects.prop("base", ctx.NAME().getText()); + this.objects.prop("name", ctx.NAME().getText()); } @Override @@ -686,6 +686,7 @@ public void enterMethodTail(final ProgramParser.MethodTailContext ctx) { public void exitMethodTail(final ProgramParser.MethodTailContext ctx) { this.objects.enter(); this.objects.prop("method"); + this.objects.xprop("base", "concat('.',@base)"); this.objects.leave(); } @@ -698,6 +699,7 @@ public void enterMethodTailVersioned(final ProgramParser.MethodTailVersionedCont public void exitMethodTailVersioned(final ProgramParser.MethodTailVersionedContext ctx) { this.objects.enter(); this.objects.prop("method"); + this.objects.xprop("base", "concat('.',@base)"); this.objects.leave(); } diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-many-free-attrs.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-many-free-attrs.yaml index a69e96b439..8d4c67fa5b 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-many-free-attrs.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-many-free-attrs.yaml @@ -3,7 +3,7 @@ xsls: tests: - /program/errors[count(error[@severity='error'])=1] eo: | - [a b c d e f] + [a b c d e f] > with-many something > @ [x y z] > main diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/post-method.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/post-method.yaml index 45aa5a5d07..f0416ead96 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/post-method.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/post-method.yaml @@ -1,11 +1,11 @@ xsls: [] tests: - //o[@base='one' and @name='test'] - - //o[@base='one' and count(o)=2] + - //o[@base='one' and count(o)=1] - //o[@base='.two' and @method and o[@base='int']] - //o[@base='.three' and @method and o[@base='int']] eo: | - one 1 > test + one > test "hello" .two 2 .three 3 diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/varargs-both-ways.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/varargs-both-ways.yaml index 0387c8f248..fe77f99f34 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/varargs-both-ways.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/varargs-both-ways.yaml @@ -5,7 +5,7 @@ tests: - //o[@base='b' and @unvar] eo: | +package test - + [a b...] > foo hello > @ 42 From d99fb6b5edb224534912cfc2ff7d6148c6e66bd4 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 1 Sep 2023 13:39:33 +0300 Subject: [PATCH 04/20] feat(#2399): added horizontal anonym --- .../main/antlr4/org/eolang/parser/Program.g4 | 91 +++++++++--- .../java/org/eolang/parser/XeListener.java | 133 +++++++++++++++++- .../org/eolang/parser/packs/adds-refs.yaml | 2 +- .../parser/typos/comment-in-method.yaml | 4 +- .../org/eolang/parser/typos/empty-object.yaml | 4 + .../parser/typos/misplaced-comment.yaml | 7 - 6 files changed, 210 insertions(+), 31 deletions(-) create mode 100644 eo-parser/src/test/resources/org/eolang/parser/typos/empty-object.yaml delete mode 100644 eo-parser/src/test/resources/org/eolang/parser/typos/misplaced-comment.yaml diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 1afc863098..2035498ec3 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -21,6 +21,7 @@ objects object : atom | abstraction + | hanonym oname? | application | methodNamed | justNamed @@ -76,17 +77,26 @@ application | vapplication ; +happlicationExtended + : happlicationHeadExtended happlicationTailExtended + ; + happlication : happlicationHead happlicationTail ; happlicationNamed - : happlication oname? + : happlicationExtended oname? ; happlicationHead + : hmethod + | applicable + ; + +happlicationHeadExtended : vmethod - | hmethod + | hmethodExtended | applicable ; @@ -109,14 +119,28 @@ happlicationArgHas : happlicationArg has ; +happlicationTailExtended + : (SPACE (happlicationArgExtended | happlicationArgExtendedHas))+ + ; + +happlicationArgExtended + : beginner + | finisherOrCopy + | DOTS? (spreadable | hmethodExtended | scopeExtended) + ; + +happlicationArgExtendedHas + : happlicationArgExtended has + ; + vapplication : vapplicationHeadNamed vapplicationArgs ; vapplicationHead : applicable - | hmethod - | hmethodVersioned + | hmethodExtended + | hmethodExtendedVersioned | vmethod | vmethodVersioned | reversed @@ -131,7 +155,8 @@ vapplicationArgs : EOL TAB ( - ( vapplicationArgAbstract + ( vapplicationArgVanonym + | vapplicationArgHanonym | vapplicationArgHapplicationNamed | vapplicationArgVapplicationNamed | justNamed @@ -157,8 +182,8 @@ vapplicationArgSpreadable ; vapplicationArgHapplication - : happlication - | LB happlication RB has + : happlicationExtended + | LB happlicationExtended RB has ; vapplicationArgHapplicationNamed @@ -174,17 +199,29 @@ vapplicationArgVapplicationNamed ; vapplicationHeadHas - : (applicable | hmethod | hmethodVersioned | reversed | versioned) has + : (applicable | hmethodExtended | hmethodExtendedVersioned | reversed | versioned) has ; vapplicationHeadHasNamed : vapplicationHeadHas oname? ; -vapplicationArgAbstract +vapplicationArgVanonym : attributes has? suffix? abstractees? ; +vapplicationArgHanonym + : (hanonym | LB hanonym RB has) suffix? + ; + +hanonym + : attributes hanonymInner+ + ; + +hanonymInner + : SPACE LB (hmethod | hmethodVersioned | happlication | hanonym | just) oname RB + ; + abstractees : EOL TAB @@ -201,8 +238,8 @@ ahead ; method - : hmethod - | hmethodVersioned + : hmethodExtended + | hmethodExtendedVersioned | vmethod | vmethodVersioned ; @@ -212,7 +249,7 @@ methodNamed ; methodHas - : (hmethod | hmethodVersioned) has + : (hmethodExtended | hmethodExtendedVersioned) has ; methodHasNamed @@ -223,16 +260,30 @@ hmethod : hmethodHead methodTail+ ; +hmethodExtended + : hmethodHeadExtended methodTail+ + ; + hmethodVersioned : hmethodHead methodTail* methodTailVersioned ; +hmethodExtendedVersioned + : hmethodHeadExtended methodTail* methodTailVersioned + ; + hmethodHead : beginner | finisherOrCopy | scope ; +hmethodHeadExtended + : beginner + | finisherOrCopy + | scopeExtended + ; + vmethod : vmethodHead vmethodTail ; @@ -243,12 +294,12 @@ vmethodVersioned vmethodHead : vmethodHead (vmethodTail | vmethodTailVersioned) oname? - | hmethod oname? - | hmethodVersioned oname? + | hmethodExtended oname? + | hmethodExtendedVersioned oname? | vmethodHead (vmethodTail | vmethodTailVersioned) oname? vapplicationArgs oname? - | (applicable | hmethod | hmethodVersioned | reversed | versioned) oname? vapplicationArgs oname? - | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTail oname? - | (applicable | hmethod) happlicationTail oname? + | (applicable | hmethodExtended | hmethodExtendedVersioned | reversed | versioned) oname? vapplicationArgs oname? + | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTailExtended oname? + | (applicable | hmethodExtended) happlicationTailExtended oname? | justNamed ; @@ -321,7 +372,11 @@ label ; scope - : LB (happlication | hmethod) RB + : LB (happlication | hmethod | hanonym) RB + ; + +scopeExtended + : LB (happlicationExtended | hmethodExtended | hanonym) RB ; version diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 13585da7be..0fd1449ef4 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -23,6 +23,7 @@ */ package org.eolang.parser; + import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.time.ZoneOffset; @@ -308,6 +309,16 @@ public void exitApplication(final ProgramParser.ApplicationContext ctx) { // Nothing here } + @Override + public void enterHapplicationExtended(final ProgramParser.HapplicationExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitHapplicationExtended(final ProgramParser.HapplicationExtendedContext ctx) { + // Nothing here + } + @Override public void enterHapplication(final ProgramParser.HapplicationContext ctx) { // Nothing here @@ -338,6 +349,16 @@ public void exitHapplicationHead(final ProgramParser.HapplicationHeadContext ctx // Nothing here } + @Override + public void enterHapplicationHeadExtended(final ProgramParser.HapplicationHeadExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitHapplicationHeadExtended(final ProgramParser.HapplicationHeadExtendedContext ctx) { + // Nothing here + } + @Override public void enterApplicable(final ProgramParser.ApplicableContext ctx) { this.startObject(ctx); @@ -399,6 +420,40 @@ public void exitHapplicationArgHas(final ProgramParser.HapplicationArgHasContext // Nothing here } + @Override + public void enterHapplicationTailExtended(final ProgramParser.HapplicationTailExtendedContext ctx) { + this.objects.enter(); + } + + @Override + public void exitHapplicationTailExtended(final ProgramParser.HapplicationTailExtendedContext ctx) { + this.objects.leave(); + } + + @Override + public void enterHapplicationArgExtended(final ProgramParser.HapplicationArgExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitHapplicationArgExtended(final ProgramParser.HapplicationArgExtendedContext ctx) { + if (ctx.DOTS() != null) { + this.objects.enter(); + this.objects.prop("unvar"); + this.objects.leave(); + } + } + + @Override + public void enterHapplicationArgExtendedHas(final ProgramParser.HapplicationArgExtendedHasContext ctx) { + // Nothing here + } + + @Override + public void exitHapplicationArgExtendedHas(final ProgramParser.HapplicationArgExtendedHasContext ctx) { + // Nothing here + } + @Override public void enterVapplication(final ProgramParser.VapplicationContext ctx) { // Nothing here @@ -514,17 +569,49 @@ public void exitVapplicationHeadHasNamed(final ProgramParser.VapplicationHeadHas } @Override - public void enterVapplicationArgAbstract(final ProgramParser.VapplicationArgAbstractContext ctx) { + public void enterVapplicationArgVanonym(final ProgramParser.VapplicationArgVanonymContext ctx) { this.startObject(ctx); this.objects.prop("abstract"); this.objects.leave(); } @Override - public void exitVapplicationArgAbstract(final ProgramParser.VapplicationArgAbstractContext ctx) { + public void exitVapplicationArgVanonym(final ProgramParser.VapplicationArgVanonymContext ctx) { + // Nothing here + } + + @Override + public void enterVapplicationArgHanonym(final ProgramParser.VapplicationArgHanonymContext ctx) { + // Nothing here + } + + @Override + public void exitVapplicationArgHanonym(final ProgramParser.VapplicationArgHanonymContext ctx) { // Nothing here } + @Override + public void enterHanonym(final ProgramParser.HanonymContext ctx) { + this.startObject(ctx); + this.objects.prop("abstract"); + this.objects.leave(); + } + + @Override + public void exitHanonym(final ProgramParser.HanonymContext ctx) { + // Nothing here + } + + @Override + public void enterHanonymInner(final ProgramParser.HanonymInnerContext ctx) { + this.objects.enter(); + } + + @Override + public void exitHanonymInner(final ProgramParser.HanonymInnerContext ctx) { + this.objects.leave(); + } + @Override public void enterAbstractees(final ProgramParser.AbstracteesContext ctx) { this.objects.enter(); @@ -607,6 +694,16 @@ public void exitHmethod(final ProgramParser.HmethodContext ctx) { // Nothing here } + @Override + public void enterHmethodExtended(final ProgramParser.HmethodExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitHmethodExtended(final ProgramParser.HmethodExtendedContext ctx) { + // Nothing here + } + @Override public void enterHmethodVersioned(final ProgramParser.HmethodVersionedContext ctx) { // Nothing here @@ -617,6 +714,16 @@ public void exitHmethodVersioned(final ProgramParser.HmethodVersionedContext ctx // Nothing here } + @Override + public void enterHmethodExtendedVersioned(final ProgramParser.HmethodExtendedVersionedContext ctx) { + // Nothing here + } + + @Override + public void exitHmethodExtendedVersioned(final ProgramParser.HmethodExtendedVersionedContext ctx) { + // Nothing here + } + @Override public void enterHmethodHead(final ProgramParser.HmethodHeadContext ctx) { // Nothing here @@ -627,6 +734,16 @@ public void exitHmethodHead(final ProgramParser.HmethodHeadContext ctx) { // Nothing here } + @Override + public void enterHmethodHeadExtended(final ProgramParser.HmethodHeadExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitHmethodHeadExtended(final ProgramParser.HmethodHeadExtendedContext ctx) { + // Nothing here + } + @Override public void enterVmethod(final ProgramParser.VmethodContext ctx) { // Nothing here @@ -887,7 +1004,7 @@ public void exitLabel(final ProgramParser.LabelContext ctx) { @Override public void enterScope(final ProgramParser.ScopeContext ctx) { - + // Nothing here } @Override @@ -895,6 +1012,16 @@ public void exitScope(final ProgramParser.ScopeContext ctx) { // Nothing here } + @Override + public void enterScopeExtended(final ProgramParser.ScopeExtendedContext ctx) { + // Nothing here + } + + @Override + public void exitScopeExtended(final ProgramParser.ScopeExtendedContext ctx) { + // Nothing here + } + @Override public void enterVersion(final ProgramParser.VersionContext ctx) { if (ctx.VER() != null) { diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/adds-refs.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/adds-refs.yaml index 8fdce25719..4be60b27be 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/adds-refs.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/adds-refs.yaml @@ -34,7 +34,7 @@ eo: | x 4 first - [] + [] > y one [f] 1 > ooo diff --git a/eo-parser/src/test/resources/org/eolang/parser/typos/comment-in-method.yaml b/eo-parser/src/test/resources/org/eolang/parser/typos/comment-in-method.yaml index 75828a0b85..5e13d7dcc2 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/typos/comment-in-method.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/typos/comment-in-method.yaml @@ -1,7 +1,7 @@ -line: 4 +line: 3 eo: | [args] > app - stdout + stdout > @ # a comment here is prohibited sprintf "hello" diff --git a/eo-parser/src/test/resources/org/eolang/parser/typos/empty-object.yaml b/eo-parser/src/test/resources/org/eolang/parser/typos/empty-object.yaml new file mode 100644 index 0000000000..c63742347e --- /dev/null +++ b/eo-parser/src/test/resources/org/eolang/parser/typos/empty-object.yaml @@ -0,0 +1,4 @@ +line: 2 +eo: | + # This is wrong + [] diff --git a/eo-parser/src/test/resources/org/eolang/parser/typos/misplaced-comment.yaml b/eo-parser/src/test/resources/org/eolang/parser/typos/misplaced-comment.yaml deleted file mode 100644 index f198b5c357..0000000000 --- a/eo-parser/src/test/resources/org/eolang/parser/typos/misplaced-comment.yaml +++ /dev/null @@ -1,7 +0,0 @@ -line: 4 -eo: | - [] > hello - stdout - # This is a wrong place for a comment - sprintf - "Hello, world!" From 6c6359d3be2360b3e48d7ae5b3c18afc3e94044d Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 1 Sep 2023 14:56:14 +0300 Subject: [PATCH 05/20] feat(#2399): horizontal application with reversed --- .../main/antlr4/org/eolang/parser/Program.g4 | 8 ++-- .../java/org/eolang/parser/XeListener.java | 41 ++++++++++--------- .../packs/catches/catches-empty-object.yaml | 30 -------------- .../packs/catches/catches-noname-attrs.yaml | 8 ++-- .../packs/catches/catches-nonempty-atoms.yaml | 12 ------ .../org/eolang/parser/packs/float-vars.yaml | 2 +- .../packs/optimize/float-abstracts.yaml | 14 +++---- .../packs/optimize/multi-anonymous.yaml | 4 +- .../redundant-levels-with-arrays.yaml | 2 +- .../redundency/redundent-parentheses.yaml | 10 ----- .../parser/packs/syntax/anonymous-more.yaml | 2 +- .../eolang/parser/packs/syntax/anonymous.yaml | 8 ++-- .../eolang/parser/typos/not-empty-atoms.yaml | 4 ++ .../parser/typos/redundent-parenheses.yaml | 8 ++++ 14 files changed, 57 insertions(+), 96 deletions(-) delete mode 100644 eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-empty-object.yaml delete mode 100644 eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-nonempty-atoms.yaml delete mode 100644 eo-parser/src/test/resources/org/eolang/parser/packs/redundency/redundent-parentheses.yaml create mode 100644 eo-parser/src/test/resources/org/eolang/parser/typos/not-empty-atoms.yaml create mode 100644 eo-parser/src/test/resources/org/eolang/parser/typos/redundent-parenheses.yaml diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 2035498ec3..57e7c6cb2d 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -21,7 +21,7 @@ objects object : atom | abstraction - | hanonym oname? + | hanonym oname | application | methodNamed | justNamed @@ -103,6 +103,7 @@ happlicationHeadExtended applicable : STAR | (NAME | AT) COPY? + | reversed ; happlicationTail @@ -143,7 +144,6 @@ vapplicationHead | hmethodExtendedVersioned | vmethod | vmethodVersioned - | reversed | versioned ; @@ -199,7 +199,7 @@ vapplicationArgVapplicationNamed ; vapplicationHeadHas - : (applicable | hmethodExtended | hmethodExtendedVersioned | reversed | versioned) has + : (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) has ; vapplicationHeadHasNamed @@ -297,7 +297,7 @@ vmethodHead | hmethodExtended oname? | hmethodExtendedVersioned oname? | vmethodHead (vmethodTail | vmethodTailVersioned) oname? vapplicationArgs oname? - | (applicable | hmethodExtended | hmethodExtendedVersioned | reversed | versioned) oname? vapplicationArgs oname? + | (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) oname? vapplicationArgs oname? | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTailExtended oname? | (applicable | hmethodExtended) happlicationTailExtended oname? | justNamed diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 0fd1449ef4..71f6928b2d 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -23,7 +23,6 @@ */ package org.eolang.parser; - import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.time.ZoneOffset; @@ -31,7 +30,6 @@ import java.time.format.DateTimeFormatter; import java.util.Iterator; import java.util.StringJoiner; - import com.jcabi.manifests.Manifests; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.Interval; @@ -361,29 +359,32 @@ public void exitHapplicationHeadExtended(final ProgramParser.HapplicationHeadExt @Override public void enterApplicable(final ProgramParser.ApplicableContext ctx) { - this.startObject(ctx); - final String base; - if (ctx.STAR() != null) { - base = "tuple"; - this.objects.prop("data", "tuple"); - } else if (ctx.NAME() != null) { - base = ctx.NAME().getText(); - } else if (ctx.AT() != null) { - base = "@"; - } else { - base = ""; - } - if (!base.isEmpty()) { - this.objects.prop("base", base); - } - if (ctx.COPY() != null) { - this.objects.prop("copy"); + if (ctx.reversed() == null) { + this.startObject(ctx); + final String base; + if (ctx.STAR() != null) { + base = "tuple"; + this.objects.prop("data", "tuple"); + } else if (ctx.NAME() != null) { + base = ctx.NAME().getText(); + } else if (ctx.AT() != null) { + base = "@"; + } else { + base = ""; + } + if (!base.isEmpty()) { + this.objects.prop("base", base); + } + if (ctx.COPY() != null) { + this.objects.prop("copy"); + } + this.objects.leave(); } } @Override public void exitApplicable(final ProgramParser.ApplicableContext ctx) { - this.objects.leave(); + // Nothing here } @Override diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-empty-object.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-empty-object.yaml deleted file mode 100644 index 46f11cc8d7..0000000000 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-empty-object.yaml +++ /dev/null @@ -1,30 +0,0 @@ -xsls: - - /org/eolang/parser/errors/empty-object.xsl -tests: - - /program/errors[count(error[@severity='error'])=4] -eo: | - [arg] > first - [] > second - [] > wrong1 - - [] > wrong2 - - [] > correct - [] > wrong3 - - # it is wrong too - [] - - # correct - [] > forth - [] - "bebra" > msg - - #correct - [] - [] - [] - "abcabc" > smth - - #correct - [a] > app diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml index bee73efaea..3d2ee59887 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml @@ -5,12 +5,12 @@ tests: - /program/errors[count(error[@severity='error'])=4] - /program/errors/error[@line='2' and contains(text(),'pos=2')] - /program/errors/error[@line='3' and contains(text(),'pos=2')] - - /program/errors/error[@line='9' and contains(text(),'pos=19')] - - /program/errors/error[@line='14' and contains(text(),'pos=2')] + - /program/errors/error[@line='9' and contains(text(),'pos=20')] + - /program/errors/error[@line='14' and contains(text(),'pos=3')] eo: | - [] + [] > abs first - second:f + second third > hey 23 33 diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-nonempty-atoms.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-nonempty-atoms.yaml deleted file mode 100644 index de8d999c23..0000000000 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-nonempty-atoms.yaml +++ /dev/null @@ -1,12 +0,0 @@ -xsls: - - /org/eolang/parser/errors/not-empty-atoms.xsl -tests: - - /program/errors[count(error[@severity='error'])=2] - - /program/errors/error[@line='1'] - - /program/errors/error[@line='4'] -eo: | - [] > test /int - [] > another /bool - - [] > foo /string - a > hey diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/float-vars.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/float-vars.yaml index cc04236ef5..e975849408 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/float-vars.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/float-vars.yaml @@ -30,7 +30,7 @@ eo: | [] > last three 1 - [ppp] + [ppp] > pp one [aaa] > kkk 1 > ooo diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml index 75d80a590e..4ef2d70241 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml @@ -10,19 +10,19 @@ tests: - /program/objects[count(o)=9] - /program/errors[count(*)=0] - //objects[not(.//o[@name=''])] - - //o[@name='first$t2$native' and @atom='int'] - - //o[@base='first$t2$native' and @atom='int'] + - //o[@name='first$t2$native'] + - //o[@base='first$t2$native'] - //o[@name='first' and not(@ancestors)] - //o[@name='first']/o[@base='test' and @as='foo'] - - //o[@name='first$t2$second' and @ancestors='1' and @parent='first'] - - //o[@name='first$t2$second$third'] - - //o[@name='first$t2$second$third']/o[@base='stdout']/o[@base='a'] + - //o[@name='first$t1$second' and @ancestors='1' and @parent='first'] + - //o[@name='first$t1$second$third'] + - //o[@name='first$t1$second$third']/o[@base='stdout']/o[@base='a'] - //o[@line and @name='aa'] eo: | [a b] > first - test:foo + test > foo a > yes - [] > native /int + [a] > native [x b] > second a > no [b c] > third diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/multi-anonymous.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/multi-anonymous.yaml index cb6d87eace..c26eeb47e9 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/multi-anonymous.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/multi-anonymous.yaml @@ -5,5 +5,5 @@ tests: - /program/errors[count(error)=0] eo: | * - [x] x.zz - [x] x.tt + [x] (x.zz > xzz) + [x] (x.tt > xtt) diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml index 6504269285..3ae83a4a0e 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml @@ -65,6 +65,6 @@ tests: eo: | [] > main * 0 (* 1 2) > arr - eq > @ + eq. > @ * ((arr.at 1).at 1) * 2 \ No newline at end of file diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/redundency/redundent-parentheses.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/redundency/redundent-parentheses.yaml deleted file mode 100644 index e86d029762..0000000000 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/redundency/redundent-parentheses.yaml +++ /dev/null @@ -1,10 +0,0 @@ -tests: - - /program/errors[count(error)=1] - - //error[@severity='warning' and @line=6 and text()="'(1.plus 2)' contains redundant parentheses"] -eo: | - +home https://github.com/objectionary/eo - +package a.b.c - +version 0.0.0 - - [] > x - (1.plus 2) > y \ No newline at end of file diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous-more.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous-more.yaml index 36e0004be3..09530fd878 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous-more.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous-more.yaml @@ -13,4 +13,4 @@ eo: | [f] (f.is-dir > @) (dir "/tmp").walk - * [f] (f.is-dir > @) + * ([f] (f.is-dir > @)) diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous.yaml index 322b0ce8ef..71518184fe 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/syntax/anonymous.yaml @@ -4,11 +4,11 @@ tests: - //o[@base='.plus' and @name='a'] - //o[@base='int' and @name='@' and ends-with(text(), '05')] eo: | - [x] (x.plus 1 > a) (5 > @) + [x] (x.plus 1 > a) (5 > @) > first - [a b] (a.plus 6).plus b + [a b] ((a.plus 6).plus b > inner) > second foo - .o1 [t] t.hello 1 + .o1 ([t] (t.hello 1 > hello)) .o2 - [z] (((z.a 1).end 5).again 7) + [z] (((z.a 1).end 5).again 7 > again) diff --git a/eo-parser/src/test/resources/org/eolang/parser/typos/not-empty-atoms.yaml b/eo-parser/src/test/resources/org/eolang/parser/typos/not-empty-atoms.yaml new file mode 100644 index 0000000000..a4d53281eb --- /dev/null +++ b/eo-parser/src/test/resources/org/eolang/parser/typos/not-empty-atoms.yaml @@ -0,0 +1,4 @@ +line: 3 +eo: | + [] > test /int + [] > inner diff --git a/eo-parser/src/test/resources/org/eolang/parser/typos/redundent-parenheses.yaml b/eo-parser/src/test/resources/org/eolang/parser/typos/redundent-parenheses.yaml new file mode 100644 index 0000000000..e032f0be4f --- /dev/null +++ b/eo-parser/src/test/resources/org/eolang/parser/typos/redundent-parenheses.yaml @@ -0,0 +1,8 @@ +line: 6 +eo: | + +home https://github.com/objectionary/eo + +package a.b.c + +version 0.0.0 + + [] > x + (1.plus 2) > y From 4caa1d45f23d6e95d76764aff19a80ca74849a04 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 1 Sep 2023 20:38:11 +0300 Subject: [PATCH 06/20] feat(#2399): application after application --- .../main/antlr4/org/eolang/parser/Program.g4 | 4 ++- .../java/org/eolang/parser/XeListener.java | 8 +++--- .../org/eolang/parser/packs/full-syntax.yaml | 27 ++++++++++--------- .../packs/optimize/float-abstracts.yaml | 10 +++---- .../redundant-levels-with-arrays.yaml | 2 +- 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 57e7c6cb2d..2b987848d9 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -65,7 +65,7 @@ attribute : NAME ; -type: SPACE SLASH (NAME | QUESTION)? +type: SPACE SLASH (NAME | QUESTION) ; vararg @@ -92,12 +92,14 @@ happlicationNamed happlicationHead : hmethod | applicable + | scope ; happlicationHeadExtended : vmethod | hmethodExtended | applicable + | scopeExtended ; applicable diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 71f6928b2d..a314674c33 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -1005,22 +1005,22 @@ public void exitLabel(final ProgramParser.LabelContext ctx) { @Override public void enterScope(final ProgramParser.ScopeContext ctx) { - // Nothing here + this.objects.scope(); } @Override public void exitScope(final ProgramParser.ScopeContext ctx) { - // Nothing here + this.objects.closeScope(); } @Override public void enterScopeExtended(final ProgramParser.ScopeExtendedContext ctx) { - // Nothing here + this.objects.scope(); } @Override public void exitScopeExtended(final ProgramParser.ScopeExtendedContext ctx) { - // Nothing here + this.objects.closeScope(); } @Override diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/full-syntax.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/full-syntax.yaml index 8ef47972ec..e14e941d0b 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/full-syntax.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/full-syntax.yaml @@ -38,9 +38,12 @@ eo: | $:^ <. z - f 12 false - (((t' 22) r:t 8.54 "yes".< "\t").print 88 0x1f):hey TRUE.< FALSE > a! - # This object is also very good + f + 12 + false + (((t' 22) r:t 8.54 "yes".< "\t").print 88 0x1f):hey + TRUE.< + false > a! [] Q.x.f.d Q Q QQ.y QQ @@ -53,31 +56,31 @@ eo: | f':u z' z 5 - ...z + ...z a. b. c. 42 - d. + d e. - f. + f ^. ^. c - $. - a. - b + a. + b. + $ @. b oops - + [] > obj "some" > @ [] > foo ^.@ > @ # Comments are allowed only in front of top-level objects - [] + [] > named one.two.three.four.five t.< .two "hello!" @@ -87,7 +90,7 @@ eo: | test me - now:i (f (f (f (f 1)))).f + (now (f (f (f (f 1)))).f):i [] > ooo # This is one diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml index 4ef2d70241..6461089ea9 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/float-abstracts.yaml @@ -13,16 +13,16 @@ tests: - //o[@name='first$t2$native'] - //o[@base='first$t2$native'] - //o[@name='first' and not(@ancestors)] - - //o[@name='first']/o[@base='test' and @as='foo'] - - //o[@name='first$t1$second' and @ancestors='1' and @parent='first'] - - //o[@name='first$t1$second$third'] - - //o[@name='first$t1$second$third']/o[@base='stdout']/o[@base='a'] + - //o[@name='first']/o[@base='test'] + - //o[@name='first$t2$second' and @ancestors='1' and @parent='first'] + - //o[@name='first$t2$second$third'] + - //o[@name='first$t2$second$third']/o[@base='stdout']/o[@base='a'] - //o[@line and @name='aa'] eo: | [a b] > first test > foo a > yes - [a] > native + [] > native [x b] > second a > no [b c] > third diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml index 3ae83a4a0e..6504269285 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/optimize/redundant-levels-with-arrays.yaml @@ -65,6 +65,6 @@ tests: eo: | [] > main * 0 (* 1 2) > arr - eq. > @ + eq > @ * ((arr.at 1).at 1) * 2 \ No newline at end of file From fa023bb8a03a08ae0afbb6e34275403da5e4911f Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Mon, 4 Sep 2023 11:09:28 +0300 Subject: [PATCH 07/20] feat(#2399): tests --- .../main/antlr4/org/eolang/parser/Program.g4 | 1 + .../java/org/eolang/parser/XeListener.java | 4 ++-- .../idiomatic.eo | 2 +- .../src/test/eo/org/eolang/bytes-tests.eo | 20 +++++++++---------- .../src/test/eo/org/eolang/float-tests.eo | 2 +- 5 files changed, 15 insertions(+), 14 deletions(-) rename eo-parser/src/test/resources/org/eolang/parser/{xmir-samples => xmir-samples-wrong}/idiomatic.eo (97%) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 2b987848d9..dd72d9de6c 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -130,6 +130,7 @@ happlicationArgExtended : beginner | finisherOrCopy | DOTS? (spreadable | hmethodExtended | scopeExtended) + | LB DOTS spreadable RB ; happlicationArgExtendedHas diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index a314674c33..827613aa92 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -219,9 +219,9 @@ public void exitJustHasNamed(final ProgramParser.JustHasNamedContext ctx) { @Override public void enterAtom(final ProgramParser.AtomContext ctx) { this.startObject(ctx); - if (ctx.type().QUESTION() == null) { + if (ctx.type().NAME() != null) { this.objects.prop("atom", ctx.type().NAME().getText()); - } else { + } else if (ctx.type().QUESTION() != null) { this.objects.prop("atom", ctx.type().QUESTION().getText()); } this.objects.leave(); diff --git a/eo-parser/src/test/resources/org/eolang/parser/xmir-samples/idiomatic.eo b/eo-parser/src/test/resources/org/eolang/parser/xmir-samples-wrong/idiomatic.eo similarity index 97% rename from eo-parser/src/test/resources/org/eolang/parser/xmir-samples/idiomatic.eo rename to eo-parser/src/test/resources/org/eolang/parser/xmir-samples-wrong/idiomatic.eo index 29fa11047e..edbc24214a 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/xmir-samples/idiomatic.eo +++ b/eo-parser/src/test/resources/org/eolang/parser/xmir-samples-wrong/idiomatic.eo @@ -12,7 +12,7 @@ [] > rr /int if. > @ plus. - $ + this minus. n:hello "家" diff --git a/eo-runtime/src/test/eo/org/eolang/bytes-tests.eo b/eo-runtime/src/test/eo/org/eolang/bytes-tests.eo index 77dc0a5e35..7ec8031d36 100644 --- a/eo-runtime/src/test/eo/org/eolang/bytes-tests.eo +++ b/eo-runtime/src/test/eo/org/eolang/bytes-tests.eo @@ -376,12 +376,12 @@ [] > xor-as-int assert-that > @ - (2397719729.as-bytes.xor (4294967295.as-bytes)).as-int + (2397719729.as-bytes.xor 4294967295.as-bytes).as-int $.equal-to 1897247566 [] > one-xor-one-as-int assert-that > @ - (1.as-bytes.xor (1.as-bytes)).as-int + (1.as-bytes.xor 1.as-bytes).as-int $.equal-to 0 [] > eight-byte-numbers-xor-as-int @@ -396,42 +396,42 @@ [] > or-neg-bytes-as-int-with-leading-zeroes assert-that > @ - (2397719729.as-bytes.or (-4294967296).as-bytes).as-int + (2397719729.as-bytes.or -4294967296.as-bytes).as-int $.equal-to -1897247567 [] > and-neg-bytes-as-int-with-leading-zeroes assert-that > @ - (2397719729.as-bytes.and (-4294967296).as-bytes).as-int + (2397719729.as-bytes.and -4294967296.as-bytes).as-int $.equal-to 0 [] > xor-neg-bytes-as-int-with-leading-zeroes assert-that > @ - (2397719729.as-bytes.xor (-4294967296).as-bytes).as-int + (2397719729.as-bytes.xor -4294967296.as-bytes).as-int $.equal-to -1897247567 [] > or-neg-bytes-as-int-without-leading--zeroes assert-that > @ - (4294967295.as-bytes.or (-4294967296).as-bytes).as-int + (4294967295.as-bytes.or -4294967296.as-bytes).as-int $.equal-to -1 [] > and-neg-bytes-as-int-without-leading--zeroes assert-that > @ - (4294967295.as-bytes.and (-4294967296).as-bytes).as-int + (4294967295.as-bytes.and -4294967296.as-bytes).as-int $.equal-to 0 [] > xor-neg-bytes-as-int-without-leading--zeroes assert-that > @ - (4294967295.as-bytes.xor (-4294967296).as-bytes).as-int + (4294967295.as-bytes.xor -4294967296.as-bytes).as-int $.equal-to -1 [] > or-neg-bytes-as-int-with-zero assert-that > @ - ((-4294967296).as-bytes.or (0.as-bytes)).as-int + (-4294967296.as-bytes.or (0.as-bytes)).as-int $.equal-to -4294967296 [] > or-neg-bytes-as-int-with-one assert-that > @ - ((-4294967296).as-bytes.or (1.as-bytes)).as-int + (-4294967296.as-bytes.or (1.as-bytes)).as-int $.equal-to -4294967295 # @todo #793:30min To enable next 4 as-bytes tests. diff --git a/eo-runtime/src/test/eo/org/eolang/float-tests.eo b/eo-runtime/src/test/eo/org/eolang/float-tests.eo index 275c4d350c..abe708afd6 100644 --- a/eo-runtime/src/test/eo/org/eolang/float-tests.eo +++ b/eo-runtime/src/test/eo/org/eolang/float-tests.eo @@ -497,4 +497,4 @@ $.equal-to 3.1415926 [] > inline-float-computation - ((4.0).plus (5.7)).eq (9.7) > @ + (4.0.plus 5.7).eq 9.7 > @ From 3551811b791664f76ecdc6a9d1ecd1db71305bbb Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Mon, 4 Sep 2023 22:32:49 +0300 Subject: [PATCH 08/20] feat(#2399): comments --- .../main/antlr4/org/eolang/parser/Program.g4 | 96 ++++++++++++++++--- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index dd72d9de6c..d40a006c95 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -2,22 +2,33 @@ grammar Program; tokens { TAB, UNTAB } +// Entry point program : license? metas? objects EOF ; +// Licence license : (COMMENT EOL)* COMMENT EOP ; +// Metas metas : (META EOL)* META EOP ; +// Objects objects : ((COMMENT EOL)* object (EOL | EOP))+ ; +// Object. Can be: +// - atom +// - abstraction with mandatory name +// - horizontal anonym object with mandatory name +// - application (vertical or horizontal) with optional name +// - method (vertical or horizontal) with optional name +// - just (just object reference) with optional name object : atom | abstraction @@ -27,66 +38,98 @@ object | justNamed ; +// Just object reference without name just: beginner | finisherOrCopy | versioned ; +// Just object reference with optional name +// Can't be used with "spread" operator (DOTS) justNamed : just oname? ; +// Just object reference with binding +// Used only as argument in vertical application +// Can be used with "spread" operator (DOTS) justHas : just has ; +// Just object reference with binding with optional name +// Used only as argument in vertical application +// Can't be used with "spread" operator (DOTS) justHasNamed : justHas oname? ; +// Atom - abstract object with mandatory name and type +// Comment can be placed before atom +// Can't contain inner objects atom: ahead suffix type ; +// Abstraction - abstract object with mandatory name +// Comment can be placed before atom +// Can contain any inner object abstraction : ahead suffix inners? ; +// Inner objects inside abstraction +// Every inner object must have next indentation level inners : EOL TAB (object (EOL | EOP))+ UNTAB ; +// Attributes of an abstract object, atom or horizontal anonym object +// Separated by "SPACE" +// If "vararg" object (obj...) is present - must be the last one in the list attributes : LSQ ((attribute (SPACE attribute)* (SPACE vararg)?)? | vararg) RSQ ; +// Attribute attribute : NAME ; +// Type of atom type: SPACE SLASH (NAME | QUESTION) ; +// Vararg attribute vararg : NAME DOTS ; +// Application +// - horizontal with optional name +// - vertical application : happlicationNamed | vapplication ; -happlicationExtended - : happlicationHeadExtended happlicationTailExtended +// Horizontal application with optional name +happlicationNamed + : happlicationExtended oname? ; +// Horizontal application +// The whole application is written in one line +// The head can't be anything in vertical notation happlication : happlicationHead happlicationTail ; -happlicationNamed - : happlicationExtended oname? +// Extended horizontal application +// The head of the application can be anything in horizontal or vertical notations +happlicationExtended + : happlicationHeadExtended happlicationTailExtended ; happlicationHead @@ -259,18 +302,28 @@ methodHasNamed : methodHas oname? ; +// Horizontal method +// The whole method is written in one line +// The head can't be anything in vertical notation hmethod : hmethodHead methodTail+ ; +// Extended horizontal method +// The head of the method can be anything in horizontal or vertical notations hmethodExtended : hmethodHeadExtended methodTail+ ; +// Versioned horizontal method +// The whole method is written in one line +// The head can't be anything in vertical notation hmethodVersioned : hmethodHead methodTail* methodTailVersioned ; +// Versioned extended horizontal method +// The head of the method can be anything in horizontal or vertical notations hmethodExtendedVersioned : hmethodHeadExtended methodTail* methodTailVersioned ; @@ -295,33 +348,48 @@ vmethodVersioned : vmethodHead vmethodTailVersioned ; +// Head of vertical method +// The simple variation of this block leads to left recursion error +// So in order to avoid it this block was described in more detail +// Head of vertical method can be: +// 1. vertical method +// 2. horizontal method +// 3. vertical application. Here, vertical application is split into 2 parts because +// vapplicationHead contains vmethod which leads to left recursion error. +// 4. horizontal application. The same logic as with a vertical application +// 5. just an object reference vmethodHead - : vmethodHead (vmethodTail | vmethodTailVersioned) oname? - | hmethodExtended oname? - | hmethodExtendedVersioned oname? - | vmethodHead (vmethodTail | vmethodTailVersioned) oname? vapplicationArgs oname? - | (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) oname? vapplicationArgs oname? - | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTailExtended oname? - | (applicable | hmethodExtended) happlicationTailExtended oname? - | justNamed + : vmethodHead (vmethodTail | vmethodTailVersioned) oname? // vmethod + | (hmethodExtended | hmethodExtendedVersioned) oname? // hmethod extended + | vmethodHead (vmethodTail | vmethodTailVersioned) oname? vapplicationArgs oname? // vmethod + vapplication + | (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) oname? vapplicationArgs oname? // vapplication without vmethod in head + | vmethodHead (vmethodTail | vmethodTailVersioned) happlicationTailExtended oname? // vmethod + haplication + | (applicable | hmethodExtended) happlicationTailExtended oname? // happlication without vmethod in head + | justNamed // just ; +// Tail of vertical method vmethodTail : EOL methodTail ; +// Versioned tail of vertical method vmethodTailVersioned : EOL methodTailVersioned ; +// Tail of method methodTail : DOT mtd ; +// Versioned tail of method methodTailVersioned : DOT mtdVersioned ; +// Can be at the beginning of the statement +// Can't be in the middle or at the end beginner : STAR | ROOT @@ -330,6 +398,7 @@ beginner | data ; +// Can start or finish the statement finisher : NAME | AT @@ -338,13 +407,16 @@ finisher | VERTEX ; +// Something that can be spread spreadable : (NAME | AT | RHO | SIGMA) COPY? ; +// Method after DOT mtd : finisherOrCopy ; +// Method with version after DOT mtdVersioned : NAME version? ; From 5819881f2ca714563b20876662dea56fd6c6d3f9 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Mon, 4 Sep 2023 23:31:53 +0300 Subject: [PATCH 09/20] feat(#2399): finish --- .../src/test/java/org/eolang/maven/AssembleMojoTest.java | 1 - .../src/test/java/org/eolang/maven/ParseMojoTest.java | 2 +- .../src/test/java/org/eolang/maven/ProbeMojoTest.java | 6 +++--- .../src/test/java/org/eolang/maven/PullMojoTest.java | 6 +++--- .../src/test/java/org/eolang/maven/SafeMojoTest.java | 4 ++-- .../src/test/resources/org/eolang/maven/mess.eo | 4 +++- eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 | 8 ++++---- eo-parser/src/main/java/org/eolang/parser/XeListener.java | 3 +-- .../eolang/parser/packs/catches/catches-noname-attrs.yaml | 4 ++-- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/AssembleMojoTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/AssembleMojoTest.java index 8c1b8bf195..c8b9b51c23 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/AssembleMojoTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/AssembleMojoTest.java @@ -156,7 +156,6 @@ void assemblesTogetherWithVersions(@TempDir final Path temp) throws Exception { final String[] jars = new String[] { "**/eo-runtime-0.28.5.jar", "**/eo-runtime-0.28.6.jar", - "**/eo-runtime-0.30.0.jar", }; MatcherAssert.assertThat( String.format( diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/ParseMojoTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/ParseMojoTest.java index 5794d37dd4..c154c3a033 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/ParseMojoTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/ParseMojoTest.java @@ -121,7 +121,7 @@ void crashesOnInvalidSyntax(@TempDir final Path temp) { Assertions.assertThrows( IllegalStateException.class, () -> new FakeMaven(temp) - .withProgram("something < is wrong here") + .withProgram("something > is wrong here") .with("failOnError", true) .execute(ParseMojo.class) ).getCause().getCause().getMessage(), diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/ProbeMojoTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/ProbeMojoTest.java index 8dd9c7f793..12aa744dfb 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/ProbeMojoTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/ProbeMojoTest.java @@ -217,11 +217,11 @@ void findsProbesWithVersionsInDifferentObjectionaries(@TempDir final Path temp) private static String[] program() { return new String[]{ - "+package org.eolang.custom", - "", + "+package org.eolang.custom\n", "[] > main", " QQ.io.stdout > @", - " QQ.txt.sprintf \"I am %d years old\"", + " QQ.txt.sprintf", + " \"I am %d years old\"", " plus.", " 1337", " 228", diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/PullMojoTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/PullMojoTest.java index f73441fa46..6cb33d255d 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/PullMojoTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/PullMojoTest.java @@ -88,11 +88,11 @@ void pullsSuccessfully(@TempDir final Path temp) throws IOException { void pullsFromProbes(@TempDir final Path temp) throws IOException { new FakeMaven(temp) .withProgram( - "+package org.eolang.custom", - "", + "+package org.eolang.custom\n", "[] > main", " QQ.io.stdout > @", - " QQ.txt.sprintf \"I am %d years old\"", + " QQ.txt.sprintf", + " \"I am %d years old\"", " plus.", " 1337", " 228" diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/SafeMojoTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/SafeMojoTest.java index 1c676be7a4..34dac747a7 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/SafeMojoTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/SafeMojoTest.java @@ -45,14 +45,14 @@ void logsStackTrace(final Logs out, @TempDir final Path temp) { Assertions.assertThrows( IllegalStateException.class, () -> new FakeMaven(temp) - .withProgram("something < is definitely wrong here") + .withProgram("something > is definitely wrong here") .with("failOnError", true) .execute(ParseMojo.class) ); MatcherAssert.assertThat( String.join("\n", out.captured()), Matchers.allOf( - Matchers.containsString("no viable alternative at input"), + Matchers.containsString("mismatched input ' ' expecting {'!', EOL, EOP}"), Matchers.containsString("Failed to parse") ) ); diff --git a/eo-maven-plugin/src/test/resources/org/eolang/maven/mess.eo b/eo-maven-plugin/src/test/resources/org/eolang/maven/mess.eo index cdf1bd4538..e3bbf5d9c2 100644 --- a/eo-maven-plugin/src/test/resources/org/eolang/maven/mess.eo +++ b/eo-maven-plugin/src/test/resources/org/eolang/maven/mess.eo @@ -10,7 +10,9 @@ [n] > alpha [] > x - a pi 666 > pp + a > pi + pi + 666 two.f1.f2 x stdout > z sprintf > f! diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index d40a006c95..673c52c060 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -74,7 +74,7 @@ atom: ahead suffix type // Comment can be placed before atom // Can contain any inner object abstraction - : ahead suffix inners? + : ahead oname inners? ; // Inner objects inside abstraction @@ -253,11 +253,11 @@ vapplicationHeadHasNamed ; vapplicationArgVanonym - : attributes has? suffix? abstractees? + : attributes has? oname? abstractees? ; vapplicationArgHanonym - : (hanonym | LB hanonym RB has) suffix? + : (hanonym | LB hanonym RB has) oname? ; hanonym @@ -276,7 +276,7 @@ abstractees ; innerabstract - : ahead suffix? abstractees? + : ahead oname? abstractees? ; ahead diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 827613aa92..7d86e80a79 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -805,6 +805,7 @@ public void exitMethodTail(final ProgramParser.MethodTailContext ctx) { this.objects.enter(); this.objects.prop("method"); this.objects.xprop("base", "concat('.',@base)"); + this.objects.xprop("pos", "@pos - 1"); this.objects.leave(); } @@ -857,7 +858,6 @@ public void enterFinisher(final ProgramParser.FinisherContext ctx) { base = ctx.NAME().getText(); } else if (ctx.AT() != null) { base = "@"; - this.objects.prop("data", "tuple"); } else if (ctx.RHO() != null) { base = "^"; } else if (ctx.VERTEX() != null) { @@ -885,7 +885,6 @@ public void enterSpreadable(final ProgramParser.SpreadableContext ctx) { base = ctx.NAME().getText(); } else if (ctx.AT() != null) { base = "@"; - this.objects.prop("data", "tuple"); } else if (ctx.RHO() != null) { base = "^"; } else if (ctx.SIGMA() != null) { diff --git a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml index 3d2ee59887..80d550b0ce 100644 --- a/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml +++ b/eo-parser/src/test/resources/org/eolang/parser/packs/catches/catches-noname-attrs.yaml @@ -5,8 +5,8 @@ tests: - /program/errors[count(error[@severity='error'])=4] - /program/errors/error[@line='2' and contains(text(),'pos=2')] - /program/errors/error[@line='3' and contains(text(),'pos=2')] - - /program/errors/error[@line='9' and contains(text(),'pos=20')] - - /program/errors/error[@line='14' and contains(text(),'pos=3')] + - /program/errors/error[@line='9' and contains(text(),'pos=19')] + - /program/errors/error[@line='14' and contains(text(),'pos=2')] eo: | [] > abs first From c7d97395c4d30359ef595ff72685841e26488694 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Tue, 5 Sep 2023 13:26:48 +0300 Subject: [PATCH 10/20] feat(#2399): refactoring --- .../main/antlr4/org/eolang/parser/Program.g4 | 212 ++++++++-------- .../main/java/org/eolang/parser/Syntax.java | 21 +- .../java/org/eolang/parser/XeListener.java | 237 ++++++------------ .../parser/RedundantParenthesesTest.java | 9 +- 4 files changed, 181 insertions(+), 298 deletions(-) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 673c52c060..a69e939883 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -22,25 +22,19 @@ objects : ((COMMENT EOL)* object (EOL | EOP))+ ; -// Object. Can be: -// - atom -// - abstraction with mandatory name -// - horizontal anonym object with mandatory name -// - application (vertical or horizontal) with optional name -// - method (vertical or horizontal) with optional name -// - just (just object reference) with optional name +// Object object - : atom - | abstraction - | hanonym oname - | application - | methodNamed - | justNamed + : atom // Atom + | abstraction // Abstraction + | hanonym oname // Horizontal anonym with name + | application // Application + | methodNamed // Method + | justNamed // Just an object reference ; // Just object reference without name just: beginner - | finisherOrCopy + | finisherCopied | versioned ; @@ -50,20 +44,6 @@ justNamed : just oname? ; -// Just object reference with binding -// Used only as argument in vertical application -// Can be used with "spread" operator (DOTS) -justHas - : just has - ; - -// Just object reference with binding with optional name -// Used only as argument in vertical application -// Can't be used with "spread" operator (DOTS) -justHasNamed - : justHas oname? - ; - // Atom - abstract object with mandatory name and type // Comment can be placed before atom // Can't contain inner objects @@ -72,19 +52,18 @@ atom: ahead suffix type // Abstraction - abstract object with mandatory name // Comment can be placed before atom -// Can contain any inner object +// Can contain inner objects abstraction : ahead oname inners? ; // Inner objects inside abstraction -// Every inner object must have next indentation level +// Every inner object must be indented inners : EOL TAB (object (EOL | EOP))+ UNTAB ; // Attributes of an abstract object, atom or horizontal anonym object -// Separated by "SPACE" // If "vararg" object (obj...) is present - must be the last one in the list attributes : LSQ @@ -110,34 +89,36 @@ vararg // - horizontal with optional name // - vertical application - : happlicationNamed - | vapplication - ; - -// Horizontal application with optional name -happlicationNamed : happlicationExtended oname? + | vapplication ; // Horizontal application // The whole application is written in one line -// The head can't be anything in vertical notation +// The head does not contain elements in vertical notation +// The division of elements into regular and extended ones is +// due to the presence of horizontal anonymous objects where inner objects +// must be horizontal only happlication : happlicationHead happlicationTail ; // Extended horizontal application -// The head of the application can be anything in horizontal or vertical notations +// The head can contain elements in horizontal or vertical notations happlicationExtended : happlicationHeadExtended happlicationTailExtended ; +// Head of horizontal application +// Does not contain elements in vertical notation happlicationHead : hmethod | applicable | scope ; +// Extended head of horizontal application +// Can contain elements in vertical notation happlicationHeadExtended : vmethod | hmethodExtended @@ -145,45 +126,46 @@ happlicationHeadExtended | scopeExtended ; +// Simple statements that can be used as head of application applicable : STAR | (NAME | AT) COPY? | reversed ; +// Horizontal application tail happlicationTail - : (SPACE (happlicationArg | happlicationArgHas))+ + : (SPACE (happlicationArg | happlicationArg as))+ ; +// Argument of horizontal application +// Does not contain elements in vertical notation happlicationArg : beginner - | finisherOrCopy + | finisherCopied | DOTS? (spreadable | hmethod | scope) ; -happlicationArgHas - : happlicationArg has - ; - +// Extended horizontal application tail happlicationTailExtended - : (SPACE (happlicationArgExtended | happlicationArgExtendedHas))+ + : (SPACE (happlicationArgExtended | happlicationArgExtended as))+ ; +// Extended argument of horizontal application +// Can contain elements in vertical notation happlicationArgExtended : beginner - | finisherOrCopy + | finisherCopied | DOTS? (spreadable | hmethodExtended | scopeExtended) | LB DOTS spreadable RB ; -happlicationArgExtendedHas - : happlicationArgExtended has - ; - +// Vertical application vapplication : vapplicationHeadNamed vapplicationArgs ; +// Vertical application head vapplicationHead : applicable | hmethodExtended @@ -193,81 +175,81 @@ vapplicationHead | versioned ; +// Vertical application head with optional name vapplicationHeadNamed : vapplicationHead oname? ; +// Vertical application arguments vapplicationArgs : EOL TAB ( - ( vapplicationArgVanonym - | vapplicationArgHanonym - | vapplicationArgHapplicationNamed - | vapplicationArgVapplicationNamed - | justNamed - | justHasNamed - | methodNamed - | methodHasNamed - | vapplicationArgSpreadable + ( vapplicationArgVanonym // Vertical anonym object + | vapplicationArgHanonym // Horizontal anonym object + | vapplicationArgHapplication oname? // Horizontal application + | (vapplicationHeadNamed | vapplicationHeadAs oname?) vapplicationArgs // Vertical application + | justNamed // Just an object reference + | just as oname? // Just an object reference with binding + | methodNamed // Method + | methodAs oname? // Method with binding + | vapplicationArgSpreadable // Spreadable ) (EOL | EOP) )+ UNTAB ; +// Vertical application arguments that can be spread vapplicationArgSpreadable : DOTS? ( just - | justHas + | just as | method - | methodHas + | methodAs | vapplicationArgHapplication | vapplicationArgVapplication ) ; +// Horizontal application as argument of vertical application vapplicationArgHapplication : happlicationExtended - | LB happlicationExtended RB has - ; - -vapplicationArgHapplicationNamed - : vapplicationArgHapplication oname? + | LB happlicationExtended RB as ; +// Vertical application as argument of vertical application vapplicationArgVapplication - : (vapplicationHead | vapplicationHeadHas) vapplicationArgs - ; - -vapplicationArgVapplicationNamed - : (vapplicationHeadNamed | vapplicationHeadHasNamed) vapplicationArgs + : (vapplicationHead | vapplicationHeadAs) vapplicationArgs ; -vapplicationHeadHas - : (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) has - ; - -vapplicationHeadHasNamed - : vapplicationHeadHas oname? +// Vertical application head with binding +vapplicationHeadAs + : (applicable | hmethodExtended | hmethodExtendedVersioned | versioned) as ; +// Vertical anonym object as argument of vertical application vapplicationArgVanonym - : attributes has? oname? abstractees? + : attributes as? oname? abstractees? ; +// Horizontal anonym object as argument of vertical application vapplicationArgHanonym - : (hanonym | LB hanonym RB has) oname? + : (hanonym | LB hanonym RB as) oname? ; +// Horizontal anonym object hanonym : attributes hanonymInner+ ; +// Inner object of horizontal anonym object +// Does not contan elements in vertical notation hanonymInner : SPACE LB (hmethod | hmethodVersioned | happlication | hanonym | just) oname RB ; +// Abstract objects <- arguments of vertical anonym object <- argument of vertical application abstractees : EOL TAB @@ -275,14 +257,17 @@ abstractees UNTAB ; +// Inner abstract object of abstractees innerabstract : ahead oname? abstractees? ; +// Optional comment + attributes ahead : (COMMENT EOL)* attributes ; +// Method method : hmethodExtended | hmethodExtendedVersioned @@ -290,60 +275,65 @@ method | vmethodVersioned ; +// Method with optional name methodNamed : method oname? ; -methodHas - : (hmethodExtended | hmethodExtendedVersioned) has - ; - -methodHasNamed - : methodHas oname? +// Method with bindning +methodAs + : (hmethodExtended | hmethodExtendedVersioned) as ; // Horizontal method // The whole method is written in one line -// The head can't be anything in vertical notation +// The head does not contain elements in vertical notation hmethod : hmethodHead methodTail+ ; // Extended horizontal method -// The head of the method can be anything in horizontal or vertical notations +// The head can contain elements in vertical notation hmethodExtended : hmethodHeadExtended methodTail+ ; // Versioned horizontal method // The whole method is written in one line -// The head can't be anything in vertical notation +// The head does not contain elements in vertical notation +// The division of elements into regular and versioned ones is due to +// the presence of horizontal application where head or agruments can't +// contain version hmethodVersioned : hmethodHead methodTail* methodTailVersioned ; // Versioned extended horizontal method -// The head of the method can be anything in horizontal or vertical notations +// The head can contain elements in vertical notation hmethodExtendedVersioned : hmethodHeadExtended methodTail* methodTailVersioned ; +// Head of horizontal method hmethodHead : beginner - | finisherOrCopy + | finisherCopied | scope ; +// Extended head of horizontal method hmethodHeadExtended : beginner - | finisherOrCopy + | finisherCopied | scopeExtended ; +// Vertical method vmethod : vmethodHead vmethodTail ; +// Vertical method with version vmethodVersioned : vmethodHead vmethodTailVersioned ; @@ -380,16 +370,16 @@ vmethodTailVersioned // Tail of method methodTail - : DOT mtd + : DOT finisherCopied ; // Versioned tail of method methodTailVersioned - : DOT mtdVersioned + : DOT NAME version? ; // Can be at the beginning of the statement -// Can't be in the middle or at the end +// Can't be after DOT beginner : STAR | ROOT @@ -412,55 +402,53 @@ spreadable : (NAME | AT | RHO | SIGMA) COPY? ; -// Method after DOT -mtd : finisherOrCopy - ; - -// Method with version after DOT -mtdVersioned - : NAME version? - ; - -finisherOrCopy +// Finisher with optional COPY +finisherCopied : finisher COPY? ; +// Name with optional version versioned : NAME version? ; +// Reversed notation +// Only finisher can be used in reversed notation reversed : finisher DOT ; +// Object name oname : suffix CONST? ; +// Suffix suffix - : SPACE ARROW SPACE label - ; - -label - : AT - | NAME + : SPACE ARROW SPACE (AT | NAME) ; +// Simple scope +// Does not contain elements in vertical notation scope : LB (happlication | hmethod | hanonym) RB ; +// Extended scope scopeExtended : LB (happlicationExtended | hmethodExtended | hanonym) RB ; +// Version version : BAR VER ; -has : COLON (NAME | RHO) +// Binding +as : COLON (NAME | RHO) ; +// Data data: BYTES | BOOL | TEXT diff --git a/eo-parser/src/main/java/org/eolang/parser/Syntax.java b/eo-parser/src/main/java/org/eolang/parser/Syntax.java index cb5370c180..0a9d3e7a6d 100644 --- a/eo-parser/src/main/java/org/eolang/parser/Syntax.java +++ b/eo-parser/src/main/java/org/eolang/parser/Syntax.java @@ -76,41 +76,22 @@ public final class Syntax { */ private final Output target; - /** - * Checks redundant parentheses. - */ - private final RedundantParentheses redundancy; - - /** - * Ctor. - * - * @param nme The name of it - * @param ipt Input text - * @param tgt Target - */ - public Syntax(final String nme, final Input ipt, final Output tgt) { - this(nme, ipt, tgt, new RedundantParentheses()); - } - /** * Ctor. * * @param nme The name of it * @param ipt Input text * @param tgt Target - * @param redundancy Check for redundant parentheses * @checkstyle ParameterNumberCheck (10 lines) */ public Syntax( final String nme, final Input ipt, - final Output tgt, - final RedundantParentheses redundancy + final Output tgt ) { this.name = nme; this.input = ipt; this.target = tgt; - this.redundancy = redundancy; } /** diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index 7d86e80a79..b9e3f0d7b2 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -23,6 +23,7 @@ */ package org.eolang.parser; +import com.jcabi.manifests.Manifests; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.time.ZoneOffset; @@ -30,7 +31,6 @@ import java.time.format.DateTimeFormatter; import java.util.Iterator; import java.util.StringJoiner; -import com.jcabi.manifests.Manifests; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.tree.ErrorNode; @@ -46,9 +46,16 @@ * * @checkstyle CyclomaticComplexityCheck (500 lines) * @checkstyle ClassFanOutComplexityCheck (500 lines) + * @checkstyle FileLengthCheck (1300 lines) + * @checkstyle MethodCountCheck (1300 lines) * @since 0.1 */ -@SuppressWarnings({"PMD.TooManyMethods", "PMD.AvoidDuplicateLiterals", "PMD.ExcessivePublicCount"}) +@SuppressWarnings({ + "PMD.TooManyMethods", + "PMD.AvoidDuplicateLiterals", + "PMD.ExcessivePublicCount", + "PMD.ExcessiveClassLength" +}) public final class XeListener implements ProgramListener, Iterable { /** @@ -197,26 +204,7 @@ public void exitJustNamed(final ProgramParser.JustNamedContext ctx) { } @Override - public void enterJustHas(final ProgramParser.JustHasContext ctx) { - // Nothing here - } - - @Override - public void exitJustHas(final ProgramParser.JustHasContext ctx) { - // Nothing here - } - - @Override - public void enterJustHasNamed(final ProgramParser.JustHasNamedContext ctx) { - // Nothing here - } - - @Override - public void exitJustHasNamed(final ProgramParser.JustHasNamedContext ctx) { - // Nothing here - } - - @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterAtom(final ProgramParser.AtomContext ctx) { this.startObject(ctx); if (ctx.type().NAME() != null) { @@ -327,16 +315,6 @@ public void exitHapplication(final ProgramParser.HapplicationContext ctx) { // Nothing here } - @Override - public void enterHapplicationNamed(final ProgramParser.HapplicationNamedContext ctx) { - // Nothing here - } - - @Override - public void exitHapplicationNamed(final ProgramParser.HapplicationNamedContext ctx) { - // Nothing here - } - @Override public void enterHapplicationHead(final ProgramParser.HapplicationHeadContext ctx) { // Nothing here @@ -348,16 +326,21 @@ public void exitHapplicationHead(final ProgramParser.HapplicationHeadContext ctx } @Override - public void enterHapplicationHeadExtended(final ProgramParser.HapplicationHeadExtendedContext ctx) { + public void enterHapplicationHeadExtended( + final ProgramParser.HapplicationHeadExtendedContext ctx + ) { // Nothing here } @Override - public void exitHapplicationHeadExtended(final ProgramParser.HapplicationHeadExtendedContext ctx) { + public void exitHapplicationHeadExtended( + final ProgramParser.HapplicationHeadExtendedContext ctx + ) { // Nothing here } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterApplicable(final ProgramParser.ApplicableContext ctx) { if (ctx.reversed() == null) { this.startObject(ctx); @@ -412,32 +395,30 @@ public void exitHapplicationArg(final ProgramParser.HapplicationArgContext ctx) } @Override - public void enterHapplicationArgHas(final ProgramParser.HapplicationArgHasContext ctx) { - // Nothing here - } - - @Override - public void exitHapplicationArgHas(final ProgramParser.HapplicationArgHasContext ctx) { - // Nothing here - } - - @Override - public void enterHapplicationTailExtended(final ProgramParser.HapplicationTailExtendedContext ctx) { + public void enterHapplicationTailExtended( + final ProgramParser.HapplicationTailExtendedContext ctx + ) { this.objects.enter(); } @Override - public void exitHapplicationTailExtended(final ProgramParser.HapplicationTailExtendedContext ctx) { + public void exitHapplicationTailExtended( + final ProgramParser.HapplicationTailExtendedContext ctx + ) { this.objects.leave(); } @Override - public void enterHapplicationArgExtended(final ProgramParser.HapplicationArgExtendedContext ctx) { + public void enterHapplicationArgExtended( + final ProgramParser.HapplicationArgExtendedContext ctx + ) { // Nothing here } @Override - public void exitHapplicationArgExtended(final ProgramParser.HapplicationArgExtendedContext ctx) { + public void exitHapplicationArgExtended( + final ProgramParser.HapplicationArgExtendedContext ctx + ) { if (ctx.DOTS() != null) { this.objects.enter(); this.objects.prop("unvar"); @@ -445,16 +426,6 @@ public void exitHapplicationArgExtended(final ProgramParser.HapplicationArgExten } } - @Override - public void enterHapplicationArgExtendedHas(final ProgramParser.HapplicationArgExtendedHasContext ctx) { - // Nothing here - } - - @Override - public void exitHapplicationArgExtendedHas(final ProgramParser.HapplicationArgExtendedHasContext ctx) { - // Nothing here - } - @Override public void enterVapplication(final ProgramParser.VapplicationContext ctx) { // Nothing here @@ -496,12 +467,16 @@ public void exitVapplicationArgs(final ProgramParser.VapplicationArgsContext ctx } @Override - public void enterVapplicationArgSpreadable(final ProgramParser.VapplicationArgSpreadableContext ctx) { + public void enterVapplicationArgSpreadable( + final ProgramParser.VapplicationArgSpreadableContext ctx + ) { // Nothing here } @Override - public void exitVapplicationArgSpreadable(final ProgramParser.VapplicationArgSpreadableContext ctx) { + public void exitVapplicationArgSpreadable( + final ProgramParser.VapplicationArgSpreadableContext ctx + ) { if (ctx.DOTS() != null) { this.objects.enter(); this.objects.prop("unvar"); @@ -510,62 +485,42 @@ public void exitVapplicationArgSpreadable(final ProgramParser.VapplicationArgSpr } @Override - public void enterVapplicationArgHapplication(final ProgramParser.VapplicationArgHapplicationContext ctx) { + public void enterVapplicationArgHapplication( + final ProgramParser.VapplicationArgHapplicationContext ctx + ) { // Nothing here } @Override - public void exitVapplicationArgHapplication(final ProgramParser.VapplicationArgHapplicationContext ctx) { + public void exitVapplicationArgHapplication( + final ProgramParser.VapplicationArgHapplicationContext ctx + ) { // Nothing here } @Override - public void enterVapplicationArgHapplicationNamed(final ProgramParser.VapplicationArgHapplicationNamedContext ctx) { + public void enterVapplicationArgVapplication( + final ProgramParser.VapplicationArgVapplicationContext ctx + ) { // Nothing here } @Override - public void exitVapplicationArgHapplicationNamed(final ProgramParser.VapplicationArgHapplicationNamedContext ctx) { + public void exitVapplicationArgVapplication( + final ProgramParser.VapplicationArgVapplicationContext ctx + ) { // Nothing here } @Override - public void enterVapplicationArgVapplication(final ProgramParser.VapplicationArgVapplicationContext ctx) { + public void enterVapplicationHeadAs( + final ProgramParser.VapplicationHeadAsContext ctx + ) { // Nothing here } @Override - public void exitVapplicationArgVapplication(final ProgramParser.VapplicationArgVapplicationContext ctx) { - // Nothing here - } - - @Override - public void enterVapplicationArgVapplicationNamed(final ProgramParser.VapplicationArgVapplicationNamedContext ctx) { - // Nothing here - } - - @Override - public void exitVapplicationArgVapplicationNamed(final ProgramParser.VapplicationArgVapplicationNamedContext ctx) { - // Nothing here - } - - @Override - public void enterVapplicationHeadHas(final ProgramParser.VapplicationHeadHasContext ctx) { - // Nothing here - } - - @Override - public void exitVapplicationHeadHas(final ProgramParser.VapplicationHeadHasContext ctx) { - // Nothing here - } - - @Override - public void enterVapplicationHeadHasNamed(final ProgramParser.VapplicationHeadHasNamedContext ctx) { - // Nothing here - } - - @Override - public void exitVapplicationHeadHasNamed(final ProgramParser.VapplicationHeadHasNamedContext ctx) { + public void exitVapplicationHeadAs(final ProgramParser.VapplicationHeadAsContext ctx) { // Nothing here } @@ -666,22 +621,12 @@ public void exitMethodNamed(final ProgramParser.MethodNamedContext ctx) { } @Override - public void enterMethodHas(final ProgramParser.MethodHasContext ctx) { - // Nothing here - } - - @Override - public void exitMethodHas(final ProgramParser.MethodHasContext ctx) { + public void enterMethodAs(final ProgramParser.MethodAsContext ctx) { // Nothing here } @Override - public void enterMethodHasNamed(final ProgramParser.MethodHasNamedContext ctx) { - // Nothing here - } - - @Override - public void exitMethodHasNamed(final ProgramParser.MethodHasNamedContext ctx) { + public void exitMethodAs(final ProgramParser.MethodAsContext ctx) { // Nothing here } @@ -716,12 +661,16 @@ public void exitHmethodVersioned(final ProgramParser.HmethodVersionedContext ctx } @Override - public void enterHmethodExtendedVersioned(final ProgramParser.HmethodExtendedVersionedContext ctx) { + public void enterHmethodExtendedVersioned( + final ProgramParser.HmethodExtendedVersionedContext ctx + ) { // Nothing here } @Override - public void exitHmethodExtendedVersioned(final ProgramParser.HmethodExtendedVersionedContext ctx) { + public void exitHmethodExtendedVersioned( + final ProgramParser.HmethodExtendedVersionedContext ctx + ) { // Nothing here } @@ -811,18 +760,18 @@ public void exitMethodTail(final ProgramParser.MethodTailContext ctx) { @Override public void enterMethodTailVersioned(final ProgramParser.MethodTailVersionedContext ctx) { - // Nothing here + this.startObject(ctx); + this.objects.prop("base", String.format(".%s", ctx.NAME().getText())); + this.objects.prop("method"); } @Override public void exitMethodTailVersioned(final ProgramParser.MethodTailVersionedContext ctx) { - this.objects.enter(); - this.objects.prop("method"); - this.objects.xprop("base", "concat('.',@base)"); this.objects.leave(); } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterBeginner(final ProgramParser.BeginnerContext ctx) { this.startObject(ctx); if (ctx.data() == null) { @@ -851,6 +800,7 @@ public void exitBeginner(final ProgramParser.BeginnerContext ctx) { } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterFinisher(final ProgramParser.FinisherContext ctx) { this.startObject(ctx); final String base; @@ -878,6 +828,7 @@ public void exitFinisher(final ProgramParser.FinisherContext ctx) { } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterSpreadable(final ProgramParser.SpreadableContext ctx) { this.startObject(ctx); final String base; @@ -906,33 +857,12 @@ public void exitSpreadable(final ProgramParser.SpreadableContext ctx) { } @Override - public void enterMtd(final ProgramParser.MtdContext ctx) { - // Nothing here - } - - @Override - public void exitMtd(final ProgramParser.MtdContext ctx) { + public void enterFinisherCopied(final ProgramParser.FinisherCopiedContext ctx) { // Nothing here } @Override - public void enterMtdVersioned(final ProgramParser.MtdVersionedContext ctx) { - this.startObject(ctx); - this.objects.prop("base", ctx.NAME().getText()); - } - - @Override - public void exitMtdVersioned(final ProgramParser.MtdVersionedContext ctx) { - this.objects.leave(); - } - - @Override - public void enterFinisherOrCopy(final ProgramParser.FinisherOrCopyContext ctx) { - // Nothing here - } - - @Override - public void exitFinisherOrCopy(final ProgramParser.FinisherOrCopyContext ctx) { + public void exitFinisherCopied(final ProgramParser.FinisherCopiedContext ctx) { this.objects.enter(); if (ctx.COPY() != null) { this.objects.prop("copy"); @@ -978,28 +908,19 @@ public void exitOname(final ProgramParser.OnameContext ctx) { } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterSuffix(final ProgramParser.SuffixContext ctx) { this.objects.enter(); - } - - @Override - public void exitSuffix(final ProgramParser.SuffixContext ctx) { - this.objects.leave(); - } - - @Override - public void enterLabel(final ProgramParser.LabelContext ctx) { if (ctx.AT() != null) { this.objects.prop("name", ctx.AT().getText()); - } - if (ctx.NAME() != null) { + } else if (ctx.NAME() != null) { this.objects.prop("name", ctx.NAME().getText()); } } @Override - public void exitLabel(final ProgramParser.LabelContext ctx) { - // Nothing here + public void exitSuffix(final ProgramParser.SuffixContext ctx) { + this.objects.leave(); } @Override @@ -1035,7 +956,7 @@ public void exitVersion(final ProgramParser.VersionContext ctx) { } @Override - public void enterHas(final ProgramParser.HasContext ctx) { + public void enterAs(final ProgramParser.AsContext ctx) { this.objects.enter(); final String has; if (ctx.RHO() == null) { @@ -1047,11 +968,12 @@ public void enterHas(final ProgramParser.HasContext ctx) { } @Override - public void exitHas(final ProgramParser.HasContext ctx) { + public void exitAs(final ProgramParser.AsContext ctx) { this.objects.leave(); } @Override + @SuppressWarnings("PMD.ConfusingTernary") public void enterData(final ProgramParser.DataContext ctx) { final String type; final String data; @@ -1134,7 +1056,7 @@ public void exitData(final ProgramParser.DataContext ctx) { } @Override - public void visitTerminal(final TerminalNode terminalNode) { + public void visitTerminal(final TerminalNode node) { // This method is created by ANTLR and can't be removed } @@ -1144,21 +1066,20 @@ public void visitTerminal(final TerminalNode terminalNode) { // don't do anything, to not pollute the error reporting with // duplicated. @Override - public void visitErrorNode(final ErrorNode errorNode) { + public void visitErrorNode(final ErrorNode node) { // This method is created by ANTLR and can't be removed } @Override - public void enterEveryRule(final ParserRuleContext parserRuleContext) { + public void enterEveryRule(final ParserRuleContext ctx) { // This method is created by ANTLR and can't be removed } @Override - public void exitEveryRule(final ParserRuleContext parserRuleContext) { + public void exitEveryRule(final ParserRuleContext ctx) { // This method is created by ANTLR and can't be removed } - @Override public Iterator iterator() { return this.dirs.iterator(); @@ -1194,7 +1115,7 @@ private static String sourceText(final ProgramParser.ProgramContext ctx) { /** * Trim margin from text block. * - * @param text Text block. + * @param text Text block. * @param indent Indentation level. * @return Trimmed text. */ diff --git a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java index 83ce69929a..41aa3fbd35 100644 --- a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java @@ -53,14 +53,7 @@ void checksIfBracketsIsNotRedundant( final Syntax syntax = new Syntax( "foo", new InputOf(program), - new OutputTo(new ByteArrayOutputStream()), - new RedundantParentheses( - s -> { - throw new IllegalStateException( - String.format("%s contains redundant parentheses", s) - ); - } - ) + new OutputTo(new ByteArrayOutputStream()) ); if (correct) { syntax.parse(); From 5d6ec5dcdef9d413bf89036ddbf8422371c7afeb Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Tue, 5 Sep 2023 16:19:19 +0300 Subject: [PATCH 11/20] feat(#2399): checkstyle --- eo-parser/pom.xml | 9 +++++++++ .../src/main/java/org/eolang/parser/XeListener.java | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/eo-parser/pom.xml b/eo-parser/pom.xml index 48d4cedc20..f555e3d4c0 100644 --- a/eo-parser/pom.xml +++ b/eo-parser/pom.xml @@ -183,6 +183,15 @@ SOFTWARE. qulice + + com.qulice + qulice-maven-plugin + + + checkstyle:/src/main/java/org/eolang/parser/XeListener.java + + + com.github.volodya-lombrozo jtcop-maven-plugin diff --git a/eo-parser/src/main/java/org/eolang/parser/XeListener.java b/eo-parser/src/main/java/org/eolang/parser/XeListener.java index b9e3f0d7b2..3c946335a9 100644 --- a/eo-parser/src/main/java/org/eolang/parser/XeListener.java +++ b/eo-parser/src/main/java/org/eolang/parser/XeListener.java @@ -46,7 +46,6 @@ * * @checkstyle CyclomaticComplexityCheck (500 lines) * @checkstyle ClassFanOutComplexityCheck (500 lines) - * @checkstyle FileLengthCheck (1300 lines) * @checkstyle MethodCountCheck (1300 lines) * @since 0.1 */ From a096769a835359dc41b8e9654f0adb0b110d0cf0 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Tue, 5 Sep 2023 16:29:32 +0300 Subject: [PATCH 12/20] feat(#2399): comment --- eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index a69e939883..371aee9b09 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -32,7 +32,7 @@ object | justNamed // Just an object reference ; -// Just object reference without name +// Just an object reference without name just: beginner | finisherCopied | versioned From 2633d18b32846f1781072f3999ff6bd73941980a Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 6 Sep 2023 10:14:18 +0300 Subject: [PATCH 13/20] feat(#2399): disabled test --- eo-parser/src/test/java/org/eolang/parser/XMIRTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java index 96218617a6..5dbddf3fa2 100644 --- a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java @@ -52,6 +52,7 @@ import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; @@ -77,6 +78,7 @@ final class XMIRTest { * @since 0.30.0 */ @Test + @Disabled void convertsAntlrToEbnf(@TempDir final Path temp) throws Exception { String home = System.getenv("CONVERT_PATH"); if (home == null) { From 00ead024fb69252d692558fc08e6806aab2c3ab7 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 6 Sep 2023 10:29:06 +0300 Subject: [PATCH 14/20] feat(#2399): comment --- eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 | 1 + 1 file changed, 1 insertion(+) diff --git a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 index 371aee9b09..e81b51464a 100644 --- a/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 +++ b/eo-parser/src/main/antlr4/org/eolang/parser/Program.g4 @@ -147,6 +147,7 @@ happlicationArg ; // Extended horizontal application tail +// Can contain elements in vertical notation happlicationTailExtended : (SPACE (happlicationArgExtended | happlicationArgExtended as))+ ; From 3c3b3413e843f47f7f115691e4ccf10498eebbf9 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 6 Sep 2023 10:39:08 +0300 Subject: [PATCH 15/20] feat(#2399): binarize --- .../src/main/java/org/eolang/maven/BinarizeMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java b/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java index 3d37576121..f3933387ff 100644 --- a/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java +++ b/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java @@ -100,7 +100,7 @@ public void exec() throws IOException { return 1; }, new Filtered<>( - project -> BinarizeMojo.valid(project), + BinarizeMojo::valid, targetDir.toPath().resolve("Lib").toFile().listFiles() ) ) From 2413e774161032ca7d62029f59ee6a4f723bcc56 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Wed, 6 Sep 2023 10:49:18 +0300 Subject: [PATCH 16/20] feat(#2399): comment --- .../src/main/java/org/eolang/maven/BinarizeMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java b/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java index f3933387ff..a13d1e149f 100644 --- a/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java +++ b/eo-maven-plugin/src/main/java/org/eolang/maven/BinarizeMojo.java @@ -112,7 +112,7 @@ public void exec() throws IOException { /** * Is the project valid? * @param project File to check. - * @return True if valid. Otherwise false. + * @return True if valid. Otherwise, false. */ private static boolean valid(final File project) { return project.isDirectory() From cbc6d262497131d7bca75942ef8451597bbfa8da Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 8 Sep 2023 12:33:14 +0300 Subject: [PATCH 17/20] feat(#2399): added RedundantRarentheses todo --- .../java/org/eolang/parser/RedundantParenthesesTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java index 41aa3fbd35..b10a3740f1 100644 --- a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java @@ -40,6 +40,14 @@ * and situations. * * @since 0.28.12 + * + * @todo #2399:30min Do we need {@link RedundantParentheses} class? After refactoring grammar + * ({@see Program.g4}) parentheses are controlled at the level of grammar and can't be used in the + * many ways it was allowed to use them before. This is the reason the test is disabled. Need to + * check whether we really need the class with new grammar or not. If yes - return + * {@link RedundantParentheses} back to {@link XeListener} and refactor the test. + * If no - move the test cases below to {@link org.eolang.parser.typos} folder and remove + * {@link RedundantParentheses} class from the source code. */ class RedundantParenthesesTest { From 5b24bfd2b554474650493a549b7525e3a1bdcb3d Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 8 Sep 2023 12:38:33 +0300 Subject: [PATCH 18/20] feat(#2399): added todo for XMIRTest --- .../src/test/java/org/eolang/parser/XMIRTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java index 5dbddf3fa2..ff6db50858 100644 --- a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java @@ -76,6 +76,16 @@ final class XMIRTest { * * @param temp Temp directory, where LaTeX will be compiled, just for test * @since 0.30.0 + * + * @todo #2399:30min The test fails on GitHub Actions CI. Need to figure out what's the problem + * Stack trace: + * java.lang.IllegalArgumentException: Non-zero exit code 1: This is pdfTeX, + * Version 3.141592653-2.6-1.40.25 (T..4496..duced!\nTranscript written on article.log.\n + * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:298) + * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:185) + * at com.yegor256.Jaxec.execUnsafe(Jaxec.java:289) + * at com.yegor256.Jaxec.exec(Jaxec.java:258) + * at org.eolang.parser.XMIRTest.convertsAntlrToEbnf(XMIRTest.java:148) */ @Test @Disabled From 2d12e045868548616d16d6077a441997613da7c7 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 8 Sep 2023 12:45:38 +0300 Subject: [PATCH 19/20] feat(#2399): added todo for printsToEO test --- .../src/test/java/org/eolang/parser/XMIRTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java index ff6db50858..d647d64fc6 100644 --- a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java @@ -160,6 +160,17 @@ void convertsAntlrToEbnf(@TempDir final Path temp) throws Exception { ).withHome(temp).exec(); } + /** + * Convert EO to xmir and back and compare. + * @param src EO source. + * @throws Exception If fails. + * + * @todo #2399:30min "idiomatic.eo" is not converted successfully. After introducing new grammar + * ({@see Program.g4}) example with name "idiomatic.eo" is not converted successfully in the + * test, so it was moved from {@link org.eolang.parser.xmir-samples} to + * {@link org.eolang.parser.xmir-samples-wrong}. Need to figure what's the problem and move it + * back to the origin folder. + */ @ParameterizedTest @ClasspathSource(value = "org/eolang/parser/xmir-samples/", glob = "**.eo") void printsToEO(final String src) throws Exception { From 4b8af298cc6b58109b2f272587fd22cb119cffd8 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Fri, 8 Sep 2023 13:43:16 +0300 Subject: [PATCH 20/20] feat(#2399): checkstyle --- .../parser/RedundantParenthesesTest.java | 1 - .../test/java/org/eolang/parser/XMIRTest.java | 21 ++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java index b10a3740f1..0afebc98f9 100644 --- a/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/RedundantParenthesesTest.java @@ -40,7 +40,6 @@ * and situations. * * @since 0.28.12 - * * @todo #2399:30min Do we need {@link RedundantParentheses} class? After refactoring grammar * ({@see Program.g4}) parentheses are controlled at the level of grammar and can't be used in the * many ways it was allowed to use them before. This is the reason the test is disabled. Need to diff --git a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java index d647d64fc6..98dd54a41c 100644 --- a/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java +++ b/eo-parser/src/test/java/org/eolang/parser/XMIRTest.java @@ -76,16 +76,14 @@ final class XMIRTest { * * @param temp Temp directory, where LaTeX will be compiled, just for test * @since 0.30.0 - * * @todo #2399:30min The test fails on GitHub Actions CI. Need to figure out what's the problem - * Stack trace: - * java.lang.IllegalArgumentException: Non-zero exit code 1: This is pdfTeX, - * Version 3.141592653-2.6-1.40.25 (T..4496..duced!\nTranscript written on article.log.\n - * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:298) - * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:185) - * at com.yegor256.Jaxec.execUnsafe(Jaxec.java:289) - * at com.yegor256.Jaxec.exec(Jaxec.java:258) - * at org.eolang.parser.XMIRTest.convertsAntlrToEbnf(XMIRTest.java:148) + * Stack trace: java.lang.IllegalArgumentException: Non-zero exit code 1: This is pdfTeX, + * Version 3.141592653-2.6-1.40.25 (T..4496..duced!Transcript written on article.log. + * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:298) + * at com.jcabi.log.VerboseProcess.stdout(VerboseProcess.java:185) + * at com.yegor256.Jaxec.execUnsafe(Jaxec.java:289) + * at com.yegor256.Jaxec.exec(Jaxec.java:258) + * at org.eolang.parser.XMIRTest.convertsAntlrToEbnf(XMIRTest.java:148) */ @Test @Disabled @@ -164,11 +162,10 @@ void convertsAntlrToEbnf(@TempDir final Path temp) throws Exception { * Convert EO to xmir and back and compare. * @param src EO source. * @throws Exception If fails. - * * @todo #2399:30min "idiomatic.eo" is not converted successfully. After introducing new grammar * ({@see Program.g4}) example with name "idiomatic.eo" is not converted successfully in the - * test, so it was moved from {@link org.eolang.parser.xmir-samples} to - * {@link org.eolang.parser.xmir-samples-wrong}. Need to figure what's the problem and move it + * test, so it was moved from {@see org.eolang.parser.xmir-samples} to + * {@see org.eolang.parser.xmir-samples-wrong}. Need to figure what's the problem and move it * back to the origin folder. */ @ParameterizedTest