• R/O
  • SSH

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisão4b49016f499d085bd55d7af49ea116bf427d4b21 (tree)
Hora2015-11-06 12:21:14
AutorMirrgieRiana
CommiterMirrgieRiana

Mensagem de Log

ArgumentsParse: 構文候補表示

Mudança Sumário

Diff

diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ArgumentsParse.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ArgumentsParse.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ArgumentsParse.java Fri Nov 06 12:21:14 2015 +0900
@@ -1,5 +1,7 @@
11 package mirrg.compile.bromine;
22
3+import java.util.ArrayList;
4+
35 import mirrg.compile.bromine.cache.CacheBromine;
46
57 public class ArgumentsParse
@@ -14,4 +16,18 @@
1416 this.cache = cache;
1517 }
1618
19+ public ArrayList<String> hints = new ArrayList<>();
20+ public int currentIndex = 0;
21+
22+ public void report(int index, String string)
23+ {
24+ if (index > currentIndex) {
25+ currentIndex = index;
26+ hints.clear();
27+ }
28+ if (index >= currentIndex) {
29+ hints.add(string);
30+ }
31+ }
32+
1733 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ResponseParse.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ResponseParse.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/ResponseParse.java Fri Nov 06 12:21:14 2015 +0900
@@ -5,11 +5,13 @@
55
66 public final N node;
77 public final int length;
8+ public final ArgumentsParse argumentsParse;
89
9- public ResponseParse(N node, int length)
10+ public ResponseParse(N node, int length, ArgumentsParse argumentsParse)
1011 {
1112 this.node = node;
1213 this.length = length;
14+ this.argumentsParse = argumentsParse;
1315 }
1416
1517 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxEmpty.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxEmpty.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxEmpty.java Fri Nov 06 12:21:14 2015 +0900
@@ -21,7 +21,7 @@
2121 @Override
2222 protected NonnullIterable<ResponseParse<N>> parseImpl(ArgumentsParse arguments, int index)
2323 {
24- return NonnullIterable.of(new ResponseParse<>(functionNode.apply(new TagFixed(index, 0)), 0));
24+ return NonnullIterable.of(new ResponseParse<>(functionNode.apply(new TagFixed(index, 0)), 0, arguments));
2525 }
2626
2727 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxMapper.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxMapper.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxMapper.java Fri Nov 06 12:21:14 2015 +0900
@@ -25,7 +25,7 @@
2525 return syntax.parse(arguments, index)
2626 .map(response -> {
2727 if (response == null) return null;
28- return new ResponseParse<>(functionNode.apply(response.node), response.length);
28+ return new ResponseParse<>(functionNode.apply(response.node), response.length, arguments);
2929 });
3030 }
3131
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxOptional.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxOptional.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxOptional.java Fri Nov 06 12:21:14 2015 +0900
@@ -25,7 +25,7 @@
2525 {
2626 return NonnullIterable.of(
2727 syntax.parse(arguments, index),
28- NonnullIterable.of(new ResponseParse<>(functionNode.apply(new TagFixed(index, 0)), 0)))
28+ NonnullIterable.of(new ResponseParse<>(functionNode.apply(new TagFixed(index, 0)), 0, arguments)))
2929 .flatMap(iterator -> iterator);
3030 }
3131
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxRegex.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxRegex.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxRegex.java Fri Nov 06 12:21:14 2015 +0900
@@ -12,11 +12,13 @@
1212 public class SyntaxRegex<N> extends Syntax<N>
1313 {
1414
15+ public final String regex;
1516 public final Pattern pattern;
1617 public final Function<TagRegex, N> functionNode;
1718
1819 public SyntaxRegex(String regex, Function<TagRegex, N> functionNode)
1920 {
21+ this.regex = regex;
2022 this.pattern = Pattern.compile("\\A" + regex);
2123 this.functionNode = functionNode;
2224 }
@@ -31,8 +33,11 @@
3133
3234 return NonnullIterable.of(new ResponseParse<>(functionNode.apply(
3335 new TagRegex(index, string.length(), string, matcher, pattern)),
34- string.length()));
36+ string.length(), arguments));
3537 } else {
38+
39+ arguments.report(index, "\"" + regex + "\"");
40+
3641 return NonnullIterable.empty();
3742 }
3843 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxString.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxString.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxString.java Fri Nov 06 12:21:14 2015 +0900
@@ -22,14 +22,24 @@
2222 @Override
2323 protected NonnullIterable<ResponseParse<N>> parseImpl(ArgumentsParse arguments, int index)
2424 {
25- if (this.string.length() + index > arguments.source.length()) return NonnullIterable.empty();
25+ if (this.string.length() + index > arguments.source.length()) {
26+
27+ arguments.report(index, "'" + string + "'");
28+
29+ return NonnullIterable.empty();
30+ }
2631
2732 for (int i = 0; i < this.string.length(); i++) {
28- if (this.string.charAt(i) != arguments.source.charAt(i + index)) return NonnullIterable.empty();
33+ if (this.string.charAt(i) != arguments.source.charAt(i + index)) {
34+
35+ arguments.report(index, "'" + string + "'");
36+
37+ return NonnullIterable.empty();
38+ }
2939 }
3040
3141 return NonnullIterable.of(new ResponseParse<>(functionNode.apply(
3242 new TagString(index, this.string.length(), this.string)),
33- this.string.length()));
43+ this.string.length(), arguments));
3444 }
3545 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxWrapper.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxWrapper.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/SyntaxWrapper.java Fri Nov 06 12:21:14 2015 +0900
@@ -19,7 +19,7 @@
1919 protected NonnullIterable<ResponseParse<OUT>> parseImpl(ArgumentsParse arguments, int index)
2020 {
2121 return syntax.parse(arguments, index)
22- .map(response -> new ResponseParse<>(response.node, response.length));
22+ .map(response -> new ResponseParse<>(response.node, response.length, arguments));
2323 }
2424
2525 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/connection/SyntaxConnectionBase.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/connection/SyntaxConnectionBase.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/syntaxes/connection/SyntaxConnectionBase.java Fri Nov 06 12:21:14 2015 +0900
@@ -71,7 +71,7 @@
7171 // 長さが許可されているかは分からないが、とりあえずまとまった構文列が解析できた。
7272 if (isLengthAllowed(length)) {
7373 // この長さは許可されている
74- return new ResponseParse<>(cloner.apply(node), offsets.getLast());
74+ return new ResponseParse<>(cloner.apply(node), offsets.getLast(), arguments);
7575 }
7676
7777 }
@@ -111,7 +111,7 @@
111111 // 長さが許可されているかは分からないが、とりあえずまとまった構文列が解析できた。
112112 if (isLengthAllowed(length)) {
113113 // この長さは許可されている
114- return new ResponseParse<>(cloner.apply(node), offsets.getLast());
114+ return new ResponseParse<>(cloner.apply(node), offsets.getLast(), arguments);
115115 }
116116
117117 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/util/CompilerBromine.java
--- a/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/util/CompilerBromine.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/main/java/mirrg/compile/bromine/util/CompilerBromine.java Fri Nov 06 12:21:14 2015 +0900
@@ -17,6 +17,9 @@
1717 this.syntax = syntax;
1818 }
1919
20+ /**
21+ * パースに失敗時、nullが返る。
22+ */
2023 public N compile(String source)
2124 {
2225 NonnullIterable<ResponseParse<N>> responses = syntax.parse(new ArgumentsParse(source, new CacheBromine(source)), 0);
@@ -26,4 +29,22 @@
2629 return next == null ? null : next.node;
2730 }
2831
32+ /**
33+ * パースに失敗時、nodeがnullであるものが返る。
34+ */
35+ public ResponseParse<N> getResponse(String source)
36+ {
37+ ArgumentsParse argumentsParse = new ArgumentsParse(source, new CacheBromine(source));
38+ NonnullIterable<ResponseParse<N>> responses = syntax.parse(argumentsParse, 0);
39+ NonnullIterator<ResponseParse<N>> iterator = responses.nonnullIterator();
40+ ResponseParse<N> responseParse = iterator.next();
41+ return responseParse == null ? new ResponseParse<>(null, 0, argumentsParse) : responseParse;
42+ }
43+
44+ public NonnullIterator<ResponseParse<N>> getResponses(String source)
45+ {
46+ NonnullIterable<ResponseParse<N>> responses = syntax.parse(new ArgumentsParse(source, new CacheBromine(source)), 0);
47+ return responses.nonnullIterator();
48+ }
49+
2950 }
diff -r d404a242b5f2 -r 4b49016f499d projects/mirrg.compile.bromine/src/test/java/mirrg/compile/bromine/TestBromine.java
--- a/projects/mirrg.compile.bromine/src/test/java/mirrg/compile/bromine/TestBromine.java Fri Nov 06 10:26:57 2015 +0900
+++ b/projects/mirrg.compile.bromine/src/test/java/mirrg/compile/bromine/TestBromine.java Fri Nov 06 12:21:14 2015 +0900
@@ -360,6 +360,43 @@
360360 assertEquals((Integer) 14, compiler.compile("i14").t);
361361 }
362362
363+ @Test
364+ public void test_hints()
365+ {
366+ Syntax<Object> syntaxA = HBromine.or(Object.class)
367+ .or(HBromine.string("true", tag -> true))
368+ .or(HBromine.string("false", tag -> false))
369+ .or(HBromine.regex("\\d+", tag -> (Integer) Integer.parseInt(tag.string)))
370+ .or(HBromine.regex("[a-zA-Z_][a-zA-Z0-9_]*", tag -> tag.string))
371+ .or(HBromine.regex("\\d*\\.\\d+", tag -> (Double) Double.parseDouble(tag.string)));
372+ Syntax<Object[]> syntaxCall = HBromine.serial(
373+ node -> node.clone(),
374+ tag -> new Object[2])
375+ .and(HBromine.regex("[a-zA-Z_][a-zA-Z0-9_]*", tag -> tag.string),
376+ (node, index, tag) -> node[0] = tag, (node, index) -> node[0] = null)
377+ .and(HBromine.string("(", tag -> null),
378+ (node, index, tag) -> {} , (node, index) -> {})
379+ .and(syntaxA,
380+ (node, index, tag) -> node[1] = tag, (node, index) -> node[1] = null)
381+ .and(HBromine.string(")", tag -> null),
382+ (node, index, tag) -> {} , (node, index) -> {})
383+ .and(HBromine.string(";", tag -> null),
384+ (node, index, tag) -> {} , (node, index) -> {});
385+ CompilerBromine<Object[]> compiler = HBromine.createCompiler(HBromine.root(syntaxCall));
386+
387+ assertEquals("func1", compiler.compile("func1(34);")[0].toString());
388+ assertEquals("34", compiler.compile("func1(34);")[1].toString());
389+ assertEquals("r4", compiler.compile("func1(r4);")[1].toString());
390+ assertArrayEquals(new String[] {
391+ "'true'",
392+ "'false'",
393+ "\"\\d+\"",
394+ "\"[a-zA-Z_][a-zA-Z0-9_]*\"",
395+ "\"\\d*\\.\\d+\"",
396+ }, compiler.getResponse("func1(").argumentsParse.hints.toArray(new String[0]));
397+
398+ }
399+
363400 public static void main(String[] args)
364401 {
365402 new TestBromine().test_002();