python 語法樹生成過程

2021-07-14 14:50:34 字數 2539 閱讀 2132

直接上**,語法樹在c語言裡面,就是這個樣子:

typedef struct _mp_parse_t  mp_parse_tree_t;
先行知識:

語法(分析)樹可以以圖形化的方式告訴我們乙個start symbol 如何產生(drive) 一串字元, 如果乙個非終結符a, 有如下產生式

(production) a -> xyz, 那麼它的分析樹將有四個node(節點), a作為parent, x, y, z 作為其孩子結點。x,y, z ,按照從左到右的

順序

最後,對於乙個上下文無法語法,乙個分析樹具有如下屬性:

1, 根節點由起始符號標識

2. 每乙個葉子節點都由終結符或者e(空)標識。

3, 每乙個內部節點都是非終結符。

假設源**是"import uefi".

第一步我們會預先load進來三個字元。

開啟ascii 表即可知道 105(i), 109 (m) 112 (p).

接下來,預先load 乙個完整的token.

mp_lexer_next_token_into(lex, true);
然後看看load 進來的token 裡面有沒有關鍵字。

這時候,就能看到我們第一次得到的lex.

有了lex之後,我們呼叫

mp_parse_tree_t parse_tree = mp_parse(lex, 0);
來做詞法分析。

原材料是lex. input kind, 由乙個叫parser 的機器來處理。

typedef struct _parser_t  parser_t;
很顯然,一開始,我們要對這台機器進行初始化。

parser.parse_error = parse_error_none;

parser.rule_stack_alloc = micropy_alloc_parse_rule_init;

parser.rule_stack_top = 0;

parser.rule_stack = m_new_maybe(rule_stack_t, parser.rule_stack_alloc);

parser.result_stack_alloc = micropy_alloc_parse_result_init;

parser.result_stack_top = 0;

parser.result_stack = m_new_maybe(mp_parse_node_t, parser.result_stack_alloc);

parser.lexer = lex;

parser.tree.chunk = null;

parser.cur_chunk = null;

parser.lexer  = lex ,相當於把原材料丟給它。

接下來去生成第乙個rule. 放到rule stack 裡面。

static void push_rule(parser_t *parser, size_t src_line, const rule_t *rule, size_t arg_i) 

if (parser->rule_stack_top >= parser->rule_stack_alloc)

parser->rule_stack = rs;

parser->rule_stack_alloc += micropy_alloc_parse_rule_inc;

}rule_stack_t *rs = &parser->rule_stack[parser->rule_stack_top++];

rs->src_line = src_line;

rs->rule_id = rule->rule_id;

rs->arg_i = arg_i;

}

此時 src_line 等於1, rule_id 等於0, arg_i 等於0.

簡答來說, parse 過程就是乙個for()迴圈裡面放乙個switch 。

rule->act & rule_act_kind_mask 第一次計算出來,為0x10, 所以落到 case rule_act_or:這一句。

選舉生成樹的過程

選舉生成樹的過程 1.選舉根網橋 2.選舉根埠 3.選舉指定埠 4.確定非指定埠 選舉根埠規則 比較路徑成本 從非根網橋埠到根網橋累計成本。如果非根網橋上有多個埠可以到達根網橋。哪個埠到達根網橋的成本最低,哪個埠就成為根埠。比較網橋id 比較埠途經的網橋id。哪個埠途經的網橋id最小,哪個埠就成為根...

Python 生成器語法

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中...

最小生成樹演示過程

下面展示一些函式需要用到的引數 define maxvex 100 define n 1000000000 typedef int edgetype typedef struct edge typedef struct vertex typedef struct mgraph 下面是程式部分函式 v...