编译原理5——自下而上的分析方法

概览

  1. 短语、直接短语、素短语、最左素短语
  2. 算符优先文法
    判断是否是算符优先文法
    1. FIRSTVT集合
      构造FIRSTVT集合
    2. LASTVT集合
      构造
  3. LR分析法
    1. 状态分析表
      根据状态分析表进行归约
    2. ACTION[s,a]
    3. GOTO[]
    4. SLR分析
    5. 闭包
    6. 状态转换函数GO
    7. LR(0)文法

5.1 自下而上分析基本问题

5.1.1 归约

"移进-规约"法
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号
中心问题:怎样判断栈顶的符号串的可归约性,以及如何归约

5.1.2 规范规约简述

G G G是一个文法,S是文法的开始符号,假定 α β δ \alpha\beta\delta αβδ是文法 G G G的一个句型,如果有
S ⇒ ∗ α A δ S\xRightarrow{*}\alpha A\delta S αAδ A ⇒ ∗ β A\xRightarrow{*}\beta A β
则称 β \beta β是句型 α β δ \alpha\beta\delta αβδ相对于非终结符 A A A短语
特别是,如果有, A ⇒ β A\Rightarrow \beta Aβ,则称 β \beta β是句型 α β δ \alpha\beta\delta αβδ相对于规则 A → β A\rightarrow \beta Aβ直接短语
一个句型的最左直接短语称为该句型的句柄

  1. 短语
    由一个非终结符产生的一串符号(以某个非终结符为根的树的叶节点序列,可以含非终结符)
  2. 直接短语
    由一个非终结符直接产生的一串符号
  3. 素短语
    至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语(从每种程度上来说,素短语与直接短语高度重合)
  4. 最左素短语
    处于句型最左边的那个素短语
  5. 句柄
    最左侧由一个非终结符直接产生的一串符号(基本与最短素短语无异)
  6. 规范归约/最左归约
    序列 α n , α n − 1 , ⋯   , α 0 \alpha_n,\alpha_{n-1},\cdots,\alpha_0 αn,αn1,,α0 α \alpha α的一个规范归约,当:
    1. α n = α \alpha_n=\alpha αn=α
    2. α 0 \alpha_0 α0为文法的开始符,即 α 0 = S \alpha_0=S α0=S
    3. 对任何 i i i, 0 < i ≤ n 0<i\leq n 0<in α i − 1 \alpha_{i-1} αi1是从 α i \alpha_i αi经把句柄替换为相应产生式的左部符号而得到的
      就是由初始句逐步替换句柄直至返回开始符
  7. 规范推导
    产生式的使用顺序调过来(最右推导)
    ⋆ \star 文法无二义,则最右推导的逆过程必然为规范推导
  8. 规范句式
    规范推导所得的句型

5.1.3 符号栈的使用与语法树的表示

“移进-归约”分析器:符号栈、输入缓冲区

  1. 以#作为栈底符,预先推进栈
  2. 将字符串首字符推入栈
    1. 发现可归约,进行归约,即弹出待归约字符串,压入归约后的非终结符
    2. 未发现可归约,继续
  3. 将所有可归约符号归约后
    1. 符号栈:#S,输入栈:#:归约成功
    2. 否则失败,说明存在语法错误
      对于符号栈的四类操作:
  4. 移进
  5. 归约
  6. 接受
  7. 出错处理
    ⋆ \star 可归约串必然出现在栈顶,不可能出现在栈的内部

5.2 算符优先分析

  1. 算符优先
    定义算符之间(终结符之间)的某种优先关系
    1. a ⋖ b a\lessdot b ab a a a的优先级低于 b b b
    2. a = b a=b a=b a a a的优先级等于 b b b
    3. a ⋗ b a\gtrdot b ab a a a的优先级大于 b b b
      ⋆ \star 算符优先分析法不是规范归约法
      ⋆ \star 无二义文法是算符优先文法的充分条件

