分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系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; } }
时间: 2023-05-28 15:07:57 浏览: 165
1. Lexer类
该类是词法分析器的实现类,其中的成员函数和作用如下:
1.1 reserve(Word w)
将单词w添加到哈希表words中,其中w包含单词的词素和词法类型。
1.2 Lexer()
构造函数,初始化保留字和类型的单词,将它们添加到哈希表words中。
1.3 readch()
读取下一个字符,并将其保存到peek中。
1.4 boolean readch(char c)
读取下一个字符,如果该字符与参数c相同,则返回true,否则返回false。
1.5 scan()
词法分析函数,识别输入中的单词并返回对应的Token。该函数使用一个无限循环,通过逐个读取字符来识别单词。在识别过程中,忽略空格和制表符,并处理换行符使行号加1。
2. Word类
该类表示一个单词,其中的成员函数和作用如下:
2.1 Word(String s, int tag)
构造函数,初始化单词的词素和词法类型。
2.2 toString()
将单词转换为字符串。
3. Type类
该类表示一个类型,其中的成员函数和作用如下:
3.1 Type(String s, int tag, int width)
构造函数,初始化类型的名称、词法类型和占用字节数。
3.2 boolean numeric()
判断该类型是否为数字类型。
4. Num类
该类表示一个数字,其中的成员函数和作用如下:
4.1 Num(int v)
构造函数,初始化数字的值。
5. Real类
该类表示一个实数,其中的成员函数和作用如下:
5.1 Real(float v)
构造函数,初始化实数的值。
6. Token类
该类表示一个词法单元,其中的成员函数和作用如下:
6.1 Token(int t)
构造函数,初始化词法单元的类型。
6.2 String toString()
将词法单元转换为字符串。
7. Tag类
该类表示一个词法类型的枚举,其中包含了所有的词法类型。
在源代码中,Lexer类是程序的入口,它通过调用其他类的方法来实现词法分析的功能。具体来说,Lexer类中的scan()方法调用了其他类的构造函数和方法,以识别输入中的单词并生成对应的Token。其中,Word、Type、Num、Real、Token和Tag类是用于表示单词、类型、数字、实数、词法单元和词法类型的类。这些类之间相互独立,没有直接的调用关系,它们只是在Lexer类中被用来表示单词、类型等信息。
阅读全文