看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式:
其bnf正規化如下:
operator=」+」
operator=」-「
operator=」*」
operator=」/」
expression=<0,1,2,3,4,..,9>
expression= 「(」 operator expression expression 「)」
expression=「(」expression 「)」
#include #include struct expression
float result;
std::string error;
char* start;
};class lexer
;
#include "parser.h"
#include #include #include lexer::lexer(const std::string& str):cur(),size()
//獲取右邊的表示式
expression right = getexpression();
if (!right.error.empty())
switch (op) else
break;
default:
assert(false && "should never get here");
break;
}} else
}if (!match(")"))
} else
} return ret;
}expression lexer::getnumber()
++point;
ret.result = ret.result + ci;
} else
//多個數字
++cur;
getnum = true;
} else if (c == '-' && !getnum) else if (c == '.') else
} if (negative)
if (!getnum)
return ret;
}
#include #include #include "parser.h"
#pragma warning(disable:4996)
using namespace std;
int main(int argc,char* argv)
return 0;
}
測試:
(* (+ 1.003 2) (+ 3 -4) )
(/ (+ 5 6) (- b3 5) )
(+ 3 5 )
輸出:-3.003
發生錯誤:
位置: b3 5) )
資訊: 此處出現未知字元
8
改進 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
遞迴下降語法分析實驗
通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...