属性翻译文法 G[S] 如下所示,该文法采用 bison 工具进行语法制导翻译,求句子 (3,(4,5)) 识别完毕后打印出来的结果。 S → A { p r i n t f ( "%d " , $1.num ) ; } A → ' ( ' L ' ) ' { $ $.num = $2.num + 1 ; } A → n { $$.num = y y t e x t [ 0 ] − ' 0 ' ; } L → L ' , ' A { $$.num = $1.num + $3.num ; } L → A { $$.num = $1.num − 1 ; }
时间: 2023-12-13 14:03:48 浏览: 46
根据该属性翻译文法 G[S],句子 (3,(4,5)) 的识别过程如下:
1. 将句子 (3,(4,5)) 作为输入,开始解析
2. 根据文法 G[S],首先推导出 S → A,即将 A 视为 S 的子节点进行处理
3. 推导出 A → ' ( ' L ' ) ',即将 L 视为 A 的子节点进行处理
4. 推导出 L → A,即将 A 视为 L 的子节点进行处理
5. 推导出 A → n,即将叶子节点 n 视为 A 的子节点进行处理,此时 $$.num 被赋值为 3
6. 回到步骤 4,又推导出 A → ' ( ' L ' ) ',即将叶子节点 (3) 和子节点 (4,5) 视为 A 的子节点进行处理,此时 $$.num 被赋值为 2
7. 回到步骤 2,S 的子节点 A 处理完毕,执行 printf("%d ", $1.num) 语句,输出 2
因此,句子 (3,(4,5)) 的识别结果为 2。
相关问题
已知文法,bison代码求文法计算器
由于您没有给出文法的具体定义,我将给出一个基本的文法计算器的Bison代码,您可以根据需要进行修改和扩展。
首先,我们需要定义文法中的终结符和非终结符。假设我们有以下文法规则:
```
expr -> term
expr -> expr + term
term -> factor
term -> term * factor
factor -> NUMBER
factor -> ( expr )
```
其中,`NUMBER`是一个整数常量。那么我们可以将其翻译成以下Bison代码:
```
%{
#include <stdio.h>
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%%
expr: term
| expr '+' term
| expr '-' term
;
term: factor
| term '*' factor
| term '/' factor
;
factor: NUMBER
| '(' expr ')'
;
%%
int yylex(void) {
int c;
do {
c = getchar();
} while (isspace(c));
if (isdigit(c)) {
int val = c - '0';
while (isdigit(c = getchar())) {
val = val * 10 + c - '0';
}
ungetc(c, stdin);
yylval = val;
return NUMBER;
}
return c;
}
int yyerror(const char *msg) {
fprintf(stderr, "error: %s\n", msg);
return 1;
}
int main(void) {
yyparse();
return 0;
}
```
在Bison代码中,我们使用`%token`指令定义终结符`NUMBER`,并使用`%left`指令定义运算符的优先级和结合性。在规则中,`expr`表示表达式,`term`表示项,`factor`表示因子,这些都是非终结符。规则中使用`|`表示可能的选择,使用`'+'`、`'-'`、`'*'`和`'/'`表示运算符。
在Bison代码中,我们还定义了`yylex()`函数,它从标准输入中读取输入,并返回识别到的终结符类型。在本例中,我们只需要识别整数常量。`yyerror()`函数用于处理语法错误,`main()`函数则调用`yyparse()`函数开始解析输入。
现在,我们可以将以上代码保存为`calc.y`,并使用以下命令编译它:
```
bison -d calc.y
gcc calc.tab.c -o calc
```
然后,我们就可以运行这个文法计算器了:
```
$ ./calc
1+2*3
7
(1+2)*3
9
```
以上是一个基本的文法计算器,您可以根据需要进行修改和扩展。
bison如何进行语法分析
Bison是一种自动生成语法分析器的工具,它可以根据给定的文法规则自动生成对应的语法分析器。Bison的语法分析过程大致如下:
1. 读入待分析的源代码,并将其转换为一个个的词法记号。
2. 根据给定的文法规则,将词法记号组合成一个个的语法结构。
3. 在语法结构中插入语义动作,以便对语法结构进行语义处理。
4. 生成语法分析树,将语法结构转换为语法分析树。
5. 根据语法分析树,判断源代码是否符合给定的语法规则。
Bison使用LALR(1)分析算法进行语法分析,该算法可以高效地处理大多数的上下文无关文法。在Bison中,用户需要提供一个语法规则文件,其中包含了文法规则和语义动作的定义。Bison会根据该文件自动生成对应的语法分析器代码。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)