Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

Violet's Devblog

메신저봇R v0.6.15a 패치노트 본문

Android/메신저봇

메신저봇R v0.6.15a 패치노트

DEViolet 2020. 3. 10. 00:08

에디터

  • 따옴표 자동추가 알고리즘 개선: 커서 뒤에 알파벳, 숫자, 한글이 있으면 자동추가하지 않음, 커서 이전에 아직 닫히지 않은 문자열 리터럴이 있으면 자동추가하지 않음

아래는 직접 짠 문자열 닫힘 체크 함수인데, 검증해주시면 사랑해 드립니다(?)

str: 탐색 대상 소스코드, start: 탐색 시작 인덱스, isDoubleQuot: 큰따옴표인지 작은따옴표인지


    fun isQuotClosed(str: String, start: Int, isDoubleQuot: Boolean): Boolean{
        var cursor = start
        val quot = if(isDoubleQuot)'"' else '\''
        var count = 0
        var commentStarted = false
        while(cursor>=0){
            if(str[cursor] == '/' && cursor>=1 && str[cursor-1] == '*') {
                if (count % 2 == 0) { // 지금까지 찾은 문자열이 모두 닫혀 있을 때
                    commentStarted = true // 역방향으로 탐색 중 블럭 주석의 끝을 만나면, 이건 진짜 주석의 끝인거임
                }
            }
            if(!commentStarted){ // 주석의 시작을 만나기 전까진 패스
                if(str[cursor] == quot){
                    // 인접한 이스케이프 문자를 셉니다
                    var cursor2 = cursor - 1
                    var backslashCount = 0
                    while (cursor2 >= 0) {
                        if (str[cursor2] == '\\') backslashCount++
                        else break
                        cursor2--
                    }
                    if(backslashCount%2==0){ // 인접한 이스케이프 문자가 0개거나 짝수개면 이스케이프 되지 않은 '진짜' 따옴표
                        count++

                    }
                    cursor = cursor2 + 1
                } else if(str[cursor] == '\n'){
                    if(count%2==0) return true // 이전 줄 탐색하기 전에 이번 줄의 따옴표가 짝이 맞으면 (닫혀 있으면) 패스
                    if(cursor==0) break
                    if(str[cursor-1] != '\\') break // 따옴표 열고 \ 입력 후 개행했을때는 예외
                }
            } else {
                if(str[cursor] == '*' && cursor>=1 && str[cursor-1] == '/') { // 주석의 시작을 만남
                    commentStarted = false
                }
            }
            cursor--
        }
        if(commentStarted) return false
        return count%2==0
    }
Comments