直接上**,語法樹在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...