2016-08-19 38 views
4

I'm developing a programming language,我在處理條件語句時遇到了麻煩。下面是我的語言代碼:如何更改規則的解析順序?

x = 4 -> 
? 2 > 5 <? 
    x = 7 -> 
?> -> 
[o] <- x -> 

這裏的定義條件語句語法的特定部分:

post_condition_evaluation_block : post_condition_evaluation_block_opening_operator compound_statement post_condition_evaluation_block_closing_operator 
condition_statement : condition_specification_operator expression post_condition_evaluation_block 
        | condition_specification_operator expression post_condition_evaluation_block condition_extension 

沒有什麼實際錯誤的語法,代碼運行正常。問題是表達式2 > 5得到評估以下語句x = 7,所以打印的是7而不是4(這是錯誤的,因爲表達式計算結果爲false)。我處理這個問題計數的條件塊:

condition_blocks = {0: True} 
current_condition_block = 0 

然後當它涉及到的條件語句:

def p_condition_statement(p): 
    """condition_statement : condition_specification_operator expression post_condition_evaluation_block 
          | condition_specification_operator expression post_condition_evaluation_block condition_extension""" 
    global current_condition_block 
    current_condition_block += 1 
    condition_blocks[current_condition_block] = p[2] 
    print(condition_blocks) 

它添加了虛假的表達(P 2),它的值字典中對應的塊索引。問題是,當我做任務:

def p_assignment(p): 
    """assignment : identifier assignment_operator expression""" 
    if len(p) == 4 and condition_blocks[current_condition_block]: 
     if p[2] == '=': 
      identifiers[p[1]] = parse_object(p[3]) 
     elif p[2] == "+=": 
      identifiers[p[1]] += parse_object(p[3]) 
     elif p[2] == "-=": 
      identifiers[p[1]] -= parse_object(p[3]) 
     elif p[2] == "*=": 
      identifiers[p[1]] *= parse_object(p[3]) 
     elif p[2] == "/=": 
      identifiers[p[1]] /= parse_object(p[3]) 
     p[0] = (p[1], p[2], p[3]) 

,就會執行這個塊是默認的「亂塊範圍」之一。分配規則在表達式之前得到解析/處理表達式,這在我的腦海中毫無意義,因爲整個代碼應該從頭到尾進行處理。

我明顯沒有解析/ YACC的專家,這是我的第一次嘗試,我發現絕對沒有暗示該怎麼做in the docs。我不知道如何停止解析器,跳過解析器,改變解析順序...也許問題出在我的語法中,但我看不到如何改變解析順序。

回答

1

當產量是減少 - 也就是說,它的語義動作被執行 - 所有引用的非終端已經被減少。換句話說,兒童總是在父母面前被壓縮,這就是爲什麼yacc被稱爲自下而上的解析器。

實現更大靈活性的唯一可行的方法是在解析過程中構建AST,然後通過在AST上構建一個樹形目標來評估(或其他)完整的表達式。然後,您可以按照任何順序自由地走完整棵樹。

+0

哦,我現在明白了。那時我試圖做到這一點。非常感謝您解釋! –