编译原理课程作业。实现一个“程序设计语言子集”的编译系统,包括:词法分析、语法分析、语义分析(中间代码生成)、符号表、出错处理等。
- 输入:字符流
- 输出:token列表
- token共分为五类:字面量LITERAL,关键字KEYWORD,标识符IDENTIFIER,操作符OPERATOR,界符BOUNDS
- token内容:名称、类型、位置(行,列)、值
- 语法分析:LL(1)文法,自上而下分析
- 输入:token_list
- 输出:语法树
- LL(1)文法
- program -> statements
- statements -> {statements} | statement;staetments
- statement -> assign; | branch | loop | callstatement; | define; | returnstatement;
- assign -> id := expression
- expression0 -> literal | id | (expression) | id[expression]
- expression1 -> expression0 ++ | expression0 -- | expression0
- expression2 -> !expression1 | ++expression1 | --expression1 | expression1
- expression3 -> expression2 + expression2 | expression2 - expression2 | expression2
- expression4 -> expression3 < expression3 | expression3 > expression3 | expression3 < = expression3 | expression3 >= expression3 | expression3
- expression5 -> expression4 == expression4 | expression4 != expression4 | expression4
- expression6 -> expression5 && expression5 | expression5
- expression7 -> expression6 || expression6 | expression6,expression6 | expression6
- expression -> expression7
- branch -> if (expression) then {statements} else {statements} | if (expression) then {statements}
- loop -> do{statements}while(expression) | while(expression)do{statements}
- call -> call id()
- define0 -> ,id | $
- define -> type id define0
- type -> int | float | char | boolean
- returnstatement -> return expression
- 参考资料
- C++写的一个简单的语法分析器(分析C语言) http://blog.csdn.net/niuox/article/details/8216186
- 一个简单语法分析器的C语言实现 http://blog.csdn.net/rill_zhen/article/details/7731711
- 编译原理实习(应用预测分析法LL(1)实现语法分析)http://blog.csdn.net/zjsyhjh/article/details/27102121
- 输出:符号表,四元组
- 最后分析的结果,包括四元式,符号表,token列表可以放在一个类里面进行,方便调试
- 语言成分:
- (1) 数据类型:整型、实型、字符型、布尔型;
- (2) 简单变量;
- (3) 算术表达式(+、++、-、--、×);
- (4) 关系表达式(<、≤、=、≠、>、≥);
- (5) 布尔表达式(∧、∨、┐);
- (6) 语句:
a) 赋值语句(含多维数组元素引用);
b) 分支语句(if-then、if-then-else、case);
c) 循环语句(while-do、do-while);
d) 过程调用语句;
e) 定义语句等。
- 输入方式:文本文件(如:.txt)。
- 输出内容:
- (1) 如果输入串是合法的程序段,则输出相应中间代码、符号表等相关信息;
- (2) 如果输入串是非法的程序段,则指出错误位置及错误原因(如词法错、语法错、语义错等)。
- 输出方式:除直接在监视器上显示结果之外,还应将结果输出到文件中。
- lexical/grammar analysis of c++ (词法语法分析器)
- A single-pass, recursive decent LL(1) compiler written by hand for a made-up language.
- Pico-Language & Pictorial Illustrated Compiler Organization by Layer
- PL0_Plus_Compiler
- SimpleCompiler