5.2.1 算符优先文法及优先表构造

  1. 算符文法
    任意产生式的右部都不含两个相继(并列)的非终结符(例如 ⋯ Q R ⋯ \cdots QR\cdots QR
    简单说就是任何两个非终结符之间必须夹至少一个终结符
  2. 算符优先文法
    G G G是算符文法,且 G G G中的任意两终结符只满足 a ⋖ b a\lessdot b ab a = b a=b a=b a ⋗ b a\gtrdot b ab其中之一
    1. a = b a= b a=b:存在 P → ⋯ a b ⋯ P\rightarrow \cdots ab\cdots Pab P → ⋯ a Q b ⋯ P\rightarrow \cdots aQb\cdots PaQb
    2. a ⋖ b a\lessdot b ab:存在 P → ⋯ a R ⋯ P\rightarrow \cdots aR\cdots PaR,且 R ⇒ + b ⋯ R\xRightarrow{+}b\cdots R+ b R ⇒ + Q b ⋯ R\xRightarrow{+}Qb\cdots R+ Qb
      因为要优先归约R,则R内的第一个终结符较外部开头最近终结符优先级高
    3. a ⋗ b a\gtrdot b ab:存在 P → ⋯ R b ⋯ P\rightarrow \cdots Rb\cdots PRb,且 R ⇒ + ⋯ a R\xRightarrow{+}\cdots a R+ a R ⇒ + ⋯ a Q R\xRightarrow{+}\cdots aQ R+ aQ
      因为要优先归约R,则R内的最后一个终结符较外部结尾最近终结符优先级高
  3. F I R S T V T ( P ) FIRSTVT(P) FIRSTVT(P)
    1. 定义
      F I R S T V T ( P ) = { a ∣ P ⇒ + a ⋯ 或 P ⇒ + Q a ⋯   , a ∈ V T 而 Q ∈ V N } FIRSTVT(P)=\{a|P\xRightarrow{+}a\cdots或P\xRightarrow{+}Qa\cdots,a\in V_T而Q\in V_N\} FIRSTVT(P)={aP+ aP+ Qa,aVTQVN}
      P句型第一个终结符的集合
    2. 应用
      若后选型 ⋯ a P ⋯ \cdots aP\cdots aP b ∈ F I R S T V T ( P ) b\in FIRSTVT(P) bFIRSTVT(P),则: a ⋖ b a\lessdot b ab
    3. 构造
    4. 若有产生式 P → a ⋯ P\rightarrow a\cdots Pa P → Q a ⋯ P\rightarrow Qa\cdots PQa,则 a ∈ F I R S T V T ( P ) a\in FIRSTVT(P) aFIRSTVT(P)
    5. a ∈ F I R S T V T ( Q ) a\in FIRSTVT(Q) aFIRSTVT(Q),且有产生式 P → Q ⋯ P\rightarrow Q\cdots PQ,则 a ∈ F I R S T V T ( P ) a\in FIRSTVT(P) aFIRSTVT(P)
  4. L A S T V T ( P ) LASTVT(P) LASTVT(P)
    1. 定义
      L A S T V T ( P ) = { a ∣ P ⇒ + ⋯ a 或 P ⇒ + ⋯ a Q , a ∈ V T 而 Q ∈ V N } LASTVT(P)=\{a|P\xRightarrow{+}\cdots a或P\xRightarrow{+}\cdots aQ,a\in V_T而Q\in V_N\} LASTVT(P)={aP+ aP+ aQ,aVTQVN}
      P句型最后一个终结符的集合
    2. 应用
      若后选型 ⋯ P b ⋯ \cdots Pb\cdots Pb a ∈ L A S T V T ( P ) a\in LASTVT(P) aLASTVT(P),则: a ⋗ b a\gtrdot b ab
    3. 构造
      1. 若有产生式 P → ⋯ a P\rightarrow\cdots a Pa P → ⋯ a Q P\rightarrow\cdots aQ PaQ,则 a ∈ L A S T V T ( P ) a\in LASTVT(P) aLASTVT(P)
      2. a ∈ L A S T V T ( Q ) a\in LASTVT(Q) aLASTVT(Q),且有产生式 P → ⋯ Q P\rightarrow\cdots Q PQ,则 a ∈ L A S T V T ( P ) a\in LASTVT(P) aLASTVT(P)
  5. 优先表
    横纵坐标均为终结符,内容为优先级,表示为:
    纵坐标 ( 内容 , 如 ⋖ ) 横坐标 纵坐标 (内容,如\lessdot) 横坐标 纵坐标(内容,)横坐标

5.2.2 算符优先分析算法

  1. 最左素短语
    最左子串 N j a j ⋯ N i a i N i + 1 N_ja_j\cdots N_ia_iN_{i+1} NjajNiaiNi+1
    1. a j − 1 ⋖ a j a_{j-1}\lessdot a_j aj1aj
    2. a j = a j + 1 , ⋯   , a i − 1 = a i a_j=a_{j+1},\cdots,a_{i-1}=a_i aj=aj+1,,ai1=ai
    3. a i ⋗ a i + 1 a_i\gtrdot a_{i+1} aiai+1
  2. 算符优先分析算法
    1. 不断读入字符串,此时最靠近栈顶终结符为 a a a,待压入终结符为 b b b
      1. 若栈为空,压入字符
      2. a ⋖ b a\lessdot b ab,压入,记该 b b b α \alpha α(这里可以考虑将a的位置压入一个栈,因为可能有多层,但如果只是一个一个弹出的话,则完全没有必要,因为可以边弹边检查)
      3. a = b a=b a=b,压入
      4. a ⋗ b a\gtrdot b ab,记该 a a aw为 β \beta β,逐步弹栈至弹出 α \alpha α,对 N i α ⋯ β N j N_i\alpha\cdots\beta N_j NiαβNj进行归约,结果压入栈
    2. 字符串读完,栈内为 # S \#S #S,字符串剩余 # \# #,则匹配成功
      ⋆ \star 算符分析的结果不一定是语法树,算符优先分析并不等价于规范规约
      ⋆ \star 算符优先分析较规范规约更快,但忽略了非终结符的作用,具有一定的危险性

5.2.3 优先函数

上课没讲,简单看看

  1. 入栈优先函数 f ( θ ) f(\theta) f(θ),比较优先函数 g ( θ ) g(\theta) g(θ)
    1. θ 1 ⋖ θ 2 \theta_1\lessdot \theta_2 θ1θ2,则: f ( θ 1 ) < g ( θ 2 ) f(\theta_1)<g(\theta_2) f(θ1)<g(θ2)
    2. θ 1 = θ 2 \theta_1=\theta_2 θ1=θ2,则: f ( θ 1 ) = g ( θ 2 ) f(\theta_1)=g(\theta_2) f(θ1)=g(θ2)
    3. θ 1 ⋗ θ 2 \theta_1\gtrdot \theta_2 θ1θ2,则: f ( θ 1 ) > g ( θ 2 ) f(\theta_1)>g(\theta_2) f(θ1)>g(θ2)

5.2.4 算符优先分析中的出错处理

5.3 LR分析法

5.3.1 LR分析器

关键问题:找句柄
基本思想:记住“历史”(已经移入与归约的符号串),“展望”未来(预测未来可能碰到的输入符号)
实质:一个带栈的确定有限自动机

  1. 分析表
    LR分析器的核心部分

    1. ACTION表(动作)
      A C T I O N [ s , a ] ACTION[s,a] ACTION[s,a] s s s状态面临 a a a动作时进行的动作
      1. 移进
        把新的 s s s a a a压入栈
      2. 归约
        根据某一产生式,弹出一段符号,归约成新的 a a a
      3. 接受
        分析成功
      4. 报错
        出现非 A C T I O N ACTION ACTION表规定动作,即出错
    2. GOTO表(状态转换)
      G O T O [ s , X ] GOTO[s,X] GOTO[s,X],状态 s s s面临 X X X符号的下一步动作

    组成:

    1. 纵坐标
      状态
    2. 横坐标
      1. ACTION表
        终结符
      2. GOTO表
        非终结符
    3. 内容
      1. ACTION表
        纵坐标为目前状态栈顶的值
        1. r i i i
          该符号压入栈后,根据 ( i ) (i) (i)规则弹出候选式并进行归约,得到的非终结符后,依照弹出后现有栈顶状态进行压入操作
        2. s i i i
          该符号压入栈后,压入状态 i i i
        3. acc
          仅出现在 # \# #一栏中,表示接受
        4. 【empty】
          错误
      2. GOTO表
        纵坐标为执行弹栈操作后状态栈顶的值
        1. i i i
          该符号压入栈后,压入状态 i i i
        2. 【empty】
          错误
  2. LR文法
    LR分析表入口唯一确定,即句柄一旦出现在栈顶就可以进行归约处理

  3. 非LR结构

    S → i C i S ∣ i C t S e S S\rightarrow iCiS|iCtSeS SiCiSiCtSeS
    当可能是句柄的语句出现时无法判断是继续压入还是归约

⋆ \star LR文法是无二义文法的真子集,但LR分析技术方法具有一定的二义文法分析能力

5.3.2 LR(0)项目集族和LR(0)分析表的构造

(只包含“历史”,不考虑“展望”)

5.3.2.1 定义

  1. 前缀
    字的任意首部
    例:
    a b c abc abc的前缀有: ε \varepsilon ε a a a a b ab ab a b c abc abc
  2. 活前缀
    规范句型的一种前缀,不含句柄之后的任何符号(简单说就是最左素短语的前缀)
    只要栈内是活前缀,则扫描部分没有出错
    构造有限自动机识别文法的所有活前缀
  3. LR(0)项目/项目
    例:
    A → X Y Z A\rightarrow XYZ AXYZ的项目:
    A → ⋅ X Y Z A\rightarrow \cdot XYZ AXYZ
    A → X ⋅ Y Z A\rightarrow X\cdot YZ AXYZ
    A → X Y ⋅ Z A\rightarrow XY\cdot Z AXYZ
    A → X Y Z ⋅ A\rightarrow XYZ\cdot AXYZ
    ⋆ \star A → ε A\rightarrow\varepsilon Aε的项目只有 A → ⋅ A\rightarrow\cdot A
  4. 分析表的产生过程
    1. 构造DFA,识别活前缀(该DFA以项目集位节点)
    2. 将DFA转化为分析表
  5. LR(0)项目规范族
    构成识别一个文法活前缀的DFA的项目集(状态)的全体
    1. 规约项目
      A → α ⋅ A\rightarrow\alpha\cdot Aα
      1. 接受项目
        S ′ → α ⋅ S'\rightarrow\alpha\cdot Sα
    2. 移进项目
      A → α ⋅ α β A\rightarrow\alpha\cdot\alpha\beta Aααβ
    3. 待约项目
      A → α ⋅ B β A\rightarrow\alpha\cdot B\beta Aα

5.3.2.2 LR(0)项目集规范族的构造

  1. 拓广
    引入 S ′ → S S'\rightarrow S SS(原本文法中右侧生成可能包含S,会影响终态的判断,以S’代替S产生明确的接受态)

  2. 拓广文法
    接受态: S ′ → S ⋅ S'\rightarrow S\cdot SS

  3. C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)
    I I I是拓展文法的任意一项目集

    1. I I I的任何项目都属于 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)
    2. A → α ⋅ B β A\rightarrow\alpha\cdot B\beta Aα属于 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I),那么,对于任何关于 B B B的产生式 B → ⋅ γ B\rightarrow\cdot\gamma Bγ也属于 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)
    3. 重复执行上述两步骤直至 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)不再增大为止
  4. G O ( I , X ) = C L O S U R E ( J ) GO(I,X)=CLOSURE(J) GO(I,X)=CLOSURE(J)
    X X X为一个文法符号
    J = { 任何形如 A → α X ⋅ β ∣ A → α ⋅ X β 属于 I } J=\{任何形如A\rightarrow\alpha X\cdot\beta|A\rightarrow\alpha\cdot X\beta属于I\} J={任何形如AαXβAα属于I}
    (GO函数描述了一个状态I经文法符号X转变为J)
    (以CLOSURE(I)为节点,GO函数为方向,可构成DFA)

  5. 有效的
    某非待约项目对活前缀有效的前提是该项目归约的结果是活前缀所在项目的候选式的一部分
    ⋆ \star 一个活前缀可能有多个有效项目,此时需要向后看(展望)

    1. 有效项目
  6. LR(0)文法
    前提

    1. 不含既移进又归约的项目
    2. 一个状态不含多归约项目
  7. LR(0)表
    构造方式
    以DFA为参考

    1. 终结符移进项目 I x → α I y I_{x}\xrightarrow{\alpha} I_{y} Ixα Iy
      ACTION表 ( α , x ) (\alpha,x) (α,x)置为 s y s_{y} sy
    2. 非终结符移进项目 I x → P I y I_{x}\xrightarrow{P}I_{y} IxP Iy
      GOTO表 ( P , x ) (P,x) (P,x)置为 y y y
    3. 规约项目 I x I_{x} Ix,且对应归约规则 ( m ) (m) (m)
      ACTION表 ( ? , x ) (?,x) (?,x)置为 r m r_{m} rm
    4. 项目 S ′ → S ⋅ S'\rightarrow S\cdot SS为项目 I x I_{x} Ix
      ACTION表 ( # , x ) (\#,x) (#,x)置为acc
    5. 其余均为报错

    ((x,y)的x为终结符/非终结符,y为状态)

  8. LR(0)分析器
    使用LR(0)表的分析器

5.3.3 SLR分析表的构造

(简单“展望”)

  1. SLR(1)解决办法
    对于既有移进也有归约/多个归约的项目(移进-归约冲突)
    考察比较待移进字符与下一个字符/FOLLOW集合,根据比较结果执行指令
    1. a a a是某个移进项目的 a i a_i ai,移进
    2. a ∈ F O L L O W ( P ) a\in FOLLOW(P) aFOLLOW(P),执行 P → α P\rightarrow\alpha Pα归约
    3. 报错
  2. SLR表
    构造
    1. 终结符移进项目 I x → α I y I_{x}\xrightarrow{\alpha} I_{y} Ixα Iy
      ACTION表 ( α , x ) (\alpha,x) (α,x)置为 s y s_{y} sy
    2. 非终结符移进项目 I x → P I y I_{x}\xrightarrow{P}I_{y} IxP Iy
      GOTO表 ( P , x ) (P,x) (P,x)置为 y y y
    3. 规约项目 I x I_{x} Ix,且对应归约规则 ( m ) (m) (m),归约为 P P P(该处与LR(0)有所区别)
      ACTION表 ( α i , x ) (\alpha_i,x) (αi,x)置为 r m r_{m} rm α i ∈ F O L L O W ( P ) \alpha_i\in FOLLOW(P) αiFOLLOW(P)(简单说就是有这些文字出现即需要归约,当然,其他字符出现则可能意味着出错/移进,具体看是否会再填单词进去)
    4. 项目 S ′ → S ⋅ S'\rightarrow S\cdot SS为项目 I x I_{x} Ix
      ACTION表 ( # , x ) (\#,x) (#,x)置为acc
    5. 其余均为报错
  3. SLR(1)文法
    具有SLR表的文法G
  4. SLR分析器
    使用SLR分析表的分析器
    (SLR分析表简单的将所有FOLLOW集合中的元素一股脑的当作允许归约的信号,实际上未考虑到活前缀对于归约动作的要求和规范)

5.3.4 规范LR分析表的构造

简单说,就是升级版的SLR,展望n位

  1. LR(k)项目
    项目一般形式: [ A → α ⋅ β , a 1 a 2 ⋯ a k ] [A\rightarrow \alpha\cdot\beta,a_1a_2\cdots a_k] [Aαβ,a1a2ak]
  2. 搜索符串/展望串
    a 1 a 2 ⋯ a k a_1a_2\cdots a_k a1a2ak
  3. 有效的
    项目 [ A → α ⋅ β , a ] [A\rightarrow \alpha\cdot\beta,a] [Aαβ,a]对于活前缀 γ \gamma γ有效
    S ⇒ ∗ δ A ω ⇒ δ α β ω S\xRightarrow{*}\delta A\omega\Rightarrow\delta\alpha\beta\omega S δAωδαβω
    1. γ = δ α \gamma=\delta\alpha γ=δα
    2. a ∈ F I R S T ( ω ) a\in FIRST(\omega) aFIRST(ω) a = # , ω = ε a=\#,\omega=\varepsilon a=#,ω=ε
  4. 规范LR闭包 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)构造(规范LR(k)(k>0)需要重新构造项目集,新的项目集中携带“展望”,该项目集也是随后LALR的基础)
    1. I I I的任何项目都属于 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)
    2. 若项目 [ A → α ⋅ B β , a ] [A\rightarrow\alpha\cdot B\beta,a] [Aα,a]属于 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I) B → ξ B\rightarrow\xi Bξ是一个产生式,那么,对于 F I R S T ( β a ) FIRST(\beta a) FIRST(βa)中的每一个终结符 b b b,如果 [ B → ⋅ ξ , b ] [B\rightarrow\cdot\xi,b] [Bξ,b]原来不在 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)中,则把它加进去(通过以上方式“凭空”添加B)
    3. 重复执行步骤(2),直至 C L O S U R E ( I ) CLOSURE(I) CLOSURE(I)不再增大为止

