c语言语法树构建,语法树构建中的左递归

本文介绍了在构建C语言编译器时,如何处理表达式的左递归和优先级问题。通过示例展示了消除左递归的方法,以及使用ANTLR4简化语法定义。同时,给出了自定义实现的解析器代码,通过构建语法树来正确处理表达式,最后展示了解析后的语法树结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在尝试实现一个c语言编译器。其中涉及到语法树的构建。在解析表达式时,就需要考虑左递归和优先级问题。左递归,可以通过 百度百科 中的方式来消除左递归。但是由于表达式又存在优先级问题。所以消除过程十分繁琐。如下简单的计算器实现例子:

消除左递归,并添加优先级后,如下:

Num: [0-9]+

factor: Num | '(' expr3 ')'

term_tail: | ('*' expr1 | '/' expr1) term_tail

term: factor term

expr_tail: | ('+' expr2 | '-' expr2) expr_tail

expr: term expr_tail

可以看出,表达式比较复杂。如果再添加其他运算,如位移运算,逻辑运算,以及其他自定义运算。则实现起来及其复杂。

Antlr4

如果使用 antlr4则语法就会变得很简单。如下,有左递归的表达式在或中越靠前,优先级越高,factor 类则无影响。

Num: [0-9]+

expr:

Number

| '(' expr ')'

| expr ('*'|'/') expr

| expr ('+'|'-') expr

;

可以在vscode 中使用 ANTLR4 grammar syntax support 插件 测试该语法。

编写g4 文件

ctrl+s 保存以下,生成 .antlr文件夹

添加 .vscode/launch.json 写入如下内容

{

"version": "0.2.0",

"configurations": [

{

"name": "Debug ANTLR4 grammar - Test - Expr",

"type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值