簡體   English   中英

野牛和語法:重放解析堆棧

[英]bison and grammar: replaying the parse stack

自從畢業學習以來,我沒有以正式的方式搞亂構建語言或解析器,並且忘記了當時我所知道的大部分內容。 我現在有一個可能從這樣的事情中受益的項目,但我不確定如何處理以下情況。

假設在我要解析的語言中有一個令牌,表示在表達式中“生成一個隨機浮點數”。

exp: NUMBER
        {$$ = $1;}
    | NUMBER PLUS exp
        {$$ = $1 + $3;}
    | R PLUS exp
        {$$ = random() + $3;}
    ;

我還想要一個“列表”生成運算符,它將重新評估“exp”若干次。 也許喜歡:

listExp: NUMBER COLON exp
    {
        for (int i = 0; i < $1; i++) {
            print $3;
        }
    }
    ;

我看到的問題是,循環開始時“exp”已經減少了。 如果我有輸入

2 : R + 2

然后我認為隨機數將在解析“exp”時生成並添加2 - 假設結果為2.0055。 然后在列表表達式中我認為2.0055將被打印兩次。

有沒有辦法在評估之前標記“exp”,然后按列表循環計數的要求解析它多次? 想法是在每次評估中獲得不同的隨機數。

最好的辦法是在解析結束時構建一個AST並評估整個AST。 在線評估僅適用於非常簡單(即“類似計算器”)的項目。

您可以構建堆棧或三地址虛擬機的代碼,而不是AST。 這通常更有效,特別是如果您打算經常執行代碼,但AST構建起來要簡單得多,並且執行它是一次深度優先掃描。

根據您的語言設計,至少有5個不同的點,語言中的標記可以綁定到某個值。 他們是:

  1. 預處理器(如C #define)
  2. Lexer:識別令牌
  3. 解析器:識別令牌結構,輸出AST
  4. 語義分析:分析AST,分配類型和轉換等
  5. 代碼生成:直接輸出可執行代碼或執行代碼。

如果您有一個可以多次出現的令牌,並且您希望每次都為其分配不同的隨機值,那么第4階段就是這樣做的地方。 如果生成AST,請遍歷樹並分配值。 如果您直接進行代碼生成(或解釋器),那么就這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM