JsonCpp原始碼閱讀(一) Reader類

2022-07-30 23:27:19 字數 3435 閱讀 9442

class

json_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類的對外介面。接著我們看是如何實現的,從它的簡單的私有函式開始:

void

reader::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作業系統是完全免費的作業系統,具有原始碼公開 可移植 可裁減 排程策略靈活的特點,可以方便地移植到各種微控制器上執行 來自度娘 如今...