Libraryless. Click here for Pure Java version (2285L/15K).
1 | static Producer<S> javaTok_onReader(final Reader r) {
|
2 | final class X implements Producer<S> {
|
3 | new StringBuilder buf; // stores from "i" |
4 | char c, d, e = 'x'; // just not '\0' |
5 | bool inWhiteSpace = true; |
6 | |
7 | *() {
|
8 | // fill c, d and e |
9 | nc(); |
10 | nc(); |
11 | nc(); |
12 | } |
13 | |
14 | // get next character(s) into c, d and e |
15 | void nc() ctex {
|
16 | c = d; |
17 | d = e; |
18 | if (e == '\0') ret; |
19 | int i = r.read(); |
20 | e = i < 0 ? '\0' : (char) i; |
21 | } |
22 | |
23 | void ncSave() {
|
24 | if (c != '\0') {
|
25 | buf.append(c); |
26 | nc(); |
27 | } |
28 | } |
29 | |
30 | public S next() {
|
31 | if (inWhiteSpace) {
|
32 | inWhiteSpace = false; |
33 | while (c != '\0') {
|
34 | if (c == ' ' || c == '\t' || c == '\r' || c == '\n') |
35 | ncSave(); |
36 | else if (c == '/' && d == '*') {
|
37 | do ncSave(); while (c != '\0' && !(c == '*' && d == '/')); |
38 | ncSave(); ncSave(); |
39 | } else if (c == '/' && d == '/') {
|
40 | do ncSave(); while (c != '\0' && "\r\n".indexOf(c) < 0); |
41 | } else |
42 | break; |
43 | } |
44 | } else {
|
45 | if (c == '\0') null; |
46 | inWhiteSpace = true; |
47 | // scan for non-whitespace |
48 | if (c == '\'' || c == '"') {
|
49 | char opener = c; |
50 | ncSave(); |
51 | while (c != '\0') {
|
52 | if (c == opener || c == '\n') { // end at \n to not propagate unclosed string literal errors
|
53 | ncSave(); |
54 | break; |
55 | } else if (c == '\\') {
|
56 | ncSave(); |
57 | ncSave(); |
58 | } else |
59 | ncSave(); |
60 | } |
61 | } else if (Character.isJavaIdentifierStart(c)) |
62 | do ncSave(); while (Character.isJavaIdentifierPart(c) || c == '\''); // for stuff like "don't" |
63 | else if (Character.isDigit(c)) {
|
64 | do ncSave(); while (Character.isDigit(c)); |
65 | if (c == 'L') ncSave(); // Long constants like 1L |
66 | } else if (c == '[' && d == '[') {
|
67 | do ncSave(); while (c != '\0' && !(c == ']' && d == ']')); |
68 | ncSave(); ncSave(); |
69 | } else if (c == '[' && d == '=' && e == '[') {
|
70 | do ncSave(); while (c != '\0' && !(c == ']' && d == '=' && e == ']')); |
71 | ncSave(); ncSave(); ncSave(); |
72 | } else |
73 | ncSave(); |
74 | } |
75 | |
76 | S t = buf.toString(); |
77 | buf.setLength(0); |
78 | ret t; |
79 | } |
80 | } |
81 | |
82 | ret new X; |
83 | } |
Began life as a copy of #1005981
download show line numbers debug dex old transpilations
Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
| Snippet ID: | #1027365 |
| Snippet name: | javaTok_onReader - javaTok as Producer on BufferedReader |
| Eternal ID of this version: | #1027365/4 |
| Text MD5: | 2d834ce918e660fa0c2c98b8cb622f7f |
| Transpilation MD5: | 0c81ab7f97b238d801a6976aa29ba29f |
| Author: | stefan |
| Category: | javax / parsing |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2020-03-15 14:50:30 |
| Source code size: | 2454 bytes / 83 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 438 / 579 |
| Version history: | 3 change(s) |
| Referenced in: | [show references] |