编译原理之后缀表达式生成与计算
2016-06-01 21:23
441 查看
编译原理之后缀表达式生成与计算
文法参照上一篇编译原理之消除算术表达式文法的左递归。将算数表达式解析为后缀表达式是不少脚本语言的运行时的计算方案。
根据原文法:
expr -> expr + term | expr - term | term term -> term * factor | term / factor | factor factor -> ( expr ) | number | id
我们先罗列出要实现的函数:
class Parser { public: void expr(LexerStream* lexers) { } void term(LexerStream* lexers) { } void factor(LexerStream* lexers) { } };
其中的
LexerStream为词素序列流。
再根据消除左递归的文法实现递归算法:
expr -> term trest trest -> + term | - term | ε term -> factor frest frest -> * factor | / factor | ε factor -> NUMBER | ( expr )
先看未消除左递归的
expr产生式和消除左递归
expr和
trest的产生式。原
expr产生式本身是左递归的,所以在递归下降算法中是对应到一个内部循环。
所以先给出
expr的实现:
void expr(LexerStream* lexers) { term(lexers); while(lexers->current() == "+" || lexers->current() == "-") { string op = lexers->current(); lexers->next(); term(lexers); cout << op; // PUSH } }
其他产生式类似:
void term(LexerStream* lexers) { factor(lexers); while(lexers->current() == "*" || lexers->current() == "/") { string op = lexers->current(); lexers->next(); factor(lexers); cout << op; // PUSH } } void factor(LexerStream* lexers) { string current = lexers->current(); if(current == "(") { lexers->next(); expr(lexers); lexers->next(); string e = lexers->current(); if(e != ")") { cout << "lost `(" << endl; } } else { cout << current; // PUSH lexers->next(); } }
详细代码前往 LearnCompilers/HLL/calculator001 下载。
相关文章推荐
- 图解后缀表达式的计算过程
- 接触后缀表达式(逆波兰表示法)
- 前缀表达式,中缀表达式,后缀表达式转化和计算
- 中缀表达式与后缀表达式
- 实现一个简单的计算器
- NOP(N) NOP_##N
- 编译器是如何工作的?(转)
- 写给想学java的朋友!
- 学java的必看!
- java中的加密!
- java中的使用类!
- leetcode题目--Evaluate Reverse Polish Notation 答案
- LEX/FLEX词法分析器
- 如何模仿人的学习模式来教计算机程序解数学题?
- 上下文无关文法1
- 上下文无关文法2
- [python]将中缀表达式(infix)转换为后缀表达式(postfix)
- 编译原理——词法分析器
- 编译原理预习笔记------名词理解
- Simple scanner of c