diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000000000000000000000000000000000000..a55e7a179bde3e4e772c29c0c85e53354aa54618 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ +<component name="ProjectCodeStyleConfiguration"> + <state> + <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" /> + </state> +</component> \ No newline at end of file diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..3673142aaa8a956b55608e6ce54c9f9541707a59 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphBuilder.java @@ -0,0 +1,43 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.Graph; + +import java.util.function.Function; + +public class GraphBuilder { + Graph graph; + + private GraphBuilder() { + this.graph = new Graph(); + } + + public static IBuild graph() { + return new GraphBuilder.Builder(); + } + + public interface IBuild { + IBuild addGraphRelation(Function<GraphRelationBuilder.RequiredLabel, GraphRelationBuilder.IBuild> c); + + Graph buildGraph(); + } + + private static class Builder implements IBuild { + private final GraphBuilder instance; + + public Builder() { + instance = new GraphBuilder(); + } + + @Override + public IBuild addGraphRelation(Function<GraphRelationBuilder.RequiredLabel, GraphRelationBuilder.IBuild> c) { + instance.graph.add(c.apply(GraphRelationBuilder.createBuilder()).buildGraphRelation()); + return this; + } + + @Override + public Graph buildGraph() { + return instance.graph; + } + } + +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphRelationBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphRelationBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..85ce4803b3750c363791fa5ae779c9c3346fa151 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/GraphRelationBuilder.java @@ -0,0 +1,94 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.GraphNode; +import fr.tetras_libre.unltools.unl.GraphRelation; + +import java.util.function.Function; + + +public class GraphRelationBuilder { + private String label; + private String graphReference; + private GraphNode node1; + private GraphNode node2; + + public static RequiredLabel createBuilder() { + return new GraphRelationBuilder.Builder(); + } + + + public interface RequiredLabel { + OptionalGraphReference label(String label); + } + + public interface OptionalGraphReference { + RequiredLeftNode reference(String nodeName); + + RequiredLeftNode noReference(); + } + + public interface RequiredLeftNode { + RequiredRightNode leftNode(Function<UniversalWordNodeBuilder.IRequiredUniversalWord, UniversalWordNodeBuilder.IBuild> f); + + IBuild rightSubGraphNode(Function<SubGraphReferenceNodeBuilder.IRequiredReferenceNumber, SubGraphReferenceNodeBuilder.IBuild> f); + } + + public interface RequiredRightNode { + IBuild rightNode(Function<UniversalWordNodeBuilder.IRequiredUniversalWord, UniversalWordNodeBuilder.IBuild> f); + + IBuild rightSubGraphNode(Function<SubGraphReferenceNodeBuilder.IRequiredReferenceNumber, SubGraphReferenceNodeBuilder.IBuild> f); + } + + public interface IBuild { + GraphRelation buildGraphRelation(); + } + + private static class Builder implements RequiredLabel, OptionalGraphReference, RequiredLeftNode, RequiredRightNode, IBuild { + private final GraphRelationBuilder instance; + + public Builder() { + instance = new GraphRelationBuilder(); + } + + @Override + public RequiredLeftNode reference(String nodeName) { + instance.graphReference = nodeName; + return this; + } + + @Override + public RequiredLeftNode noReference() { + instance.graphReference = ""; + return this; + } + + @Override + public RequiredRightNode leftNode(Function<UniversalWordNodeBuilder.IRequiredUniversalWord, UniversalWordNodeBuilder.IBuild> f) { + this.instance.node1 = f.apply(UniversalWordNodeBuilder.createBuilder()).buildUniversalWordNode(); + return this; + } + + @Override + public IBuild rightSubGraphNode(Function<SubGraphReferenceNodeBuilder.IRequiredReferenceNumber, SubGraphReferenceNodeBuilder.IBuild> f) { + instance.node2 = f.apply(SubGraphReferenceNodeBuilder.createBuilder()).buildSubGraphReferenceNode(); + return this; + } + + @Override + public GraphRelation buildGraphRelation() { + return new GraphRelation(instance.node1, instance.node2, instance.label, instance.graphReference); + } + + @Override + public OptionalGraphReference label(String label) { + instance.label = label; + return this; + } + + @Override + public IBuild rightNode(Function<UniversalWordNodeBuilder.IRequiredUniversalWord, UniversalWordNodeBuilder.IBuild> f) { + instance.node2 = f.apply(UniversalWordNodeBuilder.createBuilder()).buildUniversalWordNode(); + return this; + } + } +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..934e5186671ef5c114ecadf6624cd036c013cf28 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionBuilder.java @@ -0,0 +1,105 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.Restriction; +import fr.tetras_libre.unltools.unl.UniversalWord; + +public class RestrictionBuilder { + private String label; + private char orientation; + private UniversalWord universalWord; + + private RestrictionBuilder() { + label = ""; + orientation = ' '; + universalWord = null; + } + + public interface IRequiredLabel { + IOrientation label(String label); + } + + public static Restriction simpleRestriction(String label, RestrictionOrientation orientation, String headwordLabel) { + return RestrictionBuilder + .createBuilder() + .label(label) + .withOrientation(orientation) + .universalWord(UniversalWordBuilder.simpleUniversalWord(headwordLabel)) + .buildRestriction(); + } + + public static IRequiredLabel createBuilder() { + return new RestrictionBuilder.Builder(); + } + + public static Restriction ternaryTransitiveRestriction(String label1, String label2, String label3, RestrictionOrientation orientation) { + return RestrictionBuilder + .createBuilder() + .label(label1) + .withOrientation(orientation) + .universalWord( + UniversalWordBuilder + .createBuilder() + .headWord(label2) + .addSimpleRestriction(label1, orientation, label3 ) + .buildUniversalWord() + ) + .buildRestriction(); + } + + public interface IOrientation { + IRequiredUniversalWord withOrientation(RestrictionOrientation orientation); + } + + public interface IRequiredUniversalWord { + IBuild universalWord(UniversalWord universalWord); + } + + public interface IBuild { + Restriction buildRestriction(); + } + + private static class Builder implements IRequiredLabel, IRequiredUniversalWord, IOrientation, IBuild { + private final RestrictionBuilder instance; + + public Builder(){ + instance = new RestrictionBuilder(); + } + + @Override + public IBuild universalWord(UniversalWord universalWord) { + instance.universalWord = universalWord; + return this; + } + + @Override + public IRequiredUniversalWord withOrientation(RestrictionOrientation orientation) { + switch (orientation) { + case Left: + instance.orientation = '<'; + break; + case None: + instance.orientation = ' '; + break; + case Right: + instance.orientation = '>'; + break; + } + + return this; + } + + @Override + public Restriction buildRestriction() { + return new Restriction(instance.label, instance.orientation, instance.universalWord); + } + + @Override + public IOrientation label(String label) { + if(null == label) + throw new IllegalArgumentException(); + instance.label = label; + + return this; + } + } +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionOrientation.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionOrientation.java new file mode 100644 index 0000000000000000000000000000000000000000..9d61c1a581e999c7d4694e826ce06ed67101bc2e --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/RestrictionOrientation.java @@ -0,0 +1,7 @@ +package fr.tetras_libre.unltools.unl.builders; + +public enum RestrictionOrientation { + None, + Right, + Left +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/SubGraphReferenceNodeBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/SubGraphReferenceNodeBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..0d8193e040d75c87fbeeeb82ce0fd01ac7222b14 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/SubGraphReferenceNodeBuilder.java @@ -0,0 +1,61 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.SubGraphReferenceNode; + +import java.util.HashSet; + +public class SubGraphReferenceNodeBuilder { + private String referenceNumber; + private HashSet<String> attributes; + + public static IRequiredReferenceNumber createBuilder() + { + return new SubGraphReferenceNodeBuilder.Builder(); + } + + private SubGraphReferenceNodeBuilder() { + referenceNumber = null; + attributes = new HashSet<>(); + } + + public interface IRequiredReferenceNumber { + IBuild referenceNumber(String referenceNumber); + } + + public interface IBuild { + IBuild addAttribute(String attribute); + + SubGraphReferenceNode buildSubGraphReferenceNode(); + } + + private static class Builder implements IRequiredReferenceNumber, IBuild { + SubGraphReferenceNodeBuilder instance; + + public Builder() { + instance = new SubGraphReferenceNodeBuilder(); + } + + @Override + public IBuild referenceNumber(String referenceNumber) { + if (null == referenceNumber || referenceNumber.isBlank()) + throw new IllegalArgumentException(); + + this.instance.referenceNumber = referenceNumber; + + return this; + } + + @Override + public IBuild addAttribute(String attribute) { + if (null != attribute && !attribute.isBlank()) + this.instance.attributes.add(attribute); + + return this; + } + + @Override + public SubGraphReferenceNode buildSubGraphReferenceNode() { + return new SubGraphReferenceNode(instance.referenceNumber, instance.attributes); + } + } +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..b6bb120e7701a3eaea9acd64c55adc5532da697a --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordBuilder.java @@ -0,0 +1,80 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.Restriction; +import fr.tetras_libre.unltools.unl.UniversalWord; + +import java.util.TreeSet; +import java.util.function.Function; + +public class UniversalWordBuilder { + private final TreeSet<Restriction> restrictions; + private String headWord; + + private UniversalWordBuilder() { + restrictions = new TreeSet<>(); + } + + public static IRequiredHeadWord createBuilder() { + return new UniversalWordBuilder.Builder(); + } + + public static UniversalWord simpleUniversalWord(String headWord) { + return UniversalWordBuilder.createBuilder() + .headWord(headWord) + .buildUniversalWord(); + } + + public interface IBuild { + + IBuild addRestriction(Function<RestrictionBuilder.IRequiredLabel, RestrictionBuilder.IBuild> f); + + IBuild addSimpleRestriction(String label1, RestrictionOrientation orientation, String label2); + + IBuild addTernaryTransitiveRestriction(String firstLabel, String secondLabel, String thirdLabel, RestrictionOrientation orientation); + + UniversalWord buildUniversalWord(); + } + + public interface IRequiredHeadWord { + IBuild headWord(String headword); + } + + private static class Builder implements IRequiredHeadWord, IBuild { + private final UniversalWordBuilder instance; + + Builder() { + instance = new UniversalWordBuilder(); + } + + @Override + public IBuild addRestriction(Function<RestrictionBuilder.IRequiredLabel, RestrictionBuilder.IBuild> f) { + instance.restrictions.add(f.apply(RestrictionBuilder.createBuilder()).buildRestriction()); + return this; + } + + @Override + public IBuild addSimpleRestriction(String label1, RestrictionOrientation orientation, String label2) { + instance.restrictions.add(RestrictionBuilder.simpleRestriction(label1, orientation, label2)); + return this; + } + + @Override + public IBuild addTernaryTransitiveRestriction(String firstLabel, String secondLabel, String thirdLabel, RestrictionOrientation orientation) { + instance.restrictions.add(RestrictionBuilder.ternaryTransitiveRestriction(firstLabel, secondLabel, thirdLabel, orientation)); + return this; + } + + @Override + public UniversalWord buildUniversalWord() { + return new UniversalWord(instance.headWord, instance.restrictions); + } + + @Override + public IBuild headWord(String headword) { + if (null == headword) + throw new IllegalArgumentException(); + instance.headWord = headword; + return this; + } + } +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordNodeBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordNodeBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..77021800087bc9adb62bc2c2195a145678d698b7 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UniversalWordNodeBuilder.java @@ -0,0 +1,80 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.UniversalWord; +import fr.tetras_libre.unltools.unl.UniversalWordNode; + +import java.util.HashSet; +import java.util.function.Function; +import java.util.function.Supplier; + +public class UniversalWordNodeBuilder { + private final HashSet<String> attributes; + private UniversalWord universalWord; + private String instanceNumber; + + private UniversalWordNodeBuilder() { + this.attributes = new HashSet<>(); + this.instanceNumber = ""; + } + + public static IRequiredUniversalWord createBuilder() { + return new UniversalWordNodeBuilder.Builder(); + } + + public interface IRequiredUniversalWord { + IBuild universalWord(Function<UniversalWordBuilder.IRequiredHeadWord, UniversalWordBuilder.IBuild> f); + + IBuild simpleUniversalWord(Supplier<String> s); + } + + public interface IBuild { + IBuild addAttribute(String attribute); + + IBuild instanceNumber(String nodeReference); + + UniversalWordNode buildUniversalWordNode(); + } + + private static class Builder implements IRequiredUniversalWord, IBuild { + private final UniversalWordNodeBuilder instance; + + public Builder() { + this.instance = new UniversalWordNodeBuilder(); + } + + @Override + public IBuild addAttribute(String attribute) { + if (null != attribute + && !attribute.isBlank()) + this.instance.attributes.add(attribute); + + return this; + } + + @Override + public IBuild instanceNumber(String nodeReference) { + if(null == nodeReference){ + throw new IllegalArgumentException(); + } + this.instance.instanceNumber = nodeReference; + return this; + } + + @Override + public UniversalWordNode buildUniversalWordNode() { + return new UniversalWordNode(instance.universalWord, instance.attributes, instance.instanceNumber); + } + + @Override + public IBuild universalWord(Function<UniversalWordBuilder.IRequiredHeadWord, UniversalWordBuilder.IBuild> f) { + instance.universalWord = f.apply(UniversalWordBuilder.createBuilder()).buildUniversalWord(); + return this; + } + + @Override + public IBuild simpleUniversalWord(Supplier<String> s) { + instance.universalWord = UniversalWordBuilder.simpleUniversalWord(s.get()); + return this; + } + } +} diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UnlDocumentNodeBuilder.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UnlDocumentNodeBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..2db0555bdd5bebe449d391aebdd883eb481b3f33 --- /dev/null +++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/builders/UnlDocumentNodeBuilder.java @@ -0,0 +1,74 @@ +package fr.tetras_libre.unltools.unl.builders; + +import fr.tetras_libre.unltools.unl.Graph; +import fr.tetras_libre.unltools.unl.UnlDocumentNode; +import fr.tetras_libre.unltools.unl.UnlDocumentNodeType; + +import java.util.function.Function; + +public class UnlDocumentNodeBuilder { + private UnlDocumentNodeType unlDocumentNodeType; + private String docNodeLabel; + private Graph graph; + + private UnlDocumentNodeBuilder() { + docNodeLabel = null; + graph = null; + } + + public static IUnlDocumentNodeType createBuilder() { + return new UnlDocumentNodeBuilder.Builder(); + } + + public interface IUnlDocumentNodeType { + ILabel withNodeType(UnlDocumentNodeType nodeType); + } + + public interface ILabel { + IGraph withLabel(String label); + } + + public interface IGraph { + IBuild withGraph(Function<GraphBuilder.IBuild, GraphBuilder.IBuild> f); + } + + public interface IBuild { + UnlDocumentNode buildUnlDocumentNode(); + } + + private static class Builder implements IBuild, ILabel, IGraph, IUnlDocumentNodeType { + private final UnlDocumentNodeBuilder instance; + + Builder() { + instance = new UnlDocumentNodeBuilder(); + } + + @Override + public UnlDocumentNode buildUnlDocumentNode() { + return new UnlDocumentNode(instance.unlDocumentNodeType, instance.docNodeLabel, instance.graph); + } + + @Override + public IGraph withLabel(String label) { + if (null == label || label.isBlank()) + throw new IllegalArgumentException(); + + instance.docNodeLabel = label; + return this; + } + + @Override + public IBuild withGraph(Function<GraphBuilder.IBuild, GraphBuilder.IBuild> f) { + if (null != instance.graph) + throw new IllegalStateException(); + instance.graph = f.apply(GraphBuilder.graph()).buildGraph(); + return this; + } + + @Override + public ILabel withNodeType(UnlDocumentNodeType nodeType) { + instance.unlDocumentNodeType = nodeType; + return this; + } + } +} diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.java index 4889a853c58d0151527c1d4fb42d577b416dc93f..67e2115a5b25f864f603b88c8e1f5f867fd578d5 100644 --- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.java +++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.java @@ -2,25 +2,93 @@ /* Generated By:JavaCC: Do not edit this line. UnlParser.java */ package fr.tetras_libre.unltools.unl.parser; -import fr.tetras_libre.unltools.unl.*; - -import java.util.Set; +import java.io.FileInputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.util.SortedSet; import java.util.TreeSet; +import java.util.Set; import java.util.Vector; +import fr.tetras_libre.unltools.unl.*; public class UnlParser implements UnlParserConstants { /* Test program */ - /*public static void main(String args[]) throws ParseException, Exception { + public static void main(String args[]) throws ParseException, Exception { if (args.length != 1) throw new Exception("Please pass the file name as first and only arg."); UnlParser parser = new UnlParser(new BufferedReader(new InputStreamReader(new FileInputStream(args[0])))); parser.createUnlDocumentList(); - }*/ + } - private final java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>(); +/*--------------------------------- + * Unl DOCUMENT STRUCTURE + *---------------------------------*/ + final public +UnlDocument unlDocument() throws ParseException, ParseException {Token docLabel; + UnlDocument doc = null; + UnlDocumentNode node; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOC:{ + docLabel = jj_consume_token(DOC); +doc = new UnlDocument(docLabel.image); + break; + } + default: + jj_la1[0] = jj_gen; + ; + } +// If there is no doc element, create it... + if (null == doc) { doc = new UnlDocument("[D]"); } ; + label_1: + while (true) { + try { + node = structuredElement(); + label_2: + while (true) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DEUXPOINT:{ + ; + break; + } + default: + jj_la1[1] = jj_gen; + break label_2; + } + jj_consume_token(DEUXPOINT); + } +doc.add(node); + } catch (Exception ex) { +node = new UnlDocumentNode(ex.getMessage()); + doc.setError(ex.getMessage()); + doc.add(node); + } + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PARAGRAPH: + case TITLE: + case SENTENCE: + case END_PARAGRAPH:{ + ; + break; + } + default: + jj_la1[2] = jj_gen; + break label_1; + } + } + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case END_DOC:{ + jj_consume_token(END_DOC); + break; + } + default: + jj_la1[3] = jj_gen; + ; + } +{if ("" != null) return doc;} + throw new Error("Missing return statement in function"); +} final public UnlDocumentNode structuredElement() throws ParseException {Token t; UnlDocumentNode sent; @@ -54,362 +122,219 @@ public class UnlParser implements UnlParserConstants { throw new ParseException(); } throw new Error("Missing return statement in function"); - } - - final public UnlDocumentNode title() throws ParseException { - Graph g; - Token t; - t = jj_consume_token(TITLE); - g = relationList(); - jj_consume_token(END_TITLE); - { - if ("" != null) return new UnlDocumentNode(UnlDocumentNodeType.Title, t.image, g); - } - throw new Error("Missing return statement in function"); - } - - /** - * Generated Token Manager. - */ - public UnlParserTokenManager token_source; - /** - * Current token. - */ - public Token token; - /** - * Next token. - */ - public Token jj_nt; - SimpleCharStream jj_input_stream; - private int jj_ntk; - private int jj_gen; - private int[] jj_expentry; - private int jj_kind = -1; - - final public UnlDocumentNode sentence() throws ParseException { - Graph g; - Token t; - t = jj_consume_token(SENTENCE); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case GENERIC_TOKEN: { - g = relationList(); - break; - } - case NODELIST: { - g = nodeAndRelations(); - break; - } - default: - jj_la1[5] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - jj_consume_token(END_SENTENCE); - { - if ("" != null) return new UnlDocumentNode(UnlDocumentNodeType.Sentence, t.image, g); - } - throw new Error("Missing return statement in function"); - } +} - /*--------------------------------- - * Unl DOCUMENT STRUCTURE - *---------------------------------*/ - final public UnlDocument unlDocument() throws ParseException { - Token docLabel; - UnlDocument doc = null; - UnlDocumentNode node; - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case DOC: { - docLabel = jj_consume_token(DOC); - doc = new UnlDocument(docLabel.image); - break; - } - default: - jj_la1[0] = jj_gen; - } -// If there is no doc element, create it... - if (null == doc) { - doc = new UnlDocument("[D]"); - } - label_1: - while (true) { - try { - node = structuredElement(); - label_2: - while (true) { - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case DEUXPOINT: { - break; - } - default: - jj_la1[1] = jj_gen; - break label_2; - } - jj_consume_token(DEUXPOINT); - } - doc.add(node); - } catch (Exception ex) { - node = new UnlDocumentNode(ex.getMessage()); - doc.setError(ex.getMessage()); - doc.add(node); - } - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case PARAGRAPH: - case TITLE: - case SENTENCE: - case END_PARAGRAPH: { - break; - } - default: - jj_la1[2] = jj_gen; - break label_1; - } - } - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case END_DOC: { - jj_consume_token(END_DOC); - break; - } - default: - jj_la1[3] = jj_gen; - } - { - if ("" != null) return doc; - } - throw new Error("Missing return statement in function"); - } + final public UnlDocumentNode title() throws ParseException {Graph g; +Token t; + t = jj_consume_token(TITLE); + g = relationList(); + jj_consume_token(END_TITLE); +{if ("" != null) return new UnlDocumentNode(UnlDocumentNodeType.Title, t.image, g);} + throw new Error("Missing return statement in function"); +} - final public GraphRelation relation() throws ParseException { - Token rl; - Token subGraphNumber = null; - GraphNode n1, n2; - rl = jj_consume_token(GENERIC_TOKEN); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case COLON_NUMBER: { - subGraphNumber = jj_consume_token(COLON_NUMBER); - break; - } - default: - jj_la1[7] = jj_gen; - } - jj_consume_token(PARO); - n1 = node(); - jj_consume_token(COMMA); - n2 = node(); - jj_consume_token(PARF); - if (null == subGraphNumber) { - if ("" != null) return new GraphRelation(n1, n2, rl.image); - } else { - if ("" != null) return new GraphRelation(n1, n2, rl.image, subGraphNumber.image); - } - throw new Error("Missing return statement in function"); + final public UnlDocumentNode sentence() throws ParseException {Graph g; +Token t; + t = jj_consume_token(SENTENCE); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_TOKEN:{ + g = relationList(); + break; + } + case NODELIST:{ + g = nodeAndRelations(); + break; + } + default: + jj_la1[5] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); } + jj_consume_token(END_SENTENCE); +{if ("" != null) return new UnlDocumentNode(UnlDocumentNodeType.Sentence, t.image, g);} + throw new Error("Missing return statement in function"); +} - final public Restriction restriction() throws ParseException { - Token label; - Token direction; - UniversalWord uw; - label = jj_consume_token(GENERIC_TOKEN); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case CHEVRD: { - direction = jj_consume_token(CHEVRD); - break; - } - case CHEVRG: { - direction = jj_consume_token(CHEVRG); - break; - } - default: - jj_la1[15] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - uw = embeddedUniversalWord(label.image); - { - if ("" != null) return new Restriction(label.image, direction.image.charAt(0), uw); - } - throw new Error("Missing return statement in function"); +/*--------------------------------- + * RELATIONS + *---------------------------------*/ + final public +Graph relationList() throws ParseException {GraphRelation rel; + Graph g = new Graph(); + label_3: + while (true) { + rel = relation(); +g.add(rel); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_TOKEN:{ + ; + break; + } + default: + jj_la1[6] = jj_gen; + break label_3; + } } +{if ("" != null) return g;} + throw new Error("Missing return statement in function"); +} - /*--------------------------------- - * RELATIONS - *---------------------------------*/ - final public Graph relationList() throws ParseException { - GraphRelation rel; - Graph g = new Graph(); - label_3: - while (true) { - rel = relation(); - g.add(rel); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case GENERIC_TOKEN: { - break; - } - default: - jj_la1[6] = jj_gen; - break label_3; - } - } - { - if ("" != null) return g; - } - throw new Error("Missing return statement in function"); + final public GraphRelation relation() throws ParseException {Token rl; + Token subGraphNumber = null; + GraphNode n1, n2; + rl = jj_consume_token(GENERIC_TOKEN); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COLON_NUMBER:{ + subGraphNumber = jj_consume_token(COLON_NUMBER); + break; + } + default: + jj_la1[7] = jj_gen; + ; } + jj_consume_token(PARO); + n1 = node(); + jj_consume_token(COMMA); + n2 = node(); + jj_consume_token(PARF); +if (null == subGraphNumber) + {if ("" != null) return new GraphRelation(n1, n2, rl.image);} + else + {if ("" != null) return new GraphRelation(n1, n2, rl.image, subGraphNumber.image);} + throw new Error("Missing return statement in function"); +} - final public SubGraphReferenceNode decoratedSubGraphNumber() throws ParseException { - Token num; - Set attr; - num = jj_consume_token(COLON_NUMBER); - attr = attributes(); - { - if ("" != null) return new SubGraphReferenceNode(num.image, attr); - } - throw new Error("Missing return statement in function"); + final public GraphNode node() throws ParseException {UniversalWordNode uwn; + SubGraphReferenceNode sgn; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DBLQUOTED: + case GENERIC_TOKEN:{ + uwn = decoratedUniversalWord(); +{if ("" != null) return (GraphNode) uwn;} + break; + } + case COLON_NUMBER:{ + sgn = decoratedSubGraphNumber(); +{if ("" != null) return (GraphNode) sgn;} + break; + } + default: + jj_la1[8] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); } + throw new Error("Missing return statement in function"); +} - /*--------------------------------- - * RULES FOR TESTS - *---------------------------------*/ + final public SubGraphReferenceNode decoratedSubGraphNumber() throws ParseException {Token num; + Set attr; + num = jj_consume_token(COLON_NUMBER); + attr = attributes(); +{if ("" != null) return new SubGraphReferenceNode(num.image, attr);} + throw new Error("Missing return statement in function"); +} - /*--------------------------------- - * NODES AND RELATIONS ([W] syntax) - *---------------------------------*/ +/*--------------------------------- + * NODES AND RELATIONS ([W] syntax) + *---------------------------------*/ // For the moment, only accept isolated node. - final public Graph nodeAndRelations() throws ParseException { - GraphNode n; - Graph g = new Graph(); - jj_consume_token(NODELIST); - n = node(); - jj_consume_token(END_NODELIST); - g.add(n); - { - if ("" != null) return g; - } - throw new Error("Missing return statement in function"); - } + final public Graph nodeAndRelations() throws ParseException {GraphNode n; + Graph g = new Graph(); + jj_consume_token(NODELIST); + n = node(); + jj_consume_token(END_NODELIST); +g.add(n); + {if ("" != null) return g;} + throw new Error("Missing return statement in function"); +} - /*--------------------------------- - * DECORATED UW - *---------------------------------*/ - final public UniversalWordNode decoratedUniversalWord() throws ParseException { - UniversalWord uw; - Token num = null; - Set attr; - uw = universalWord(); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case COLON_NUMBER: { - num = jj_consume_token(COLON_NUMBER); - break; - } - default: - jj_la1[9] = jj_gen; - } - attr = attributes(); - if (null == num) { - { - if ("" != null) return new UniversalWordNode(uw, attr); - } - } else { - { - if ("" != null) return new UniversalWordNode(uw, attr, num.image); - } - } - throw new Error("Missing return statement in function"); +/*--------------------------------- + * DECORATED UW + *---------------------------------*/ + final public UniversalWordNode decoratedUniversalWord() throws ParseException {UniversalWord uw; + Token num = null; + Set attr; + uw = universalWord(); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COLON_NUMBER:{ + num = jj_consume_token(COLON_NUMBER); + break; + } + default: + jj_la1[9] = jj_gen; + ; } - - final public GraphNode node() throws ParseException { - UniversalWordNode uwn; - SubGraphReferenceNode sgn; - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case DBLQUOTED: - case GENERIC_TOKEN: { - uwn = decoratedUniversalWord(); - { - if ("" != null) return uwn; - } - break; - } - case COLON_NUMBER: { - sgn = decoratedSubGraphNumber(); - { - if ("" != null) return sgn; - } - break; - } - default: - jj_la1[8] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - throw new Error("Missing return statement in function"); + attr = attributes(); +if (null == num) { + {if ("" != null) return new UniversalWordNode(uw, attr);} + } else { + {if ("" != null) return new UniversalWordNode(uw, attr, num.image);} } + throw new Error("Missing return statement in function"); +} - /*--------------------------------- - * UNIVERSAL WORD - *---------------------------------*/ - final public UniversalWord universalWord() throws ParseException { - String hw; - SortedSet restrictions; - hw = headword(); - restrictions = restrictionList(); - { - if ("" != null) return new UniversalWord(hw, restrictions); - } - throw new Error("Missing return statement in function"); + final public Set attributes() throws ParseException {Set attr = (Set) new TreeSet(); + Token a; + label_4: + while (true) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTR:{ + ; + break; + } + default: + jj_la1[10] = jj_gen; + break label_4; + } + a = jj_consume_token(ATTR); +attr.add(a.image); } +{if ("" != null) return attr;} + throw new Error("Missing return statement in function"); +} - final public Set attributes() throws ParseException { - Set attr = new TreeSet(); - Token a; - label_4: - while (true) { - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case ATTR: { - break; - } - default: - jj_la1[10] = jj_gen; - break label_4; - } - a = jj_consume_token(ATTR); - attr.add(a.image); - } - { - if ("" != null) return attr; - } - throw new Error("Missing return statement in function"); - } +/*--------------------------------- + * UNIVERSAL WORD + *---------------------------------*/ + final public +UniversalWord universalWord() throws ParseException {String hw; +SortedSet restrictions; + hw = headword(); + restrictions = restrictionList(); +{if ("" != null) return new UniversalWord(hw, restrictions);} + throw new Error("Missing return statement in function"); +} - final public String headword() throws ParseException { - Token t; - StringBuffer hw = new StringBuffer(); - label_5: - while (true) { - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case GENERIC_TOKEN: { - t = jj_consume_token(GENERIC_TOKEN); - hw.append(t.image); - hw.append(" "); - break; - } - case DBLQUOTED: { - t = jj_consume_token(DBLQUOTED); - hw.append(t.image); - hw.append(" "); - break; - } - default: - jj_la1[11] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case DBLQUOTED: - case GENERIC_TOKEN: { - break; - } - default: - jj_la1[12] = jj_gen; + final public String headword() throws ParseException {Token t; + StringBuffer hw = new StringBuffer(); + label_5: + while (true) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_TOKEN:{ + t = jj_consume_token(GENERIC_TOKEN); +hw.append(t.image); + hw.append(" "); + break; + } + case DBLQUOTED:{ + t = jj_consume_token(DBLQUOTED); +hw.append(t.image); + hw.append(" "); + break; + } + default: + jj_la1[11] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DBLQUOTED: + case GENERIC_TOKEN:{ + ; + break; + } + default: + jj_la1[12] = jj_gen; break label_5; } } @@ -421,72 +346,173 @@ int last = hw.length()-1; throw new Error("Missing return statement in function"); } - /* Putain de syntaxe à la con ! */ + final public SortedSet restrictionList() throws ParseException {Restriction r; + SortedSet restrictions = (SortedSet) new TreeSet(); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PARO:{ + jj_consume_token(PARO); + r = restriction(); +restrictions.add(r); + label_6: + while (true) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA:{ + ; + break; + } + default: + jj_la1[13] = jj_gen; + break label_6; + } + jj_consume_token(COMMA); + r = restriction(); +restrictions.add(r); + } + jj_consume_token(PARF); + break; + } + default: + jj_la1[14] = jj_gen; + ; + } +{if ("" != null) return restrictions;} + throw new Error("Missing return statement in function"); +} + + final public Restriction restriction() throws ParseException {Token label; + Token direction; + UniversalWord uw; + label = jj_consume_token(GENERIC_TOKEN); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CHEVRD:{ + direction = jj_consume_token(CHEVRD); + break; + } + case CHEVRG:{ + direction = jj_consume_token(CHEVRG); + break; + } + default: + jj_la1[15] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + uw = embeddedUniversalWord(label.image); +{if ("" != null) return new Restriction(label.image, direction.image.charAt(0), uw);} + throw new Error("Missing return statement in function"); +} + +/* Putain de syntaxe à la con ! */ /* Un UW dans une restriction n'a pas forcément la même syntaxe qu'une UW "normale". En effet, la restricition peut être factorisée. */ - final public UniversalWord embeddedUniversalWord(String inheritedLabel) throws ParseException { - String hw; - SortedSet restrictions; - hw = headword(); - restrictions = embeddedRestrictionList(inheritedLabel); - { - if ("" != null) return new UniversalWord(hw, restrictions); - } - throw new Error("Missing return statement in function"); + final public UniversalWord embeddedUniversalWord(String inheritedLabel) throws ParseException {String hw; + SortedSet restrictions; + hw = headword(); + restrictions = embeddedRestrictionList(inheritedLabel); +{if ("" != null) return new UniversalWord(hw, restrictions);} + throw new Error("Missing return statement in function"); +} + + final public SortedSet embeddedRestrictionList(String inheritedLabel) throws ParseException {UniversalWord uw; + SortedSet restrictions; + Token direction; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CHEVRD: + case CHEVRG:{ +restrictions = (SortedSet) new TreeSet(); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CHEVRD:{ + direction = jj_consume_token(CHEVRD); + break; + } + case CHEVRG:{ + direction = jj_consume_token(CHEVRG); + break; + } + default: + jj_la1[16] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + uw = embeddedUniversalWord(inheritedLabel); +restrictions.add(new Restriction(inheritedLabel, direction.image.charAt(0), uw)); + break; + } + default: + jj_la1[17] = jj_gen; + restrictions = restrictionList(); } +{if ("" != null) return restrictions;} + throw new Error("Missing return statement in function"); +} + +/*--------------------------------- + * RULES FOR TESTS + *---------------------------------*/ + +/** + * List of universal words separated by commas. + */ + final public void universalWordList() throws ParseException { + decoratedUniversalWord(); +System.out.println("UW"); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA:{ + jj_consume_token(COMMA); + universalWordList(); + break; + } + default: + jj_la1[18] = jj_gen; - final public SortedSet restrictionList() throws ParseException { - Restriction r; - SortedSet restrictions = new TreeSet(); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case PARO: { - jj_consume_token(PARO); - r = restriction(); - restrictions.add(r); - label_6: - while (true) { - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case COMMA: { - break; - } - default: - jj_la1[13] = jj_gen; - break label_6; - } - jj_consume_token(COMMA); - r = restriction(); - restrictions.add(r); - } - jj_consume_token(PARF); - break; - } - default: - jj_la1[14] = jj_gen; - } - { - if ("" != null) return restrictions; - } - throw new Error("Missing return statement in function"); } + jj_consume_token(0); +} - /** - * List of universal words separated by commas. - */ - final public void universalWordList() throws ParseException { - decoratedUniversalWord(); - System.out.println("UW"); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case COMMA: { - jj_consume_token(COMMA); - universalWordList(); - break; - } - default: - jj_la1[18] = jj_gen; +/** + * Simple unl graph. + */ + final public void isolatedUnlGraph() throws ParseException { + relationList(); + jj_consume_token(0); +} - } - jj_consume_token(0); +/** + * Main entry point: unl document List. + */ + final public Vector<UnlDocument> createUnlDocumentList() throws ParseException {UnlDocument doc; +Vector<UnlDocument> list = new Vector<UnlDocument>(); + label_7: + while (true) { + doc = unlDocument(); +list.add(doc); + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOC: + case PARAGRAPH: + case TITLE: + case SENTENCE: + case END_PARAGRAPH:{ + ; + break; + } + default: + jj_la1[19] = jj_gen; + break label_7; + } } +{if ("" != null) return list;} + throw new Error("Missing return statement in function"); +} + + /** Generated Token Manager. */ + public UnlParserTokenManager token_source; + SimpleCharStream jj_input_stream; + /** Current token. */ + public Token token; + /** Next token. */ + public Token jj_nt; + private int jj_ntk; + private int jj_gen; final private int[] jj_la1 = new int[20]; static private int[] jj_la1_0; static private int[] jj_la1_1; @@ -590,127 +616,52 @@ int last = hw.length()-1; } - /** - * Get the next Token. - */ - final public Token getNextToken() { - if (token.next != null) token = token.next; - else token = token.next = token_source.getNextToken(); - jj_ntk = -1; - jj_gen++; - return token; - } - - /** - * Simple unl graph. - */ - final public void isolatedUnlGraph() throws ParseException { - relationList(); - jj_consume_token(0); - } - - final public SortedSet embeddedRestrictionList(String inheritedLabel) throws ParseException { - UniversalWord uw; - SortedSet restrictions; - Token direction; - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case CHEVRD: - case CHEVRG: { - restrictions = new TreeSet(); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case CHEVRD: { - direction = jj_consume_token(CHEVRD); - break; - } - case CHEVRG: { - direction = jj_consume_token(CHEVRG); - break; - } - default: - jj_la1[16] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } - uw = embeddedUniversalWord(inheritedLabel); - restrictions.add(new Restriction(inheritedLabel, direction.image.charAt(0), uw)); - break; - } - default: - jj_la1[17] = jj_gen; - restrictions = restrictionList(); - } - { - if ("" != null) return restrictions; - } - throw new Error("Missing return statement in function"); - } - - /** - * Get the specific Token. - */ - final public Token getToken(int index) { - Token t = token; - for (int i = 0; i < index; i++) { - if (t.next != null) t = t.next; - else t = t.next = token_source.getNextToken(); - } - return t; - } +/** Get the next Token. */ + final public Token getNextToken() { + if (token.next != null) token = token.next; + else token = token.next = token_source.getNextToken(); + jj_ntk = -1; + jj_gen++; + return token; + } - private int jj_ntk_f() { - if ((jj_nt = token.next) == null) - return (jj_ntk = (token.next = token_source.getNextToken()).kind); - else - return (jj_ntk = jj_nt.kind); - } +/** Get the specific Token. */ + final public Token getToken(int index) { + Token t = token; + for (int i = 0; i < index; i++) { + if (t.next != null) t = t.next; + else t = t.next = token_source.getNextToken(); + } + return t; + } - /** - * Main entry point: unl document List. - */ - final public Vector<UnlDocument> createUnlDocumentList() throws ParseException { - UnlDocument doc; - Vector<UnlDocument> list = new Vector<UnlDocument>(); - label_7: - while (true) { - doc = unlDocument(); - list.add(doc); - switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { - case DOC: - case PARAGRAPH: - case TITLE: - case SENTENCE: - case END_PARAGRAPH: { - break; - } - default: - jj_la1[19] = jj_gen; - break label_7; - } - } - { - if ("" != null) return list; - } - throw new Error("Missing return statement in function"); - } + private int jj_ntk_f() { + if ((jj_nt=token.next) == null) + return (jj_ntk = (token.next=token_source.getNextToken()).kind); + else + return (jj_ntk = jj_nt.kind); + } - /** - * Generate ParseException. - */ - public ParseException generateParseException() { - jj_expentries.clear(); - boolean[] la1tokens = new boolean[39]; - if (jj_kind >= 0) { - la1tokens[jj_kind] = true; - jj_kind = -1; - } - for (int i = 0; i < 20; i++) { - if (jj_la1[i] == jj_gen) { - for (int j = 0; j < 32; j++) { - if ((jj_la1_0[i] & (1 << j)) != 0) { - la1tokens[j] = true; - } - if ((jj_la1_1[i] & (1 << j)) != 0) { - la1tokens[32 + j] = true; + private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>(); + private int[] jj_expentry; + private int jj_kind = -1; + + /** Generate ParseException. */ + public ParseException generateParseException() { + jj_expentries.clear(); + boolean[] la1tokens = new boolean[39]; + if (jj_kind >= 0) { + la1tokens[jj_kind] = true; + jj_kind = -1; + } + for (int i = 0; i < 20; i++) { + if (jj_la1[i] == jj_gen) { + for (int j = 0; j < 32; j++) { + if ((jj_la1_0[i] & (1<<j)) != 0) { + la1tokens[j] = true; + } + if ((jj_la1_1[i] & (1<<j)) != 0) { + la1tokens[32+j] = true; } } } diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.jj b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.jj index a05304d4e80f8642e6cab2d74dd3a12049c69be0..b5976bbc809ba1a02f203e16393e4b424a5c3afc 100644 --- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.jj +++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParser.jj @@ -72,7 +72,7 @@ TOKEN : /* Character classes */ // QUESTION: Quels sont les caractères officiellement acceptés dans les headwords... | <#HEADWORD_CHARACTERS : ( <ALPHANUM> | "'" | "#" | "&" | "/" | ["\u00c0"-"\u00ff"] | - ("." ~["@"]) ) > + ("." ~["@"]) | "=" ) > // | <#HEADWORD_CHARACTERS : ( <ALPHANUM> | "'" | "#" | "&" | "/" | "+" | "@" | "=" | "$" | "�" | "�" | "[" | "]" | // "\u221a" | "\u00a9" | diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParserTokenManager.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParserTokenManager.java index b84e9b6f78aa7b2cb5db2697a08d94706b94aaa6..10808c7b830dba491b837f13129d6fc77d49c39b 100644 --- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParserTokenManager.java +++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlParserTokenManager.java @@ -1,6 +1,14 @@ /* UnlParserTokenManager.java */ /* Generated By:JavaCC: Do not edit this line. UnlParserTokenManager.java */ package fr.tetras_libre.unltools.unl.parser; +import java.io.FileInputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.SortedSet; +import java.util.TreeSet; +import java.util.Set; +import java.util.Vector; +import fr.tetras_libre.unltools.unl.*; /** Token Manager. */ @SuppressWarnings ("unused") @@ -201,7 +209,7 @@ private int jjMoveNfa_0(int startState, int curPos) switch(jjstateSet[--i]) { case 0: - if ((0x3ffa0c800000000L & l) != 0L) + if ((0x23ffa0c800000000L & l) != 0L) { if (kind > 37) kind = 37; @@ -274,7 +282,7 @@ private int jjMoveNfa_0(int startState, int curPos) kind = 36; break; case 21: - if ((0x3ffa0c800000000L & l) == 0L) + if ((0x23ffa0c800000000L & l) == 0L) break; if (kind > 37) kind = 37; diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java index 951f79d7bb43909b9b76eccb287ce12f671a3ac5..9311784683757563c99999defc832ecc7c65da2d 100644 --- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java +++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java @@ -1,9 +1,12 @@ package fr.tetras_libre.unltools.unl; +import fr.tetras_libre.unltools.unl.builders.RestrictionOrientation; +import fr.tetras_libre.unltools.unl.builders.UnlDocumentNodeBuilder; + import java.util.*; public class CatsUnl extends AbstractFlyweightUnlArgumentProvider implements GraphImporter { - public static UnlDocumentNode buildSentenceNode() { + private static UnlDocumentNode CreateWithOldBuilder() { var graph = new Graph(); // mod @@ -62,6 +65,110 @@ public class CatsUnl extends AbstractFlyweightUnlArgumentProvider implements Gra return new UnlDocumentNode(UnlDocumentNodeType.Sentence, "[S:00]", graph); } + private static UnlDocumentNode newBuilder(){ + return UnlDocumentNodeBuilder + .createBuilder() + .withNodeType(UnlDocumentNodeType.Sentence) + .withLabel("[S:00]") + .withGraph( + gb -> + gb.addGraphRelation( + grb -> grb + .label("mod") + .reference(":01") + .leftNode( + lnb -> + lnb + .universalWord( + uwb -> + uwb + .headWord("cat1") + .addTernaryTransitiveRestriction("icl", "feline", "thing", RestrictionOrientation.Right) + ) + .instanceNumber(":01") + .addAttribute(".@entry") + .addAttribute(".@def") + ) + .rightNode( + rnb -> rnb + .universalWord( + uwb -> + uwb + .headWord("black") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "adj") + ) + ) + ) + .addGraphRelation(grb -> + grb.label("and") + .reference(":01") + .leftNode( + lnb -> lnb.universalWord( + uwb -> uwb.headWord("cat1") + .addTernaryTransitiveRestriction("icl", "feline", "thing", RestrictionOrientation.Right) + ) + .instanceNumber(":01") + .addAttribute(".@entry") + .addAttribute(".@def") + ) + .rightNode( + lnb -> lnb.universalWord( + uwb -> uwb.headWord("cat2") + .addTernaryTransitiveRestriction("icl", "feline", "thing", RestrictionOrientation.Right) + ) + .instanceNumber(":02") + .addAttribute(".@entry") + .addAttribute(".@def") + ) + ) + .addGraphRelation( + grb -> grb.label("mod") + .reference(":01") + .leftNode( + lnb -> lnb.universalWord( + uwb -> uwb.headWord("cat2") + .addTernaryTransitiveRestriction("icl", "feline", "thing", RestrictionOrientation.Right) + ) + .instanceNumber(":02") + .addAttribute(".@entry") + .addAttribute(".@def") + ) + .rightNode( + rnb -> rnb.universalWord( + uwb -> uwb.headWord("white") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "adj") + ) + ) + ) + .addGraphRelation( + grb -> grb.label("agt") + .noReference() + .leftNode( + lnb -> lnb.universalWord( + uwb -> uwb.headWord("eat") + .addTernaryTransitiveRestriction("icl", "consume", "do", RestrictionOrientation.Right) + .addSimpleRestriction("agt", RestrictionOrientation.Right, "living_thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "concrete_thing") + .addSimpleRestriction("ins", RestrictionOrientation.Right, "thing") + ) + .addAttribute(".@entry") + .addAttribute(".@pl") + .addAttribute(".@present") + .addAttribute(".@progress") + ) + .rightSubGraphNode( + rnb -> rnb.referenceNumber(":01") + .addAttribute(".@_hn-scope") + ) + ) + ) + .buildUnlDocumentNode(); + } + + public static UnlDocumentNode buildSentenceNode() { + return newBuilder(); + } + protected List<UnlDocument> buildUnlDocuments() { var unlDocument = new UnlDocument("[D]"); diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/Issue13Unl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/Issue13Unl.java new file mode 100644 index 0000000000000000000000000000000000000000..05c871b6634c2f27c00ca05337c10a07fd0f392b --- /dev/null +++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/Issue13Unl.java @@ -0,0 +1,208 @@ +package fr.tetras_libre.unltools.unl; + +import fr.tetras_libre.unltools.unl.builders.RestrictionOrientation; +import fr.tetras_libre.unltools.unl.builders.UnlDocumentNodeBuilder; + +import java.util.Collections; +import java.util.List; + +public class Issue13Unl extends AbstractFlyweightUnlArgumentProvider { + private static UnlDocument unlDocument; + + public static UnlDocumentNode buildSentenceNode1() { + return UnlDocumentNodeBuilder + .createBuilder() + .withNodeType(UnlDocumentNodeType.Sentence) + .withLabel("[S:00]") + .withGraph(gb -> gb + // mod relation + .addGraphRelation(s -> + s.label("mod") + .noReference() + .leftNode( + ln -> ln + .universalWord(uwb -> uwb.headWord("m") + .addTernaryTransitiveRestriction("icl", "metric_linear_unit", "thing", RestrictionOrientation.Right) + .addSimpleRestriction("equ", RestrictionOrientation.Right, "meter") + ) + .addAttribute(".@entry") + .addAttribute(".@parenthesis")) + .rightNode( + rn -> rn + .simpleUniversalWord(() -> "=") + ) + ) + // second mod relation + .addGraphRelation(s -> + s + .label("mod") + .noReference() + .leftNode( + ln -> ln + .simpleUniversalWord( + () -> "=" + ) + ) + .rightNode( + rn -> rn + .universalWord( + uwb -> uwb + .headWord("mandatory") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "adj") + .addSimpleRestriction("equ", RestrictionOrientation.Right, "compulsory") + ) + .addAttribute(".@maiuscul") + ) + ) + // obj relation + .addGraphRelation( + s -> + s.label("obj") + .noReference() + .leftNode( + ln -> ln + .universalWord( + uw -> uw + .headWord("respect") + .addTernaryTransitiveRestriction("icl", "consider", "be", RestrictionOrientation.Right) + .addSimpleRestriction("rsn", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("aoj", RestrictionOrientation.Right, "person") + ) + .addAttribute(".@present") + .addAttribute(".@promise") + ) + .rightNode( + rn -> rn + .universalWord( + uw -> uw + .headWord("requirement") + .addTernaryTransitiveRestriction("icl", "duty", "thing", RestrictionOrientation.Right) + ) + .addAttribute(".@def") + .addAttribute(".@topic") + ) + ) + // cnt relation + .addGraphRelation( + s -> + s.label("cnt") + .noReference() + .leftNode( + lnb -> lnb + .universalWord( + uw -> uw + .headWord("mandatory") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "adj") + .addSimpleRestriction("equ", RestrictionOrientation.Right, "compulsory") + ) + .addAttribute(".@maiuscul") + ) + .rightNode( + rn -> rn + .universalWord( + uwb -> uwb + .headWord("respect") + .addTernaryTransitiveRestriction("icl", "consider", "be", RestrictionOrientation.Right) + .addSimpleRestriction("rsn", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("aoj", RestrictionOrientation.Right, "person") + ) + .addAttribute(".@present") + .addAttribute(".@promise") + ) + ) + // mod + .addGraphRelation( + s -> + s.label("mod") + .noReference() + .leftNode( + ln -> ln + .universalWord( + uwb -> uwb + .headWord("application") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "information") + .addSimpleRestriction("equ", RestrictionOrientation.Right, "request") + .addSimpleRestriction("agt", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "uw") + ) + ) + .rightNode( + rn -> rn + .universalWord( + uwb -> uwb + .headWord("every") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "quantity") + .addSimpleRestriction("per", RestrictionOrientation.Right, "thing") + ) + ) + ) + // mod + .addGraphRelation( + s -> s + .label("mod") + .noReference() + .leftNode( + ln -> ln + .universalWord( + uwb -> uwb + .headWord("application") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "information") + .addSimpleRestriction("equ", RestrictionOrientation.Right, "request") + .addSimpleRestriction("agt", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "uw") + ) + ) + .rightNode( + rn -> rn + .simpleUniversalWord( + () -> "etcs" + ) + ) + ) + .addGraphRelation( + s -> + s + .label("scn") + .noReference() + .leftNode( + ln -> ln + .universalWord( + uwb -> uwb + .headWord("respect") + .addTernaryTransitiveRestriction("icl", "consider", "be", RestrictionOrientation.Right) + .addSimpleRestriction("rsn", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("aoj", RestrictionOrientation.Right, "person") + ) + .addAttribute(".@present") + .addAttribute(".@promise") + ) + .rightNode( + rn -> rn + .universalWord( + uwb -> uwb + .headWord("application") + .addSimpleRestriction("icl", RestrictionOrientation.Right, "information") + .addSimpleRestriction("equ", RestrictionOrientation.Right, "request") + .addSimpleRestriction("agt", RestrictionOrientation.Right, "thing") + .addSimpleRestriction("obj", RestrictionOrientation.Right, "uw") + ) + ) + ) + ) + .buildUnlDocumentNode(); + + } + + + @Override + protected List<UnlDocument> buildUnlDocuments() { + if (null == Issue13Unl.unlDocument) { + Issue13Unl.unlDocument = new UnlDocument(); + Issue13Unl.unlDocument.add(buildSentenceNode1()); + } + return Collections.singletonList(Issue13Unl.unlDocument); + } +} diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/UnlSentences.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/UnlSentences.java index 6c4c52527cd1caedf7d7090a10d26d500f7080bb..50d9ee9eac2e3267750c2ccd4b66cb2d72befacb 100644 --- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/UnlSentences.java +++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/UnlSentences.java @@ -93,4 +93,19 @@ public class UnlSentences { "{/unl}\n" + "[/S]\n" + "[/D]"; + + public static final String Issue13 = "[S:00]\n" + + "{org:en}\n" + + "(M) = Mandatory:The requirement shall be respected in every ETCS application. \n" + + "{/org}\n" + + "{unl}\n" + + "mod(m(icl>metric_linear_unit>thing,equ>meter).@entry.@parenthesis,=)\n" + + "mod(=,mandatory(icl>adj,equ>compulsory).@maiuscul)\n" + + "obj(respect(icl>consider>be,rsn>thing,obj>thing,aoj>person).@present.@promise,requirement(icl>duty>thing).@def.@topic)\n" + + "cnt(mandatory(icl>adj,equ>compulsory).@maiuscul,respect(icl>consider>be,rsn>thing,obj>thing,aoj>person).@present.@promise)\n" + + "mod(application(icl>information,equ>request,agt>thing,obj>uw),every(icl>quantity,per>thing))\n" + + "mod(application(icl>information,equ>request,agt>thing,obj>uw),etcs)\n" + + "scn(respect(icl>consider>be,rsn>thing,obj>thing,aoj>person).@present.@promise,application(icl>information,equ>request,agt>thing,obj>uw))\n" + + "{/unl}\n" + + "[/S]\n"; } diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/Issue13WithExpectedUnlDocumentChecker.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/Issue13WithExpectedUnlDocumentChecker.java new file mode 100644 index 0000000000000000000000000000000000000000..85a99cdc465e1f284bcb7e10b59665392da45c0e --- /dev/null +++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/Issue13WithExpectedUnlDocumentChecker.java @@ -0,0 +1,10 @@ +package fr.tetras_libre.unltools.unl.parser; + +import fr.tetras_libre.unltools.unl.Issue13Unl; +import fr.tetras_libre.unltools.unl.UnlSentences; + +public class Issue13WithExpectedUnlDocumentChecker extends SentenceWithExpectedUnlDocumentsChecker { + public Issue13WithExpectedUnlDocumentChecker() { + super(UnlSentences.Issue13, new Issue13Unl().getUnlDocuments()); + } +} diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java index 7bc9410c46b7cfd8b6c8a661f7b236345b116839..4c77e1f8813920f799c9d133cd759bcf5caafcc5 100644 --- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java +++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java @@ -14,13 +14,14 @@ class UnlParserTest { private static Stream<SentenceWithExpectedUnlDocumentsChecker> unlParserShouldParseSentenceAndGetExpectedUnlDocuments() { return Stream.of(new R1SentenceWithExpectedUnlDocumentsChecker(), - new R2SentenceWithExpectedUnlDocumentsChecker(), - new CatsSentenceWithExpectedUnlDocumentsChecker(), - new AllSentenceWithExpectedUnlDocumentsChecker()); + new R2SentenceWithExpectedUnlDocumentsChecker(), + new CatsSentenceWithExpectedUnlDocumentsChecker(), + new AllSentenceWithExpectedUnlDocumentsChecker(), + new Issue13WithExpectedUnlDocumentChecker()); } @ParameterizedTest - @ValueSource(strings = {UnlSentences.R1, UnlSentences.R2, UnlSentences.Cats, UnlSentences.All}) + @ValueSource(strings = {UnlSentences.R1, UnlSentences.R2, UnlSentences.Cats, UnlSentences.All, UnlSentences.Issue13}) void unlParserShouldParseSimpleSentenceWithoutException(String input) { UnlParserFactory unlFactory = new UnlParserFactoryFromString(input); var wrapper = createAndCheckUnlParserValidity(unlFactory);