分享一個能對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