Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,8 @@ void convertsValidXmirAndParsableEO(@Mktmp final Path temp)
"[args] > app",
" QQ.io.stdout > @",
" \"Hello, world!\"",
" args.@ > phi!"
" args.@ > phi!",
" * (* 1 2) (* 3 4) (* 5 6) > mx"
)
.with("printSourcesDir", temp.resolve("target/1-parse").toFile())
.with("printOutputDir", temp.resolve("target/generated-sources").toFile())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ asserts:
- //o[@base='Q.org.eolang.string' and @loc='Φ.org.abc.a.φ.α0.α0' and @original-name='a.φ.α0.α0']
- //o[@base='Q.x' and @name='tt' and @loc='Φ.org.abc.tt' and @original-name='tt']
- //o[@base='Q.org.eolang.number' and @loc='Φ.org.abc.tt.α0' and @original-name='tt.α0']
- //o[@base='Q.org.eolang.tuple.empty.with' and @loc='Φ.org.abc.tt.α1.ρ' and @original-name='tt.α1.ρ']
- //o[@base='Q.org.eolang.number' and @loc='Φ.org.abc.tt.α1.ρ.α0' and @original-name='tt.α1.ρ.α0']
- //o[@base='Q.org.eolang.tuple.empty' and @loc='Φ.org.abc.tt.α1.α0.α0' and @original-name='tt.α1.α0.α0']
- //o[@base='Q.org.eolang.number' and @loc='Φ.org.abc.tt.α1.α0.α1' and @original-name='tt.α1.α0.α1']
- //o[not(@base) and @loc='Φ.org.abc.tt.α2' and @original-name='tt.α2']
- //o[@base='∅' and @name='e' and @loc='Φ.org.abc.tt.α2.e' and @original-name='tt.α2.e']
- //o[@base='$.e.hello' and @loc='Φ.org.abc.tt.α2.φ' and @original-name='tt.α2.φ']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@ sheets:
- /org/eolang/maven/transpile/to-java.xsl
asserts:
- /program[not(errors)]
- //java[contains(text(), ' Phi rbb = Phi.Φ.take("org").take("eolang").take("tuple").take("empty").take("with");')]
- //java[contains(text(), ' rbb = new PhWith(rbb, 0, rbb1);')]
- //java[contains(text(), ' Phi rb = new PhMethod(rbb, "with");')]
- //java[contains(text(), ' rb = new PhWith(rb, 0, rb1);')]
- //java[contains(text(), ' Phi r = new PhMethod(rb, "with");')]
- //java[contains(text(), 'Phi r11 = Phi.Φ.take("org").take("eolang").take("tuple");')]
- //java[contains(text(), 'r11 = new PhCopy(r11);')]
- //java[contains(text(), ' Phi r111 = Phi.Φ.take("org").take("eolang").take("tuple").take("empty");')]
- //java[contains(text(), ' Phi r112 = Phi.Φ.take("org").take("eolang").take("number");')]
- //java[contains(text(), ' Phi r113 = Phi.Φ.take("org").take("eolang").take("number");')]
- //java[contains(text(), 'r11 = new PhWith(r11, 0, r111);')]
- //java[contains(text(), 'r11 = new PhWith(r11, 1, r112);')]
- //java[contains(text(), 'r11 = new PhWith(r11, 2, r113);')]
input: |
# No comments.
[] > foo
Expand Down
37 changes: 21 additions & 16 deletions eo-parser/src/main/java/org/eolang/parser/EoSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.jcabi.xml.XMLDocument;
import com.yegor256.xsline.Shift;
import com.yegor256.xsline.TrClasspath;
import com.yegor256.xsline.TrDefault;
import com.yegor256.xsline.TrJoined;
import com.yegor256.xsline.Train;
import com.yegor256.xsline.Xsline;
import java.io.IOException;
Expand Down Expand Up @@ -78,22 +80,25 @@ public final class EoSyntax implements Syntax {
*/
private static final Function<XML, XML> CANONICAL = new Xsline(
new TrFull(
new TrClasspath<>(
"/org/eolang/parser/parse/move-voids-up.xsl",
"/org/eolang/parser/parse/validate-before-stars.xsl",
"/org/eolang/parser/parse/resolve-before-stars.xsl",
"/org/eolang/parser/parse/wrap-method-calls.xsl",
"/org/eolang/parser/parse/const-to-dataized.xsl",
"/org/eolang/parser/parse/stars-to-tuples.xsl",
"/org/eolang/parser/parse/vars-float-up.xsl",
"/org/eolang/parser/parse/build-fqns.xsl",
"/org/eolang/parser/parse/expand-qqs.xsl",
"/org/eolang/parser/parse/expand-aliases.xsl",
"/org/eolang/parser/parse/resolve-aliases.xsl",
"/org/eolang/parser/parse/add-default-package.xsl",
"/org/eolang/parser/parse/explicit-data.xsl",
"/org/eolang/parser/parse/roll-bases.xsl"
).back()
new TrJoined<>(
new TrClasspath<>(
"/org/eolang/parser/parse/move-voids-up.xsl",
"/org/eolang/parser/parse/validate-before-stars.xsl",
"/org/eolang/parser/parse/resolve-before-stars.xsl",
"/org/eolang/parser/parse/wrap-method-calls.xsl",
"/org/eolang/parser/parse/const-to-dataized.xsl",
"/org/eolang/parser/parse/stars-to-tuples.xsl",
"/org/eolang/parser/parse/vars-float-up.xsl",
"/org/eolang/parser/parse/build-fqns.xsl",
"/org/eolang/parser/parse/expand-qqs.xsl",
"/org/eolang/parser/parse/expand-aliases.xsl",
"/org/eolang/parser/parse/resolve-aliases.xsl",
"/org/eolang/parser/parse/add-default-package.xsl",
"/org/eolang/parser/parse/explicit-data.xsl",
"/org/eolang/parser/parse/roll-bases.xsl"
).back(),
new TrDefault<>(new StHex())
)
)
)::pass;

Expand Down
43 changes: 43 additions & 0 deletions eo-parser/src/main/java/org/eolang/parser/StHex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2016-2025 Objectionary.com
* SPDX-License-Identifier: MIT
*/
package org.eolang.parser;

import com.yegor256.xsline.Shift;
import com.yegor256.xsline.StEnvelope;
import java.nio.ByteBuffer;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
* This {@link Shift} turns regular data (numbers) inside XMIR
* into hexadecimal representation.
*
* @since 0.54
*/
final class StHex extends StEnvelope {
/**
* Ctor.
*/
StHex() {
super(
new StXnav(
"st-hex",
"//o[@hex]",
xnav -> {
final Node node = xnav.node();
node.setTextContent(
new BytesToHex(
ByteBuffer
.allocate(Double.BYTES)
.putDouble(Double.parseDouble(xnav.text().orElseThrow()))
.array()
).get()
);
((Element) node).removeAttribute("hex");
}
)
);
}
}
22 changes: 19 additions & 3 deletions eo-parser/src/main/java/org/eolang/parser/StXnav.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*
* @since 0.53.0
*/
public final class StXnav implements Shift {
final class StXnav implements Shift {
/**
* XPath to search for.
*/
Expand All @@ -28,19 +28,35 @@ public final class StXnav implements Shift {
*/
private final Consumer<Xnav> fun;

/**
* UID.
*/
private final String identifier;

/**
* Ctor.
* @param path The XPath
* @param func The function
*/
StXnav(final String path, final Consumer<Xnav> func) {
this("st-xnav", path, func);
}

/**
* Ctor.
* @param identifier UID
* @param path The XPath
* @param func The function
*/
public StXnav(final String path, final Consumer<Xnav> func) {
StXnav(final String identifier, final String path, final Consumer<Xnav> func) {
this.identifier = identifier;
this.xpath = path;
this.fun = func;
}

@Override
public String uid() {
return this.getClass().getSimpleName();
return this.identifier;
}

@Override
Expand Down
27 changes: 17 additions & 10 deletions eo-parser/src/main/java/org/eolang/parser/Xmir.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
import com.jcabi.xml.XML;
import com.yegor256.xsline.Shift;
import com.yegor256.xsline.StClasspath;
import com.yegor256.xsline.StEndless;
import com.yegor256.xsline.TrClasspath;
import com.yegor256.xsline.TrDefault;
import com.yegor256.xsline.TrJoined;
import com.yegor256.xsline.Xsline;
import java.util.Collection;
import java.util.List;
Expand Down Expand Up @@ -47,14 +47,14 @@ public final class Xmir implements XML {
*/
private static final Xsline FOR_EO = new Xsline(
new TrFull(
new TrDefault<>(
new StEndless(
new StClasspath("/org/eolang/parser/print/tuples-to-stars.xsl")
),
Xmir.UNHEX,
new StClasspath("/org/eolang/parser/print/inline-cactoos.xsl"),
new StClasspath("/org/eolang/parser/print/dataized-to-const.xsl"),
new StClasspath("/org/eolang/parser/print/to-eo.xsl")
new TrJoined<>(
new TrDefault<>(Xmir.UNHEX),
new TrClasspath<>(
"/org/eolang/parser/print/tuples-to-stars.xsl",
"/org/eolang/parser/print/inline-cactoos.xsl",
"/org/eolang/parser/print/dataized-to-const.xsl",
"/org/eolang/parser/print/to-eo.xsl"
).back()
)
)
);
Expand Down Expand Up @@ -204,6 +204,13 @@ private String converted(final Xsline train, final String node) {
.element("program")
.element(node)
.text()
.get();
.orElseThrow(
() -> new IllegalStateException(
String.format(
"Couldn't find element '/program/%s' after converting to %s",
node, node
)
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,24 @@

Into the next one without @star:

<o base=".with">
<o base=".with">
<o base=".with">
<o base=".empty">
<o base="tuple"/>
</o>
<o base="Q.org.eolang.tuple">
<o base="Q.org.eolang.tuple">
<o base="Q.org.eolang.tuple">
<o base="Q.org.eolang.tuple.empty"/>
<o base="1"/>
<o base="Q.org.eolang.number">
<o base="Q.org.eolang.bytes" hex="">1</o>
</o>
</o>
<o base="2"/>
<o base="Q.org.eolang.number">
<o base="Q.org.eolang.bytes" hex="">2</o>
</o>
</o>
<o base="3"/>
<o base="Q.org.eolang.number">
<o base="Q.org.eolang.bytes" hex="">3</o>
</o>
</o>
-->
<xsl:output encoding="UTF-8" method="xml"/>
Expand All @@ -39,19 +46,24 @@
</xsl:element>
</xsl:variable>
<xsl:element name="o">
<xsl:attribute name="base" select="'.with'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:apply-templates select="@* except (@star | @base)"/>
<xsl:apply-templates select="$nested"/>
<xsl:apply-templates select="o[last()]"/>
<xsl:element name="o">
<xsl:attribute name="base" select="'Q.org.eolang.number'"/>
<xsl:element name="o">
<xsl:attribute name="base" select="'Q.org.eolang.bytes'"/>
<xsl:attribute name="hex"/>
<xsl:value-of select="count(o)"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="o">
<xsl:attribute name="base" select="'.empty'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple.empty'"/>
<xsl:apply-templates select="@* except (@star | @base)"/>
<xsl:element name="o">
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
</xsl:element>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,31 @@
Performs the reverse operation of "/org/eolang/parser/stars-to-tuples.xsl"
-->
<xsl:output encoding="UTF-8" method="xml"/>
<xsl:template match="o[@base='Q.org.eolang.tuple.empty' and not(@star)]">
<xsl:template match="o[starts-with(@base, 'Q.org.eolang.tuple') and o[1][starts-with(@base, 'Q.org.eolang.tuple')]]">
<xsl:variable name="arg">
<xsl:apply-templates select="o[2]"/>
</xsl:variable>
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="star"/>
<xsl:apply-templates select="o[1]" mode="inner"/>
<xsl:apply-templates select="$arg" mode="no-as"/>
</xsl:copy>
</xsl:template>
<xsl:template match="o[@base='Q.org.eolang.tuple.empty.with']">
<xsl:element name="o">
<xsl:attribute name="star"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:apply-templates select="@* except @base"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
<xsl:template match="o" mode="inner">
<xsl:if test="@base='Q.org.eolang.tuple'">
<xsl:variable name="arg">
<xsl:apply-templates select="o[2]"/>
</xsl:variable>
<xsl:apply-templates select="o[1]" mode="inner"/>
<xsl:apply-templates select="$arg" mode="no-as"/>
</xsl:if>
</xsl:template>
<xsl:template match="o[@base='.with' and o[1][@star]]">
<xsl:element name="o">
<xsl:attribute name="star"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:apply-templates select="@* except @base"/>
<xsl:copy-of select="o[@star]/o"/>
<xsl:copy-of select="o[not(@star)]"/>
</xsl:element>
<xsl:template match="*" mode="no-as">
<xsl:copy>
<xsl:copy-of select="@* except @as"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
Expand Down
48 changes: 48 additions & 0 deletions eo-parser/src/test/java/org/eolang/parser/StHexTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2016-2025 Objectionary.com
* SPDX-License-Identifier: MIT
*/
package org.eolang.parser;

import com.jcabi.matchers.XhtmlMatchers;
import com.jcabi.xml.XMLDocument;
import com.yegor256.xsline.Xsline;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

/**
* Test case for {@link StHex}.
*
* @since 0.54.0
*/
final class StHexTest {
@ParameterizedTest
@CsvSource({
"1, 3F-F0-00-00-00-00-00-00",
"2, 40-00-00-00-00-00-00-00",
"3, 40-08-00-00-00-00-00-00",
"10, 40-24-00-00-00-00-00-00"
})
void convertsNumberToHex(final String number, final String bytes) {
MatcherAssert.assertThat(
String.format(
"StHex must convert number '%s' to '%s' bytes and remove @hex attribute",
number, bytes
),
new Xsline(new StHex()).pass(
new XMLDocument(
String.format(
"<p><o base='Q.org.eolang.number'><o base='Q.org.eolang.bytes' hex=''>%s</o></o></p>",
number
)
)
),
Matchers.allOf(
XhtmlMatchers.hasXPath(String.format("//o[text()='%s']", bytes)),
XhtmlMatchers.hasXPath("/p[not(//o[@hex])]")
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ asserts:
- //o[@base='Q.org.eolang.bytes' and @name='fourth' and not(o) and text()='11-21']
- //o[@base='.string' and @name='str' and count(o)=2 and o[last() and @base='Q.org.eolang.bytes' and text()='48-65-79']]
- //o[@base='Q.org.eolang.bytes' and @name='bt' and count(o)=0 and text()='A2-']
- //o[@base='.with']/o[@base='.with']/o[@base='.with']/o[@base='Q.org.eolang.number']/o[@base='Q.org.eolang.bytes' and text()='3F-F0-00-00-00-00-00-00']
- //o[@base='Q.org.eolang.tuple']/o[@base='Q.org.eolang.tuple']/o[@base='Q.org.eolang.tuple']/o[@base='Q.org.eolang.number']/o[@base='Q.org.eolang.bytes' and text()='3F-F0-00-00-00-00-00-00']
input: |
42 > first
number 11-21 > bts
Expand Down
Loading