Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

83
LINES

< > BotCompany Repo | #1030392 // javaTok_vstack - javaTok for VStack [OK, only outer loop virtualized]

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (2848L/18K).

srecord javaTok_vstack(S s) implements VStack.Computable<LS> {
  new ArrayList<S> tok;
  int l, i;
  int label; // where are we at in routine

  void goTo(int label) { this.label = label; }
  
  public void step(VStack stack, O subComputationResult) {
    switch (label) {
      case 0:
        l = s == null ? 0 : s.length();
      
      case 1:
        if (i >= l) ret with goTo(2);
        
        int j = i;
        char c, d;
        
        // scan for whitespace
        while (j < l) {
          c = s.charAt(j);
          d = j+1 >= l ? '\0' : s.charAt(j+1);
          if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
            ++j;
          else if (c == '/' && d == '*') {
            do ++j; while (j < l && !regionMatches(s, j, "*/"));
            j = Math.min(j+2, l);
          } else if (c == '/' && d == '/') {
            do ++j; while (j < l && "\r\n".indexOf(s.charAt(j)) < 0);
          } else
            break;
        }
        
        tok.add(javaTok_substringN(s, i, j));
        i = j;
        if (i >= l) break;
        c = s.charAt(i);
        d = i+1 >= l ? '\0' : s.charAt(i+1);
    
        // scan for non-whitespace
        
        // Special JavaX syntax: 'identifier
        if (c == '\'' && Character.isJavaIdentifierStart(d) && i+2 < l && "'\\".indexOf(s.charAt(i+2)) < 0) {
          j += 2;
          while (j < l && Character.isJavaIdentifierPart(s.charAt(j)))
            ++j;
        } else if (c == '\'' || c == '"') {
          char opener = c;
          ++j;
          while (j < l) {
            int c2 = s.charAt(j);
            if (c2 == opener || c2 == '\n' && opener == '\'') { // allow multi-line strings, but not for '
              ++j;
              break;
            } else if (c2 == '\\' && j+1 < l)
              j += 2;
            else
              ++j;
          }
        } else if (Character.isJavaIdentifierStart(c))
          do ++j; while (j < l && (Character.isJavaIdentifierPart(s.charAt(j)) || s.charAt(j) == '\'')); // for stuff like "don't"
        else if (Character.isDigit(c)) {
          do ++j; while (j < l && Character.isDigit(s.charAt(j)));
          if (j < l && s.charAt(j) == 'L') ++j; // Long constants like 1L
        } else if (c == '[' && d == '[') {
          do ++j; while (j < l && !regionMatches(s, j, "]]"));
          j = Math.min(j+2, l);
        } else if (c == '[' && d == '=' && i+2 < l && s.charAt(i+2) == '[') {
          do ++j; while (j+2 < l && !regionMatches(s, j, "]=]"));
          j = Math.min(j+3, l);
        } else
          ++j;
          
        tok.add(javaTok_substringC(s, i, j));
        i = j;
        ret with goTo(1);
        
      case 2:
        if ((tok.size() & 1) == 0) tok.add("");
        stack._return(tok);
    }
  }
}

Author comment

Began life as a copy of #1000688

download  show line numbers  debug dex  old transpilations   

Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt

No comments. add comment

Snippet ID: #1030392
Snippet name: javaTok_vstack - javaTok for VStack [OK, only outer loop virtualized]
Eternal ID of this version: #1030392/8
Text MD5: 3a23d597e756eb8d149fa4857b2a1f09
Transpilation MD5: 9721255d062ff1f5a8a7742217d71f1f
Author: stefan
Category: javax / tokenizing
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2020-12-11 01:35:15
Source code size: 2842 bytes / 83 lines
Pitched / IR pitched: No / No
Views / Downloads: 150 / 371
Version history: 7 change(s)
Referenced in: [show references]