[英]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個不同的點,語言中的標記可以綁定到某個值。 他們是:
如果您有一個可以多次出現的令牌,並且您希望每次都為其分配不同的隨機值,那么第4階段就是這樣做的地方。 如果生成AST,請遍歷樹並分配值。 如果您直接進行代碼生成(或解釋器),那么就這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.