-
1 # 1234567啊額
-
2 # 都豆兜
首先把變量聲明語句的規則,用形式化的方法表達一下。它的左邊是一個非終結符(Non-terminal)。右邊是它的產生式(Production Rule)。在語法解析的過程中,左邊會被右邊替代。如果替代之後還有非終結符,那麼繼續這個替代過程,直到最後全部都是終結符(Terminal),也就是 Token。只有終結符才可以成為 AST 的葉子節點。這個過程,也叫做推導(Derivation)過程。
intDeclaration : Int Identifier (’=’ additiveExpression)?;
上面的文法翻譯成程序語句,代碼如下
SimpleASTNode node = null;
Token token = tokens.peek(); // 預讀
if (token != null && token.getType() == TokenType.Int) { // 匹配 Int
token = tokens.read(); // 消耗掉 int
if (tokens.peek().getType() == TokenType.Identifier) { // 匹配標識符
token = tokens.read(); // 消耗掉標識符
// 創建當前節點,並把變量名記到 AST 節點的文本值中,
// 這裡新建一個變量子節點也是可以的
node = new SimpleASTNode(ASTNodeType.IntDeclaration, token.getText());
token = tokens.peek(); // 預讀
if (token != null && token.getType() == TokenType.Assignment) {
tokens.read(); // 消耗掉等號
SimpleASTNode child = additive(tokens); // 匹配一個表達式
if (child == null) {
throw new Exception("inval
回覆列表
. Token的原理
1)將荷載payload,以及Header信息進行Base64加密,形成密文payload密文,header密文。
2)將形成的密文用句號鏈接起來,用服務端秘鑰進行HS256加密,生成簽名.
3)將前面的兩個密文後面用句號鏈接簽名形成最終的token返回給服務端
說明:
(1)用戶請求時攜帶此token(分為三部分,header密文,payload密文,簽名)到服務端,服務端解析第一部分(header密文),用Base64解密,可以知道用了什麼算法進行簽名,此處解析發現是HS256。
(2)服務端使用原來的秘鑰與密文(header密文+"."+payload密文)同樣進行HS256運算,然後用生成的簽名與token攜帶的簽名進行對比,若一致說明token合法,不一致說明原文被修改。
(3)判斷是否過期,客戶端通過用Base64解密第二部分(payload密文),可以知道荷載中授權時間,以及有效期。通過這個與當前時間對比發現token是否過期。