<MainClass> ::= "class" <Identifier>↑<id_name1> @fillMemory↓<id_name1>↑<id_address> @fillTable↓<id_name1>,<id_address> @fillTree↓<id_name1> "{" "public" "static" "void" "main" "(" "String" "[" "]" <Identifier>↑<id_name2>,<id_belongsTo>=<id_name1>,<id_type>=StringArrayType @fillTable↓<id_name2>,<id_belongsTo> "{" <PrintStatement> "}" "}"
<ClassDeclaration> ::= "class" <Identifier>↑<id_name> @checkTable↓<id_name> @fillMemory↓<id_name1>↑<id_address> @fillTable↓<id_name>,<id_address> @fillTree↓<node_name>=<id_name> "{" ( VarDeclaration )* ( MethodDeclaration )* "}"
<ClassExtendsDeclaration> ::= "class" <Identifier>↑<id_name1> @checkTable↓<id_name1> "extends" <Identifier>↑<id_name2> @checkTree↓<id_name2> @fillMemory↓<id_name1>↑<id_address> @fillTable↓<id_name1>,<id_name2>,<id_address> @fillTree↓<child_name>=<id_name1>,<parent_name>=<id_name2> "{" ( VarDeclaration )* ( MethodDeclaration )* "}"
<VarDeclaration> ::= <Type>↑<id_type> <Idetifier>↑<id_name>,<id_belongsTo> “;” @checkTable↓<id_name>,<id_belongsTo> @fillMemory↓<id_name>↑<id_address> @fillTable↓<id_name>,<id_type>,<id_belongsTo>,<address>
<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType |<BooleanType>↑<id_type>=BooleanType |<IntegerType>↑<id_type>=IntegerType
<VarDeclaration> ::= <Type>↑<id_type>=ObjectType @checkTable↓<id_type> <Idetifier>↑<id_name>,<id_belongsTo> “;” @checkTable↓<id_name>,<id_belongsTo> @fillTable↓<id_name>,<id_type>,<id_belongsTo>
<MethodDeclaration> ::= "public" <Type>↑<id_type> <Identifier>↑<id_name>,<id_belongsTo> @checkTable↓<id_name>,<id_belongsTo> @fillMemory↓<id_name>↑<id_address> @fillTable↓<id_name>,<id_type>,<id_belongsTo>,<id_address> "(" ( <FormalParameterList> )? ")" "{" ( <VarDeclaration> )* ( <Statement> )* "return" <Expression>↑<exp_type>,<exp_value> @checkType↓<id_type>,<exp_type> ";" "}"
<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType |<BooleanType>↑<id_type>=BooleanType |<IntegerType>↑<id_type>=IntegerType
<FormalParameterList> ::= <FormalParameter> ( <FormalParameterRest> )*
<FormalParameter> ::= <Type>↑<id_type> <Identifier>↑<id_name>,<id_belongsTo> @checkTable↓<id_name>,<id_belongsTo> @fillTable↓<id_name>,<id_type>
<MethodDeclaration> ::= "public" <Type>↑<id_type>=ObjectType @checkTable↓<id_type> <Identifier>↑<id_name>,<id_belongsTo> @checkTable↓<id_name>,<id_belongsTo> @fillMemory↓<id_name>↑<id_address> @fillTable↓<id_name>,<id_type>,<id_belongsTo>,<id_address> "(" ( <FormalParameterList> )? ")" "{" ( <VarDeclaration> )* ( <Statement> )* "return" <Expression>↑<exp_type>,<exp_value> @checkType↓<id_type>,<exp_type> ";" "}"
<Type>↑<id_type> ::= <ArrayType>↑<id_type>=ArrayType |<BooleanType>↑<id_type>=BooleanType |<IntegerType>↑<id_type>=IntegerType
<FormalParameterList> ::= <FormalParameter> ( <FormalParameterRest> )*
<FormalParameter> ::= <Type>↑<id_type>=ObjectType @checkTable↓<id_type> <Identifier>↑<id_name>,<id_belongsTo> @checkTable↓<id_name>,<id_belongsTo> @fillMemory↓<id_name>↑<id_address> @fillTable↓<id_name>,<id_type>,<id_address>
<FormalParameterRest> ::= "," <FormalParameter>
<AssignmentStatement> ::= <Identifier>↑id_name @checkTable↓<id_name>↑<id_type> “=” <Expression>↑<exp_type>,<exp_value> “;” @checkType↓<id_type>,<exp_type> @generateCode↓<stmt_type>=stmt_assign,<extra_para>
<ArrayAssignmentStatement> ::= <Identifier>↑<id_name> @checkTable↓<id_name>↑<id_type> @checkType↓<id_type>,ArrayType "[" <Expression>↑<exp_type1>,<exp_value1> @checkType↓<exp_type1>,IntegerType "]" "=" <Expression>↑<exp_type2>,<exp_value2> @checkType↓<exp_type2>,IntegerType ";" @generateCode↓<stmt_type>=stmt_array_assign,<extra_para>
if语句(IfStatement)<IfStatement> := "if" "(" <Expression>↑<exp_type>,<exp_value> @checkType↓<exp_type>,BooleanType ")" <Statement> "else" <Statement> @generateCode↓<stmt_type>=stmt_if,<extra_para>
while语句(WhileStatemen)<WhileStatement> ::= "while" "(" <Expression>↑<exp_type>,<exp_value> @checkType↓<exp_type>,BooleanType ")" <Statement> @generateCode↓<stmt_type>=stmt_while,<extra_para>
<PrintStatement> ::= "System.out.println" "(" <Expression>↑<exp_type>,<exp_value> @checkType↓<exp_type>,IntegerType ")" ";" @generateCode↓<stmt_type>=stmt_print,<extra_para>
动作 | 作用 | @checkTable↓<id_name>,<id_level> | 检查标识符的合法性(遍历符号表) | @checkTable↓<class_name> | 检查类名是否已声明 | @checkTable↓<id_name>↑<id_type> | 检查变量是否已声明,若已声明返回变量类型 | @checkTable↓<id_type> | 检查类型是否已声明 | @fillTable↓<id_name1>,<id_address> | 将标识符插入符号表 | @fillTable↓<child_name>,<parent_name>,<id_address> | 将子类插入符号表,同时复制父类的方法和类变量至子类 | @fillTable↓<id_name>,<id_belongsTo> | 将标识符插入符号表 | @fillTable↓<id_name>,<id_sort>,<id_level>,<id_type> | 将标识符插入符号表 | @fillMemory↓<id_name>↑<id_address> | 登记内存,返回地址 | @generateCode↓<stmt_type>,<extra_para> | 生成伪代码 | @checkType↓<child_name>,<parent_name> | 检查类型合法性(遍历继承树、符号表) | @checkType↓<id_type>,<exp_type> | 检查变量类型与表达式类型是否匹配 | @checkTree↓<child_name>,<parent_name> | 检查child_name是否是parent_name的子类(遍历继承树) | @checkTree↓<class_name> | 检查child_name是否已存在于继承树内 | @fillTree↓<child_name>,<parent_name> | 将child_name插入继承树中parent_name下 | @fillTree↓<node_name> | 将node_name插入继承树中(父类为Object) |
属性 | 数据类型(针对Java语言) | 含义 | id_name | String | 标识符名称 | id_level | int | 标识符的层次结构 | id_belongsTo | String | 所属层次名称,(见附表) | id_address | int | 内存地址 | stmt_type | int | 操作类型(见附表) | class_name | String | 类名 | extra_para | Object | 附加参数 | child_name | String | |
|