5.3.4.1 LR(1)

  1. 项目集构造
    [ S ′ → ⋅ S , # ] [S'\rightarrow \cdot S,\#] [SS,#]为初始,与LR(0)、SLR项目集构造流程类似
    ⋆ \star 展望串
    由于读至形如 [ A → α ⋅ B β , a ] [A\rightarrow\alpha\cdot B\beta,a] [Aα,a]而引入的 [ B → ⋅ ω , b ] [B\rightarrow\cdot\omega,b] [Bω,b]中的 b ∈ F I R S T ( β ) b\in FIRST(\beta) bFIRST(β),如果 β = ξ \beta=\xi β=ξ,则 b = a b=a b=a
    其余基本不变
  2. DFA构造
    与LR(0)、SLR基本一致,与项目集同步构造
  3. LR(1)表构造
    1. 终结符移进项目 I x → α I y I_{x}\xrightarrow{\alpha} I_{y} Ixα Iy
      ACTION表 ( α , x ) (\alpha,x) (α,x)置为 s y s_{y} sy
    2. 非终结符移进项目 I x → P I y I_{x}\xrightarrow{P}I_{y} IxP Iy
      GOTO表 ( P , x ) (P,x) (P,x)置为 y y y
    3. 规约项目 I x I_{x} Ix,且对应归约规则 ( m ) (m) (m),对应项目集为 [ P → α ⋅ , a ] [P\rightarrow\alpha\cdot,a] [Pα,a](此处区别于SLR分析表,将归约条件进一步细化)
      ACTION表 ( a , x ) (a,x) (a,x)置为 r m r_{m} rm
    4. 项目 S ′ → S ⋅ S'\rightarrow S\cdot SS为项目 I x I_{x} Ix
      ACTION表 ( # , x ) (\#,x) (#,x)置为acc
    5. 其余均为报错

L R ( 0 ) ⊂ S L R ⊂ L R ( 1 ) LR(0)\subset SLR \subset LR(1) LR(0)SLRLR(1)

5.3.5 LALR分析表的构造

SLR和LR(n)的折衷

  1. LALR(1)文法
    (说白了,就是嫌仅展望不同项目集需要占用多个状态,浪费空间)
    解决方式是将这些项目集(具有同心)合并
    ⋆ \star 合并后的项目集失去了检查错误的功能,但是这些错误会在之后被检测出来
    ⋆ \star 合并不会造成移进-归约冲突

5.3.6 二义文法的应用

5.3.7 LR分析中的出错处理

5.4 语法分析器的自动产生工具YACC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值