分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package symbols; import java.util.*; import lexer.*; import inter.*; public class Env { private Hashtable table; protected Env prev; public Env(Env n) { table = new Hashtable(); prev = n; } public void put(Token w, Id i) { table.put(w, i); } public Id get(Token w) { for( Env e = this; e != null; e = e.prev ) { Id found = (Id)(e.table.get(w)); if( found != null ) return found; } return null; } }

时间: 2023-05-31 14:01:28 浏览: 47
这个类定义了一个符号表,用于存储标识符和对应的符号。它主要有以下几个成员函数: 1. Env(Env n):构造函数,创建一个新的符号表,并将其前一个符号表设置为n。 2. put(Token w, Id i):将标识符i和对应的符号w插入到符号表中。 3. get(Token w):从符号表中查找并返回与符号w对应的标识符。它首先从当前符号表开始查找,如果找不到则继续在前一个符号表中查找,直到找到或遍历完所有符号表。 在编译器中,符号表是一个非常重要的数据结构,用于存储标识符和对应的符号,在语义分析和代码生成中都会用到。Env类提供了查找和插入标识符的方法,使得编译器能够方便地管理符号表。在编译器中,通常会创建多个符号表,用于存储不同作用域中的标识符,Env类的prev成员变量可以用于链接不同符号表之间的关系。
相关问题

分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package inter; import lexer.*; import symbols.*; public class Temp extends Expr { static int count = 0; int number = 0; public Temp(Type p) { super(Word.temp, p); number = ++count; } public String toString() { return "t" + number; } }

该源代码中只有一个类,即Temp类,其包名为inter。 该类有以下成员函数: 1. static int count = 0;:静态成员变量count,用于记录创建的Temp对象数量。 2. int number = 0;:成员变量number,用于记录当前Temp对象的编号。 3. public Temp(Type p):构造函数,调用父类Expr的构造函数,传入两个参数Word.temp和p,其中Word.temp表示该表达式为临时变量。 4. public String toString():将当前Temp对象转换为字符串,返回格式为"t" + number,即"t"加上该对象的编号。 该类没有其他成员函数。 该类的调用关系: 该类没有调用其他类的成员函数,也没有被其他类调用。

分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package symbols; import lexer.*; public class Array extends Type { public Type of; // array *of* type public int size = 1; // number of elements public Array(int sz, Type p) { super("[]", Tag.INDEX, sz*p.width); size = sz; of = p; } public String toString() { return "[" + size + "] " + of.toString(); } }

该源代码中只有一个类:Array。该类继承了Type类,并添加了两个成员变量:of和size。of表示数组的元素类型,size表示数组的大小。 该类有一个构造函数,接受两个参数:数组的大小和元素类型。构造函数调用父类Type的构造函数,并使用Tag.INDEX作为类型标记。同时,计算数组的总大小,即元素类型的大小乘以数组大小,并将结果传递给父类构造函数。 该类还有一个toString方法,用于将数组转换为字符串。该方法返回一个字符串,包含数组的大小和元素类型。 该类没有其他成员函数。 由于该类是最基础的数据类型之一,因此在其他类中经常会使用该类的实例。例如,在语法分析器中,当遇到数组类型的变量时,会创建一个Array实例来表示该变量的类型。在生成目标代码时,也需要使用该类的实例来计算数组的地址和偏移量。

相关推荐

分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package lexer; import java.io.; import java.util.; import symbols.; public class Lexer { public static int line = 1; char peek = ' '; Hashtable words = new Hashtable(); void reserve(Word w) { words.put(w.lexeme, w); } public Lexer() { reserve( new Word("if", Tag.IF) ); reserve( new Word("else", Tag.ELSE) ); reserve( new Word("while", Tag.WHILE) ); reserve( new Word("do", Tag.DO) ); reserve( new Word("break", Tag.BREAK) ); reserve( Word.True ); reserve( Word.False ); reserve( Type.Int ); reserve( Type.Char ); reserve( Type.Bool ); reserve( Type.Float ); } void readch() throws IOException { peek = (char)System.in.read(); } boolean readch(char c) throws IOException { readch(); if( peek != c ) return false; peek = ' '; return true; } public Token scan() throws IOException { for( ; ; readch() ) { if( peek == ' ' || peek == '\t' ) continue; else if( peek == '\n' ) line = line + 1; else break; } switch( peek ) { case '&': if( readch('&') ) return Word.and; else return new Token('&'); case '|': if( readch('|') ) return Word.or; else return new Token('|'); case '=': if( readch('=') ) return Word.eq; else return new Token('='); case '!': if( readch('=') ) return Word.ne; else return new Token('!'); case '<': if( readch('=') ) return Word.le; else return new Token('<'); case '>': if( readch('=') ) return Word.ge; else return new Token('>'); } if( Character.isDigit(peek) ) { int v = 0; do { v = 10v + Character.digit(peek, 10); readch(); } while( Character.isDigit(peek) ); if( peek != '.' ) return new Num(v); float x = v; float d = 10; for(;;) { readch(); if( ! Character.isDigit(peek) ) break; x = x + Character.digit(peek, 10) / d; d = d*10; } return new Real(x); } if( Character.isLetter(peek) ) { StringBuffer b = new StringBuffer(); do { b.append(peek); readch(); } while( Character.isLetterOrDigit(peek) ); String s = b.toString(); Word w = (Word)words.get(s); if( w != null ) return w; w = new Word(s, Tag.ID); words.put(s, w); return w; } Token tok = new Token(peek); peek = ' '; return tok; } }

最新推荐

recommend-type

智慧物流医药物流落地解决方案qytp.pptx

智慧物流医药物流落地解决方案qytp.pptx
recommend-type

JAVA物业管理系统设计与实现.zip

JAVA物业管理系统设计与实现
recommend-type

基于java的聊天系统的设计于实现.zip

基于java的聊天系统的设计于实现
recommend-type

Vue数字孪生可视化建模系统源码.zip

vueVue数字孪生可视化建模系统源码.zip vueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zip
recommend-type

基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip

基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。