lrparser() { if(syn==1) { scaner(); /*读下一个单词符号*/ yucu(); /*调用yucu()函数;*/ if (syn==6) { scaner(); if ((syn==0)&&(kk==0)) printf("success!\n"); } else { if(kk!=1) printf("the string haven't got a 'end'!\n"); kk=1; } } else { printf("haven't got a 'begin'!\n"); kk=1; } return;}每行代码注释
时间: 2024-03-19 11:42:15 浏览: 102
这段代码是一个LR语法分析器的函数,函数名为lrparser。
第1行:开始定义lrparser函数。
第2行:如果syn的值为1,则进入if语句。
第3行:调用scaner函数,读取下一个单词符号。
第4行:调用yucu函数。
第5-6行:如果读取的单词符号是6,则进入if语句。
第7行:再次调用scaner函数,读取下一个单词符号。
第8-10行:如果下一个单词符号是0,且kk的值为0,则输出"success!"。
第11-13行:否则,如果kk的值不为1,则输出"the string haven't got a 'end'!",并将kk的值赋为1。
第14-15行:否则,如果syn的值不为1,则输出"haven't got a 'begin'!",并将kk的值赋为1。
第16行:函数结束,并返回。
相关问题
yucu(){ statement(); /*调用函数statement();*/ while(syn==26) { scaner(); /*读下一个单词符号*/ if(syn!=6) statement(); /*调用函数statement();*/ } return;} statement() { if(syn==10) { scaner(); /*读下一个单词符号*/ if(syn==18) { scaner(); /*读下一个单词符号*/ expression(); /*调用函数statement();*/ } else { printf("the sing is wrong!\n"); kk=1;} } else { printf("wrong sentence!\n"); kk=1; } return;} 解释每行代码
这段代码是一段简单的程序代码,主要是两个函数yucu()和statement()。下面是每行代码的解释:
```
yucu(){ statement(); /*调用函数statement();*/
```
定义函数yucu,调用函数statement。
```
while(syn==26) { scaner(); /*读下一个单词符号*/
```
while循环,当syn等于26时,执行循环体。循环体内调用函数scaner读取下一个单词符号。
```
if(syn!=6) statement(); /*调用函数statement();*/
```
如果读取到的单词符号不是6,调用函数statement。
```
return;}
```
函数yucu结束,返回。
```
statement() { if(syn==10) { scaner(); /*读下一个单词符号*/
```
定义函数statement,如果读取到的单词符号是10,调用函数scaner读取下一个单词符号。
```
if(syn==18) { scaner(); /*读下一个单词符号*/ expression(); /*调用函数expression();*/
```
如果读取到的单词符号是18,调用函数scaner读取下一个单词符号,并调用函数expression。
```
else { printf("the sing is wrong!\n"); kk=1;} }
```
否则输出错误信息,将kk赋值为1。
```
else { printf("wrong sentence!\n"); kk=1; }
```
如果读取到的单词符号不是10,输出错误信息,将kk赋值为1。
```
return;}
```
函数statement结束,返回。
char prog[100],token[8],ch; //指定关键字 char *rwtab[6]={"begin","if","then","while","do","end"}; //种别码 搜索指针 整型常数 int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() {p=kk=0; printf("\nplease input a string (end with '#'): \n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; scaner(); lrparser(); getch();}解释每行代码
这段代码是一段简单的词法分析器和语法分析器的实现代码,主要包括全局变量的定义和函数的调用。下面是每行代码的解释:
```
char prog[100],token[8],ch; //指定关键字
```
定义了三个字符型变量prog、token、ch,其中prog用于存储输入的字符串,token用于存储单词符号,ch用于存储当前读取的字符。
```
char *rwtab[6]={"begin","if","then","while","do","end"}; //种别码
```
定义了一个字符串指针数组rwtab,用于存储关键字,包括"begin"、"if"、"then"、"while"、"do"、"end"。
```
搜索指针 整型常数 int syn,p,m,n,sum;
```
定义了四个整型变量,其中syn用于存储当前单词符号的种别码,p用于指示当前读取到的字符在prog中的位置,m、n、sum用于辅助计算整型常数。
```
int kk;
```
定义了一个整型变量kk,用于记录是否出现错误。
```
factor(); expression(); yucu(); term(); statement(); lrparser(); scaner();
```
这些代码行是函数调用语句,分别调用了factor()、expression()、yucu()、term()、statement()、lrparser()和scaner()函数。
```
main() {
p=kk=0; //初始化p和kk
printf("\nplease input a string (end with '#'): \n"); //输出提示信息
do {
scanf("%c",&ch); //从标准输入读取字符
prog[p++]=ch; //将读取的字符存入prog数组
}while(ch!='#'); //读取直到输入'#'字符为止
p=0; //将p重置为0
scaner(); //调用scaner()函数进行词法分析
lrparser(); //调用lrparser()函数进行语法分析
getch(); //暂停程序运行
}
```
主函数main()中,首先初始化p和kk,然后输出提示信息,读取输入的字符串并存储到prog数组中,调用scaner()函数进行词法分析,调用lrparser()函数进行语法分析,最后暂停程序运行。
阅读全文