L语言编译器的设计与实现之设计篇
1、任务:实现一个简单的编译程序,能够对指定程序设计语言进行编译。
编译器组成成分:
1.扫描器
该扫描器是一个子程序,其输入是源程序字符串,每调用一次输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设程序设计语言中,基本字不能用作一般标识符,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
2.语法分析器
以算法优先分析方法为例,设计一个算符优先语法分析程序。算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。当然,也可采用预测分析等方法设计语法分析器,具体方法自定。
3.语法制导翻译程序
采用语法制导翻译方法,实现算术表达式、赋值语句和基本控制语句等的翻译。本语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。
4.目标代码生成器
将程序设计语言的中间代码程序翻译为目标代码程序,其输入是四元式序列,输出是一个汇编代码文件。
每个环节可作为一个独立的实践课题,分别编程调试,然后再连接在一起总调,从而实现一个完整的编译器。
2、L语言定义
程序定义:
〈程序〉→ program〈标识符〉〈程序体〉.
〈程序体〉→〈变量说明〉〈复合句〉
变量定义:
〈变量说明〉→ var〈变量定义〉|ε
〈变量定义〉→〈标识符表〉:〈类型〉;|〈标识符表〉:〈类型〉;〈变量定义〉
〈标识符表〉→〈标识符〉,〈标识符表〉|〈标识符〉
语句定义:
〈复合句〉→ begin〈语句表〉end
〈语句表〉→〈执行句〉;〈语句表〉|〈执行句〉 (执行句:while , If ,赋值语句)
〈执行句〉→〈简单句〉|〈结构句〉
〈简单句〉→〈赋值句〉
〈赋值句〉→〈变量〉:=〈表达式〉
〈变量〉→〈标识符〉
〈结构句〉→〈复合句〉|〈if句〉|〈WHILE句〉
〈if句〉→ if〈布尔表达式〉then〈执行句〉| if〈布尔表达式〉then〈执行句〉else〈执行句〉
〈while句〉→ while〈布尔表达式〉do〈执行句〉
表达式定义:
〈表达式〉→〈算术表达式〉|〈布尔表达式〉
〈算术表达式〉→〈项〉+〈算术表达式〉|〈项〉-〈算术表达式〉|〈项〉
〈项〉→〈项〉*〈因子〉|〈项〉/〈因子〉|〈因子〉
〈因子〉→〈算术量〉
〈算术量〉→〈标识符〉|〈整数〉|〈实数〉
〈布尔表达式〉→〈布尔项〉or〈布尔表达式〉|〈布尔项〉
〈布尔项〉→〈布尔因子〉and〈布尔项〉|〈布尔因子〉
〈布尔因子〉→ not〈布尔因子〉|〈布尔量〉
〈布尔量〉→〈布尔常数〉|〈标识符〉|(〈布尔表达式〉)|〈关系表达式〉
〈关系表达式〉→〈标识符〉〈关系运算符〉〈标识符〉
〈关系运算符〉→〈|〈= |=|〉=|〉|〈〉
类型定义:
〈类型名〉→ integer|bool | real
单词定义:
〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉
〈整数〉→〈数字〉|〈整数〉〈数字〉
〈实数〉→〈整数〉.|〈实数〉〈数字〉
〈布尔常数〉→ true|false
字符定义:
〈字母〉→ A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T│
U│V│W│X│Y│Z│a│b│c│d│e│f│g│h│i│j│k│l│m│n│o│
p│q│r│s│t│u│v│w│x│y│z
〈数字〉→ 0│1│2│3│4│5│6│7│8│9