Scanner public Token nextToken()[ public Token matchLetter()( while stream.peek()=空格 do stream. consume() String text stream consume ()i if stream. peek()=eof the return <<EOF>>; while stream. peek()=字母,数字,下划线 switch(stream. peek()) text + stream consume() case,: stream consume(i return <<coMMA>>i case + stream consume (i if(text=关键字) if stream. peek( //+运算符 return<<关键字> stream consumei return <<PLUSPLUS>>i else else return <<PLUS>> return <<ID text>> case0′..9′: return matchDigit(); case a return matchLetter(i //text用 StringBuilder会更自然一点 case"′ return matchLiteral(i default: throw异常
Scanner public Token nextToken() { while stream.peek() = 空格 do stream.consume(); if stream.peek() = EOF the return <<EOF>>; switch(stream.peek()){ case ‘,’ : stream.consume(); return <<COMMA>>; case ‘+’ : stream.consume(); if stream.peek() = ‘+’ // ++运算符 stream.consume(); return <<PLUSPLUS>>; else return <<PLUS>>; case ‘0’..‘9’ : return matchDigit(); case ‘a’..‘z’ : return matchLetter(); case ‘”’ : return matchLiteral(); default : throw 异常 } } public Token matchLetter() { String text = stream.consume(); while stream.peek() = 字母,数字,下划线 { text += stream.consume(); } if (text = 关键字) return <<关键字>> else return <<ID, text>> } // text用StringBuilder会更自然一点
其他要点 单行注释 大嘴法 假设源代码中反复出现一段字符串常量—「 our score and seven years ago—是否需要压缩 string space 最高效: hashtable 最优雅: string. Intern( 最方便:不理他
其他要点 • 单行注释 • 大嘴法 • 假设源代码中反复出现一段字符串常量——Four score and seven years ago——是否需要压缩string space? • 最高效:hashtable • 最优雅:string.intern() • 最方便:不理他
语法分析 destiny ::ToO unpredictable unpredictable : = NAIVE SIMPIE ANGRY EXCITED
语法分析 destiny ::= TOO unpredictable unpredictable ::= NAIVE | SIMPLE | ANGRY | EXCITED
Context-Free grammars 非终结符—小写 语法分析树 终结符—T0ken,大写 exp∷:= exp op exp| I 0p∴=+ 推倒推导( derivation) exp exp exp → exp t exp x exi y +*X
Context-Free Grammars • 非终结符——小写 • 终结符——Token,大写 exp ::= exp op exp | ID op ::= + | - | * | / • 推倒推导(derivation) exp → exp + exp → exp + exp * exp → y + k * x • 语法分析树
语法——语句 stnt∴=b1 ock stmt var decl stmt expr stmt 工F(expr)stmt IF (expr) stmt ElSE stmt RETURN expri BREAK, CONTINUE WHILE (expr)stmt FOR( expri expr; expr) stmt
语法——语句 stmt ::= block_stmt | var_decl_stmt | expr_stmt | IF (expr) stmt | IF (expr) stmt ELSE stmt | RETURN expr; | BREAK; | CONTINUE; | WHILE (expr) stmt | FOR (expr; expr; expr) stmt