先决条件– LL(1)解析表的构建,自上而下的解析器的分类
解析是确定开始符号是否可以派生程序的过程。如果解析成功,则该程序为有效程序,否则该程序无效。
通常有两种类型的解析器:
- 自上而下的解析器:
- 在这种解析技术中,我们将开始符号扩展到整个程序。
- 递归下降和LL解析器是自上而下的解析器。
- 自下而上的解析器:
- 在这种解析技术中,我们减少了整个程序的开始符号。
- 自下而上的解析器是运算符优先级解析器,LR(0)解析器,SLR解析器,LALR解析器和CLR解析器。
递归下降解析器:
它是一种自上而下的解析器。自上而下的解析器从开始非终端开始,从上到下构建解析树。预测分析器是递归下降分析器的特例,其中不需要反向跟踪。
通过仔细地编写语法意味着从中消除左递归和左分解,所得到的语法将是可以由递归下降解析器解析的语法。
例子:
Before removing left recursion | After removing left recursion |
---|---|
E –> E + T | T T –> T * F | F F –> ( E ) | id |
E –> T E’ E’ –> + T E’ | e T –> F T’ T’ –> * F T’ | e F –> ( E ) | id |
**这里是Epsilon
对于递归下降解析器,我们将为每个变量编写一个程序。
Example:
Grammar: E --> i E'
E' --> + i E' | e
int main()
{
// E is a start symbol.
E();
// if lookahead = $, it represents the end of the string
// Here l is lookahead.
if (l == '$')
printf("Parsing Successful");
}
// Definition of E, as per the given production
E()
{
if (l == 'i') {
match('i');
E'();
}
}
// Definition of E' as per the given production
E'()
{
if (l == '+') {
match('+');
match('i');
E'();
}
else
return ();
}
// Match function
match(char t)
{
if (l == t) {
l = getchar();
}
else
printf("Error");
}