先决条件——LL(1)解析表的构建,自顶向下解析器的分类
解析是确定起始符号是否可以导出程序的过程。如果解析成功,则该程序是有效程序,否则该程序无效。
通常有两种类型的解析器:
- 自上而下的解析器:
- 在这种解析技术中,我们将开始符号扩展到整个程序。
- 递归下降和 LL 解析器是自上而下的解析器。
- 自下而上的解析器:
- 在这种解析技术中,我们将整个程序简化为起始符号。
- Operator Precedence Parser、LR(0) Parser、SLR Parser、LALR Parser 和 CLR Parser 是自下而上的解析器。
递归下降解析器:
它是一种自顶向下的解析器。自顶向下的解析器从非终结符的 start 开始,从上到下构建解析树。预测解析器是递归下降解析器的一种特殊情况,不需要回溯。
仔细编写文法意味着消除左递归和左分解,得到的文法将是一个可以被递归下降解析器解析的文法。
例子:
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 |
**这里 e 是厄普西隆
对于递归下降解析器,我们将为每个变量编写一个程序。
Example:
Grammar: E --> i E'
E' --> + i E' | e
C
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'();
}//The second condition of E'
else if ( l == 'e' )
{
match('e');
}
return ();
}
// Match function
match(char t)
{
if (l == t) {
l = getchar();
}
else
printf("Error");
}