Python语法的相关规则中的DFA的相关内容的介绍


我们都知道Graminit.c中定义了其中有包括Python语法规则的相关实际应用的相关内容,其中也包括了一些典型的类型,你如果想知道是哪四种典型的类型的话,你就可以浏览以下的文章对其进行了解。

Grammar.h
Graminit.c中定义了包括Python语法规则的DFA(Deterministic Finite Automaton),关于DFA请参考Alfred V. Aho等人所著的Compilers: Principles, Techniques, and Tools一书。为了定义DFA,graminit.c引用了位于grammar.h中的一些类型:arc, state, dfa, grammar。

Label定义了从状态转移到另外一个状态所经过的边所对应的符号,可以是非终结符(Non-Terminal),也可以是终结符(Terminal)。Label一定依附于一条或者多条边。Lb_type代表符号的类型,如终结符NAME,代表一个标示符,或者非终结符stmt,代表一个语句,等等。

Lb_str代表具体符号的内容。比如,label (NAME, “if”)表示当parser处于某个状态,如果遇到了’if’这个标示符,则移动另外一个状态。如果label是一个非终结符的话,情况则要复杂一些,需要跳转到该非终结符对应的另外一个DFA,请参看编译器相关书籍。

  1. /* A label of an arc */  
  2. typedef struct {  
  3. int lb_type;  
  4. char *lb_str;  
  5. } label;   

在Graminit.c中定义了包括Python语法规则的DFA中arc代表DFA中一个状态到另一个状态的弧/边。A_lbl代表arc所对应的Label,而a_arrow记录了arc的目标状态。因为arc是属于某个状态的,因此不用纪录arc的起始状态。

  1. /* An arc from one state to another */  
  2. typedef struct {  
  3. short a_lbl; /* Label of this arc */  
  4. short a_arrow; /* State where this arc goes to */  
  5. } arc;  

State代表着DFA中的状态节点。每个state记录了从该state出发的边的集合,存放在s_arc中。其他的一些成员s_lower, s_upper, s_accel, s_accept记录了state所对应的Accelerator,其作用会在后面讲述。注意Accelerator信息并没有定义在graminit.c中,而是在运行时计算出来的。

  1. /* A state in a DFA */  
  2. typedef struct {  
  3. int s_narcs;  
  4. arc *s_arc; /* Array of arcs */  
  5. /* Optional accelerators */  
  6. int s_lower; /* Lowest label index */  
  7. int s_upper; /* Highest label index */  
  8. int *s_accel; /* Accelerator */  
  9. int s_accept; /* Nonzero for accepting state */  
  10. } state;   

DFA结构中记录了起始状态d_initial和所有状态的集合d_state。d_first记录了该DFA所对应的非终结符的firstset,也就是说,当遇到firstset中的终结符的时候,便需要跳转到此DFA中。d_first在后面计算Accelerators的时候会被用到。

  1. /* A DFA */  
  2. typedef struct {  
  3. int d_type; /* Non-terminal this represents */  
  4. char *d_name; /* For printing */  
  5. http://new.51cto.com/wuyou/int d_initial; /* Initial state */  
  6. int d_nstates;  
  7. state *d_state; /* Array of states */  
  8. bitset d_first;  
  9. } dfa;   

Grammar代表了Python的整个语法,记录了所有的DFA和所有的label。G_start则是Python语法的起始symbol,一般是single_input。不过实际的起始symbol可以在创建Parser的时候指定,可以是single_input, file_input, eval_input中的一个。

相关内容

    暂无相关文章

评论关闭