c语言语义,语义分析的C语言代码

之前写了12篇使用有限自动机(DFA)分析语法的文章,今天说一下语义分析。

怎么用C语言写语法分析3,基于有限自动机的表达式分析

怎么用C语言写语法分析

用C语言实现一个真正的词法分析器

语义分析,也是编译器前端的一个模块。

一般来说,它比语法分析要简单。

程序源码的各种复杂逻辑,在经过语法分析之后,就成了一棵抽象语法树(AST)。

生成这个语法树比较难,因为源代码里互相耦合的概念太多。

生成语法树之后,把树遍历一次,就可以完成语义分析。

不同的语句和运算符,构成了语法树的不同节点。不同的节点有不同的处理函数。在处理函数里检查类型是否一致、计算中间结果、化简常量表达式、添加类型的自动转换(type cast)。

之后,就可以生成三地址码了。从生成三地址码开始,已经是编译器的后端了。

615a88f4c4c45f82f376c7a6e96c13ec.png

如上图,是语法树的节点数据结构。

因为是多叉树,所以有个父节点的指针parent,子节点组成一个指针数组,由nodes和nb_nodes表示。

31行的scf_operator_t* op,表示节点的操作符。不管是语句还是运算符,一律看作一种操作符。

把所有的操作符组成一个大数组,就是支持的所有语义。

(把人能看懂的源码文本,终于变成了机器能处理的数据结构了)

f90bda74f5705187861abde8fb85f0ab.png

第1列,用一个整数表示操作符的类型。

第2列,是操作符的名字字符串。

第3列,是运算优先级。

小括号表示的表达式,优先级最高的,语句的优先级最低。先乘除,后加减。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言语义分析器的代码示例,它检查输入的算术表达式是否合法,并计算表达式的值: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_LEN 1000 char input[MAX_LEN]; int pos = 0; void error(char *msg) { fprintf(stderr, "%s\n", msg); exit(EXIT_FAILURE); } int expr(); int factor() { int result = 0; if (isdigit(input[pos])) { result = input[pos] - '0'; pos++; } else if (input[pos] == '(') { pos++; result = expr(); if (input[pos] == ')') { pos++; } else { error("Expected ')' in expression"); } } else { error("Invalid character in expression"); } return result; } int term() { int result = factor(); while (input[pos] == '*' || input[pos] == '/') { char op = input[pos]; pos++; int rhs = factor(); if (op == '*') { result *= rhs; } else { result /= rhs; } } return result; } int expr() { int result = term(); while (input[pos] == '+' || input[pos] == '-') { char op = input[pos]; pos++; int rhs = term(); if (op == '+') { result += rhs; } else { result -= rhs; } } return result; } int main() { printf("Enter an arithmetic expression: "); fgets(input, MAX_LEN, stdin); input[strcspn(input, "\n")] = '\0'; int result = expr(); if (input[pos] == '\0') { printf("Result: %d\n", result); } else { error("Invalid expression"); } return 0; } ``` 这段代码实现了一个简单的语义分析器,它检查输入的算术表达式是否符合语义规则,并计算表达式的值。在主函数中,首先读取用户输入,然后调用expr函数进行语义分析和计算。如果输入表达式合法,程序输出结果;否则输出错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值