如何格式化类语法结构
使用jrscript脚本可以格式化类语法结构。
脚本实现如下 (语法规范参考jrscript.cn:
#include "java.h"
#include "sys.h"
#include "style.h"
void processCLASS(token pretk, token curtk, symbol firstSym, symbol prevSym, symbol curSym);
string formateCLASS() hooks tk : @"CLS" {
if(tk == null) return;
PREFIX = false;
BODY = false;
PART = PREV;
BODYNUM = ZERO;
symbol firstSym = null;
symbol prevSym = null;
token pretk=null;
token [] tkList = tk.childs;
var i=0;
while(i<tkList.length){
token ttk=tkList[i];
symbol [] tkSymList = ttk.values;
symbol curSSym = tkSymList[0];
symbol curESym = tkSymList[tkSymList.length-1];
if(firstSym == null) firstSym = curSSym;
if(pretk!=null && tkSymList.length>0){
processCLASS(pretk, ttk, firstSym, prevSym, curSSym);
}
prevSym = curESym;
pretk=ttk;
i=i+1;
}
return null;
}
void processCLASS(token pretk, token curtk, symbol firstSym, symbol prevSym, symbol curSym) {
if(PART == PREV && pretk.type != COMMONS) PREFIX = true;
if(PART == PREV && pretk.type != COMMONS) PART = MIDE;
string s=toString(pretk.values);
if("class"==s) PREFIX = false;
if(PREFIX || "class"==s || "extends"==s || "implements"==s || ","==s || pretk.name == "ADCL"){
if(pretk.name == "ADCL"){
replaceIndentWithOutNLine(pretk, curtk, firstSym.col-1);
} else {
symbol sym=createSymbol(' ');
replace(sym, prevSym.line, prevSym.col, curSym.line, curSym.col);
}
if("class"==s) {
string s=toString(curtk.values);
marker('C', s, curSym.line, curSym.col);
}
}else{
string s=toString(curtk.values);
if("extends"==s || "implements"==s || "{"==s){
symbol sym=createSymbol(' ');
replace(sym, prevSym.line, prevSym.col, curSym.line, curSym.col);
if("{" == s ) BODY = true;
if("{" == s ) BODYNUM = ZERO;
}else{
if("}"==s) {
BODY = false;
BODYNUM = ZERO;
PART = TAIL;
replaceIndentWithOutNLine(pretk, curtk, firstSym.col-1);
}else{
processBody(pretk, curtk, firstSym);
}
}
}
}
void processCLASS(token pretk, token curtk, symbol firstSym, symbol prevSym, symbol curSym) 声明一个处理函数;
replaceIndentWithOutNLine(pretk, curtk, firstSym.col-1) 单词间空白区域处理,换行、缩进。replace(sym, prevSym.line, prevSym.col, curSym.line, curSym.col); 处理单词间空白区域处理,空格。
processBody(pretk, curtk, firstSym);处理{}内语法元素的缩进。