天天看點

分享一個能對java代碼進行“tokenize”的python庫分享一個能對java代碼進行“tokenize”的python庫推薦工具一些資源

分享一個能對java代碼進行“tokenize”的python庫

個人部落格:記錄一下在項目實施過程中的一些點

情景回顧

項目遇到需求,需要将Java代碼進行“tokenize”,即“令牌化”。所謂令牌化,就是指,将java代碼,轉化為一個由令牌組成的序列。而其中的“令牌”,其實就是一個個的“詞”和代碼中的“符号”。

舉個例子,有代碼如下:

package effectivejava.chapter2.item8;

public class Adult {
    public static void main(String[] args) {
        try (Room myRoom = new Room(7)) {
            System.out.println("Goodbye");
        }
    }
}
           

我需要将上面的代碼令牌化,期待得到如下結果:

['package', 'effectivejava', '.', 'chapter2', '.', 'item8', ';', 'public', 'class', 'Adult', '{', 'public', 'static', 'void', 'main', '(', 'String', '[', ']', 'args', ')', '{', 'try', '(', 'Room', 'myRoom', '=', 'new', 'Room', '(', '7', ')', ')', '{', 'System', '.', 'out', '.', 'println', '(', '"Goodbye"', ')', ';', '}', '}', '}']
           

将Java代碼轉化為詞序列,然後給每個詞賦予編号,用編号替代相應的詞,即可以完成對Java代碼的一種簡單的編碼。後續在輸入神經網絡中會友善很多。

推薦工具

我使用的工具為:javalang庫(https://github.com/c2nes/javalang)

使用這個工具能很快速地完成上述轉換,一個簡單demo為:

import javalang

tokens = javalang.tokenizer.tokenize(
    """
    package effectivejava.chapter2.item8;

    public class Adult {
        public static void main(String[] args) {
            try (Room myRoom = new Room(7)) {
                System.out.println("Goodbye");
            }
        }
    }
    """
)

final_token_list = []

for token in tokens:
    final_token_list.append(str(token.value))
    
print final_token_list
           

對我來說,這個庫的好處在于:

  • 它是使用Python語言來解析Java代碼,是以對于使用者很友好(Python編寫比Java簡單)
  • 它可以對代碼片段進行解析。因為在我的項目中,資料全是一些Java代碼片段,使用javalang來解析也十分友善

一些資源

javalang官方Github:https://github.com/c2nes/javalang

繼續閱讀