All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.redhat.ceylon.model.loader.ParameterNameLexer Maven / Gradle / Ivy

There is a newer version: 1.3.3
Show newest version
package com.redhat.ceylon.model.loader;

class ParameterNameLexer {

    public static final int COMMA = 0;
    public static final int LEFT_PAREN = COMMA+1;
    public static final int RIGHT_PAREN = LEFT_PAREN+1;
    public static final int IDENT = RIGHT_PAREN+1;
    public static final int PLUS = IDENT+1;
    public static final int STAR = PLUS+1;
    public static final int BANG = STAR+1;
    public static final int EOI = BANG+1;
    
    // type string to parse
    String  input;
    int index = 0;
    int mark = -1;
    
    public ParameterNameLexer(){}
    
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(input).append(System.lineSeparator());
        for (int ii = 0; ii < index; ii++) {
            sb.append(' ');
        }
        sb.append('^');
        return sb.toString();
    }
    
    public void setup(String input){
        this.input = input;
        index = 0;
    }
    
    private int peek(){
        if(index >= input.length())
            return EOI;
        int c = input.codePointAt(index);
        int token;
        switch(c){
        case '(': token = LEFT_PAREN; break;
        case ')': token = RIGHT_PAREN; break;
        case ',': token = COMMA; break;
        case '+': token = PLUS; break;
        case '*': token = STAR; break;
        case '!': token = BANG; break;
        default:
            if (isIdentifierPart(c)) {
                token = IDENT;
            } else {
                throw new ParameterNameParserException("Unknown codepoint=" + c + "\n" + this);
            }
        }
        return token;
    }

    private boolean isIdentifierPart(int codepoint) {
        return Character.isLowerCase(codepoint) 
                || Character.isUpperCase(codepoint)
                || Character.isDigit(codepoint)
                || codepoint == '_';
    }
    
    public void eat() {
        int token = peek();
        switch(token) {
        case LEFT_PAREN:
        case RIGHT_PAREN:
        case COMMA:
        case PLUS:
        case STAR:
        case BANG:
            index += 1;
            return;
        case IDENT:
            index += Character.charCount(input.codePointAt(index));
            int c = input.codePointAt(index);
            while (index < input.length() 
                    && isIdentifierPart(c)) {
                index += Character.charCount(input.codePointAt(index));
                c = input.codePointAt(index);
            }
            return;
        case EOI:
            return;
        default:
            throw new ParameterNameParserException("Unknown token=" + token+"\n" + this);
        }
    }
    
    public String eatIdentifier() {
        int index = this.index;
        eat(IDENT);
        return input.substring(index, this.index);
    }
    
    public void eat(int token) {
        if(!lookingAt(token)){
            throw new ParameterNameParserException("Missing expected token: "+tokenToString(token)+System.lineSeparator() 
                    + this);
        }
        eat();
    }
    
    private String tokenToString(int token) {
        switch (token) {
        case COMMA: return "COMMA";
        case IDENT: return "IDENT";
        case LEFT_PAREN: return "LEFT_PAREN";
        case RIGHT_PAREN: return "RIGHT_PAREN";
        case EOI: return "EOI";
        case PLUS: return "PLUS";
        case STAR: return "STAR";
        case BANG: return "BANG";
        }
        throw new ParameterNameParserException("Unknown token " + token);
    }

    public boolean lookingAt(int token) {
        return peek() == token;
    }
    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy