文件名称:c-minus词法分析器
文件大小:9KB
文件格式:CPP
更新时间:2023-05-19 04:27:19
编译原理实验
C-Minus 的词法规则 (1)关键字: if else int return void while (2)专用符号: + - * / < <= > >= == ~= = ; , ( ) [ ] { } /* */ (3)其他标记为 ID 和 NUM ,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 (4)空格由空白、换行符、制表符组成。 (5)注释由 /*...*/ 围起来,不能嵌套。 C-Minus 的语法规则 C-Minus 的 BNF 语法如下: 1. program -> declaration_list 2. declaration_list -> declaration_list declaration | declaration 3. declaration -> var_declaration | fun_declaration 4. var_declaration -> type_specifier ID; | type_specifier ID [ NUM ]; 5. type_specifier -> int | void 6. fun_declaration -> type_specifier ID ( params ) compound_stmt 7. params -> param_list | void 8. param_list -> param_list , param | param 9. param -> type_specifier ID | type_specifier ID [ ] 10. compound_stmt -> { local_declarations statement_list } 11. local_declarations -> local_declarations var_declaration | empty 12. statement_list -> statement_list statement | empty 13. statement -> expression_stmt | compound_stmt | selection_stmt | iteration_stmt | return_stmt 14. expression_stmt -> expression ; | ; 15. selection_stmt -> if ( expression ) statement | if ( expression ) statement else statement 16. iteration_stmt -> while ( expression ) statement 17. return_stmt -> return | return expression 18. expression -> var = expression | simple_expression 19. var -> ID | ID [ expression ] 20. simple_expression -> additive_expression relop additive_expression | additive_expression 21. relop -> <= | < | > | >= | == | ~= 22. additive_expression -> additive_expression addop term | term 23. addop -> + | - 24. term -> term mulop factor | factor 25. mulop -> * | / 26. factor -> ( expression ) | var | call | NUM 27. call -> ID ( args ) 28. args -> arg_list | empty 29. arg8list -> arg_list , expression | expression 对以上每条文法规则,给出了相关语义的简短解释。 1. program -> declaration_list 2. declaration_list -> declaration_list declaration | declaration 3. declaration -> var_declaration | fun_declaration 程序由声明的列表(或序列)组成,声明可以是函数或变量声明,顺序是任意的。至少必须有一个声明。接下来是语义限制(这些在C中不会出现)。所有的变量和函数在使用前必须声明(这避免了向后b a c k p a t c h i n g引用)。程序中最后的声明必须是一个函数声明,名字为m a i n。注意,C-缺乏原型,因此声明和定义之间没有区别(像C一样)。 4. var_declaration -> type_specifier ID; | type_specifier ID [ NUM ]; 5. type_specifier -> INT | VOID 变量声明或者声明了简单的整数类型变量,或者是基类型为整数的数组变量,索引范围从0到N UM -1。注意,在C-中仅有的基本类型是整型和空类型。在一个变量声明中,只能使用类型指示符i n t。 v o i d用于函数声明(参见下面)。也要注意,每个声明只能声明一个变量。 6. fun_declaration -> type_specifier ID ( params ) compound_stmt 7. params -> param_list | VOID 8. param_list -> param_list , param | param 9. param -> type_specifier ID | type_specifier ID [ ] 函数声明由返回类型指示符、标识符以及在圆括号内的用逗号分开的参数列表组成,后面跟着一个复合语句,是函数的代码。如果函数的返回类型是v o i d,那么函数不返回任何值(即是一个过程)。函数的参数可以是v o i d (即没有参数),或者一列描述函数的参数。参数后面跟着方括号是数组参数,其大小是可变的。简单的整型参数由值传递。数组参数由引用来传递(也就是指针),在调用时必须通过数组变量来匹配。注意,类型“函数”没有参数。一个函数参数的作用域等于函数声明的复合语句,函数的每次请求都有一个独立的参数集。函数可以是递归的(对于使用声明允许的范围)。 10. compound_stmt -> { local_declarations statement_list } 复合语句由用花括号围起来的一组声明和语句组成。复合语句通过用给定的顺序执行语句序列来执行。局部声明的作用域等于复合语句的语句列表,并代替任何全局声明。 11. local_declarations -> local_declarations var_declaration | empty 12. statement_list -> statement_list statement | empty 注意声明和语句列表都可以是空的(非终结符e m p t y表示空字符串,有时写作ε。) 13. statement -> expression_stmt | compound_stmt | selection_stmt | iteration_stmt | return_stmt 14. expression_stmt -> expression ; | ; 表达式语句有一个可选的且后面跟着分号的表达式。这样的表达式通常求出它们一方的结果。因此,这个语句用于赋值和函数调用。 15. selection_stmt -> if ( expression ) statement | if ( expression ) statement else statement i f语句有通常的语义:表达式进行计算;非0值引起第一条语句的执行; 0值引起第二条语句的执行,如果它存在的话。这个规则导致了典型的悬挂e l s e二义性,可以用一种标准的方法解决:e l s e部分通常作为当前i f的一个子结构立即分析(“最近嵌套”非二义性规则)。 16. iteration_stmt -> while ( expression ) statement w h i l e语句是C-中唯一的重复语句。它重复执行表达式,并且如果表达式的求值为非0,则执行语句,当表达式的值为0时结束。 17. return_stmt -> return | return expression 返回语句可以返回一个值也可无值返回。函数没有说明为v o i d就必须返回一个值。函数声明为v o i d就没有返回值。r e t u r n引起控制返回调用者(如果它在m a i n中,则程序结束)。 18. expression -> var = expression | simple_expression 19. var -> ID | ID [ expression ] 表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值有通常的存储语义:找到由v a r表示的变量的地址,然后由赋值符右边的子表达式进行求值,子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。v a r是简单的(整型)变量或下标数组变量。负的下标将引起程序停止(与C不同)。然而,不进行下标越界检查。v a r表示C-比C的进一步限制。在C中赋值的目标必须是左值(l - v a l u e),左值是可以由许多操作获得的地址。在C-中唯一的左值是由v a r语法给定的,因此这个种类按照句法进行检查,代替像C中那样的类型检查。故在C-中指针运算是禁止的。 20. simple_expression -> additive_expression relop additive_expression | additive_expression 21. relop -> <= | < | > | >= | == | ~= 简单表达式由无结合的关系操作符组成(即无括号的表达式仅有一个关系操作符)。简单表达式在它不包含关系操作符时,其值是加法表达式的值,或者如果关系算式求值为t u r e,其值为1,求值为f a l s e时值为0。 22. additive_expression -> additive_expression addop term | term 23. addop -> + | - 24. term -> term mulop factor | factor 25. mulop -> * | / 加法表达式和项表示了算术操作符的结合性和优先级。符号表示整数除;即任何余数都被截去。 26. factor -> ( expression ) | var | call | NUM 因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个N U M,其值由扫描器计算。数组变量必须是下标变量,除非表达式由单个ID 组成,并且以数组为参数在函数调用中使用(如下所示)。 27. call -> ID ( args )