classjson_api reader
;class
token
;class
errorinfo
;typedef std::deque
errors;
bool expecttoken( tokentype type, token &token, const
char *message );
bool readtoken( token &token );
void
skipspaces();
bool
match( location pattern,
intpatternlength );
bool
readcomment();
bool
readcstylecomment();
bool
readcppstylecomment();
bool
readstring();
void
readnumber();
bool
readvalue();
bool readobject( token &token );
bool readarray( token &token );
bool decodenumber( token &token );
bool decodestring( token &token );
bool decodestring( token &token, std::string &decoded );
bool decodedouble( token &token );
bool decodeunicodecodepoint( token &token,
location ¤t,
location end,
unsigned
int &unicode );
bool decodeunicodeescapesequence( token &token,
location ¤t,
location end,
unsigned
int &unicode );
bool adderror( const std::string &message,
token &token,
location extra = 0
);
bool
recoverfromerror( tokentype skipuntiltoken );
bool adderrorandrecover( const std::string &message,
token &token,
tokentype skipuntiltoken );
void
skipuntilspace();
value ¤tvalue();
char getnextchar();
void
getlocationlineandcolumn( location location,
int &line,
int &column ) const
; std::
string getlocationlineandcolumn( location location ) const
;
void
addcomment( location begin,
location end,
commentplacement placement );
void skipcommenttokens( token &token );
typedef std::stack
nodes;
nodes nodes_;
errors errors_;
std::
string
document_;
location begin_;
location end_;
location current_;
location lastvalueend_;
value *lastvalue_;
std::
string
commentsbefore_;
features features_;
bool
collectcomments_;
};
簡而言之:
reader類的對外介面只有兩個建構函式:
reader();reader(
const features &features );
第二個建構函式,我們在後面再進行分析。三個解析過載的解析函式:
bool parse( const std::string &document, value &root,bool collectcomments = true
);bool parse( const
char *begindoc, const
char *enddoc, value &root,
bool collectcomments = true
);bool parse( std::istream &is
, value &root,
bool collectcomments = true );
乙個獲取錯誤資訊函式:
std::string getformatederrormessages() const;
這些是reader類的對外介面。接著我們看是如何實現的,從它的簡單的私有函式開始:
voidreader::skipspaces()
}
void skipspaces(); 該函式是跳過開通所有空格,'\t','\r'和'\n'字元。使用的是私有成員變數:
location begin_;location end_;
location current_;
location lastvalueend_;
其中的location型別是const char *型別的指標,從typedef char char;和typedef const char *location;這知道。
reader::char reader::getnextchar()
這裡的getnextchar(),是獲取到當前字元,然後 current_指標往後移動一次。這裡感覺這個函式名和函式的行為不符合啊,大家有什麼見解可以提出了,有可能是我的疏漏。
未完待續...
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
原始碼閱讀 Glide原始碼閱讀之with方法(一)
前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...
FreeRTOS原始碼閱讀 一
之前閱讀了rt thread 的原始碼,rtt原始碼是unix風格,看起來比較熟悉.最近有些空閒時間,打算閱讀freertos的原始碼,看看兩者的差別。freertos作業系統是完全免費的作業系統,具有原始碼公開 可移植 可裁減 排程策略靈活的特點,可以方便地移植到各種微控制器上執行 來自度娘 如今...