编译原理scanner的java代码

问题描述

编译原理scanner的java代码
package lexer;

public class Token {

public final int tag;public Token(int t) {    tag = t;}public String toString() {    return """" + (char) tag;}

}

package lexer;

public class Tag {
public final static int AND = 256 BASIC = 257 BREAK = 258 DO = 259
ELSE = 260 EQ = 261 FALSE = 262 GE = 263 ID = 264 IF = 265
INDEX = 266 LE = 267 MINUS = 268 NE = 269 NUM = 270 OR = 271
REAL = 272 TEMP = 273 TRUE = 274 WHILE = 275;
}

package lexer;

public class Real extends Token {
public final float value;

public Real(float v) {    super(Tag.REAL);    value = v;}public String toString() {    return """" + value;}

}

package lexer;

public class Num extends Token {

public final int value;public Num(int v) {    super(Tag.NUM);    value = v;}public String toString() {    return """" + value;}

}

package lexer;

public class Word extends Token {
public String lexeme = """";

public Word(String s int tag) {    super(tag);    lexeme = s;}public String toString() {    return lexeme;}public static final Word and = new Word(""&&"" Tag.AND) or = new Word(""||""        Tag.OR) eq = new Word(""=="" Tag.EQ) ne = new Word(""!="" Tag.NE)        le = new Word(""<="" Tag.LE) ge = new Word("">="" Tag.GE)        minus = new Word(""minus"" Tag.MINUS) True = new Word(""true""                Tag.TRUE) False = new Word(""false"" Tag.FALSE)        temp = new Word(""t"" Tag.TEMP);

}

package lexer;

import java.io.IOException;
import java.util.Hashtable;

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);}public 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 += 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 = 10 * v + 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;}public void out() {    System.out.println(words.size());}public char getPeek() {    return peek;}public void setPeek(char peek) {    this.peek = peek;}

}

package main;

import java.io.IOException;
import java.util.Hashtable;

import lexer.Lexer;
import lexer.Token;

public class Main {
public static void main(String[] args) throws IOException {
Lexer lexer = new Lexer();
char c;
do {
Token token=lexer.scan();
switch (token.tag) {
case 270:
case 272:
System.out.println(""(NUM +token.toString()+"")"");
break;
case 264:
System.out.println(""(ID +token.toString()+"")"");
break;
case 256:
case 257:
case 258:
case 259:
case 260:
case 265:
case 274:
case 275:
System.out.println(""(KEY +token.toString()+"")"");
break;
case 13:
break;
default:
System.out.println(""(SYM +token.toString()+"")"");
break;
}

    } while (lexer.getPeek()!='n');}

}

怎么把上面从控制台输入的代码改成读取txt文件输入

解决方案

http://outofmemory.cn/code-snippet/2242/java-usage-BufferedReader-duqu-console-out

时间: 2024-11-05 14:53:28

编译原理scanner的java代码的相关文章

页面上有个textarea,在里面写java代码,然后如何动态编译执行这段java代码??

问题描述 页面上有个textarea,在里面写java代码,然后如何动态编译执行这段java代码?? 页面上有个textarea,在里面写java代码,然后如何动态编译执行这段java代码?? 解决方案 可以使用一些前端的模板引擎,java是编译的 解决方案二: ajax提交客户端输入的代码动态执行就行,看下面参考 ajax提交http://www.w3school.com.cn/jquery/ java中怎么执行字符串中的代码http://bbs.csdn.net/topics/3903563

从main函数进入执行编译java代码的方法与从servelet进入执行编译java代码的方法的区别

问题描述 在tomcat用main执行代码public static void main(String[] args) throws Exception {compile();}private synchronized static File compile() throws Exception {String[] args = new String[] { "-d", System.getProperty("user.dir") ,System.getProper

请求帮忙改代码-编译原理 编译器 java

问题描述 编译原理 编译器 java 词法分析,语法分析,语义分析生成中间代码,目标代码生成.输入c语言,输出汇编语言 解决方案 http://www.cnblogs.com/zhiyinjixu/articles/2251834.html 解决方案二: java编译原理Java编译原理(有感)java编译原理

java代码-java程序编译时候出现了一些问题

问题描述 java程序编译时候出现了一些问题 import java.util.Scanner;import java.util.Vector;public class testlq{ public static void main(String[] args){ byte m; Engineer engineers[]=new Engineer[10]; Engineer en=null; Vector vector=new Vector(); Scanner input=new Scanne

JAVA代码编译出错:找不到符号,求解答

问题描述 JAVA代码编译出错:找不到符号,求解答 源代码: package com.tarena.shoot; import java.util.Random; //Airplane----敌机既是飞行物, public class Airplane extends FlyingObject implements Enemy{ private int speed = 2;//敌机走步的步数 public Airplane(){ image = ShootGame.airplane; width

大家好,我刚开始学习java,为什么用scanner输入中文代码错误。

问题描述 大家好,我刚开始学习java,为什么用scanner输入中文代码错误. 大家好,我刚开始学习java,为什么用scanner输入中文代码错误.输入英文没有错误 解决方案 控制台输入会有个字符集编码,所以输出你的输入的时候需要进行对象编码 解决方案二: 好像可以设置字符集 你百度下 解决方案三: 设置字符集为UTF-8 解决方案四: windows->preferences-->general-->Context Text 把下属的 都设置为UTF-8 解决方案五: window

Java NIO原理图文分析及代码实现

[本文转载于Java NIO原理图文分析及代码实现] 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://weixiaolu.iteye.com/blog/

语法分析 编译-动态分析java代码结构

问题描述 动态分析java代码结构 首先非常感谢您来到这里, 我最近需要实现一个功能模块,这个模块的功能和ecplise的大纲视图类似. 用户在JTextArea中连续编码,程序需要动态分析用户当前正在编辑的类,通过一个树形结构来显示这个类的结构. 这个树形结构以类名为根,根下节点为类属性和方法,甚至内部类,当用户键入一个新的成员时,就在树中插入一个相应的节点. 我只是一个大三学生,这个任务对我来说实在有点困难,所以希望得到您的指点或者创意. 我接收到的想法有: 1.通过JDK中提供的API实现

MyEclipse 编译java代码报错,但是类文件上没有红叉提示

问题描述 MyEclipse 编译java代码报错,但是类文件上没有红叉提示 MyEclipse 在做项目时,java代码中编译错误之后,在类上没有红X显示,怎么回事呢? 解决方案 建议你将代码放在另外一台电脑上试试,看看是你的电脑环境的问题,还是统一存在的问题. 如果你的电脑的问题,估计别人是帮不上忙的.除了重装系统之外,估计也没有其它办法. 如果都存在这样的问题,可能是软件的 BUG.只能反馈给软件开发者来修改. 解决方案二: 可能是你还没有保存,你保存一下看看 解决方案三: clean一下