2012-03-11 2 views
0

В этом случае: У меня есть список токенов, которые являются действительными токенами на языке программирования TI. Я пытаюсь написать программу, которая будет компилировать текст, который содержит действительные токены в программу TI-83/84, которая состоит из полностью шестнадцатеричных данных. Я знаю, как записывать данные в файл и как получить данные из файла. Мне нужно написать программу для поиска по программе и определения действительных токенов и сохранения порядка программы. Я уже думал о том, чтобы взять токен в качестве ключевого слова и искать в нем текст, но маркер, который был выбран первым, не всегда будет первым в тексте, поэтому порядок будет потерян.Java - Разборные жетоны TI-84 в шестнадцатеричном коде

Я написал свой собственный маркерного объекта, и я использую следующие переменные в моем парсер:

  • ArrayList метки - ArrayList объектов лексем (все действительные жетоны TI-BASIC)
  • DataInputStream дис - также текстовый файл
  • Строка данных - текстовые данные, которые программа извлекает из файла, используя метод LoadData (не проблема, так что не важно, как она работает)
  • DataOutputStream дос - .8xp файл должно быть записано до

Токен Класс:

public class Token { 

    private String tokenText; 
    int[] hexValue; 
    boolean isTwoByte; 

    /** 
    * The default constructor. 
    * Assigns empty values to all instance variables. 
    */ 
    public Token() { 
    tokenText = ""; 
    hexValue = new int[0]; 
    isTwoByte = false; 
    } 

    /** 
    * Constructs a Token with <tt>text</tt> text and an empty int[] for <tt>hexValue</tt> 
    * @param text the text to be assigned to the Token 
    */ 
    public Token(String text) { 
    tokenText = text; 
    hexValue = new int[0]; 
    isTwoByte = false; 
    } 

    /** 
    * Constructs a Token with an empty String for <tt>text</tt> and <tt>hexValue</tt> value 
    * This is a one-byte Token 
    * @param value the value to be assigned to the Token 
    */ 
    public Token(int value) { 
    tokenText = ""; 
    hexValue = new int[1]; 
    hexValue[0] = value; 
    isTwoByte = false; 
    } 

    /** 
    * Constructs a Token with an empty String for <tt>text</tt> and <tt>hexValue></tt> v1v2 
    * This is a two-byte Token 
    * @param v1 the first byte of the two-byte value that will be assigned to the Token 
    * @param v2 the second byte of the two-byte value 
    */ 
    public Token(int v1, int v2) { 
    tokenText = ""; 
    hexValue = new int[2]; 
    hexValue[0] = v1; hexValue[1] = v2; 
    isTwoByte = true;   
    } 

    /** 
    * Constructs a Token with <tt>text</tt> text and <tt>hexValue</tt> value 
    * This is a one-byte Token 
    * @param text the text to be assigned to the Token 
    * @param value the value to be assigned to the one-byte Token 
    */ 
    public Token(String text, int value) { 
    tokenText = text; 
    hexValue = new int[1]; 
    hexValue[0] = value; 
    isTwoByte = false; 
    } 

    /** 
    * Constructs a Token with tokenText <tt>text</tt> text and <tt>hexValue</tt> v1v2 
    * This is a two-byte Token 
    * @param text the text to be assigned to the Token 
    * @param v1 the first byte of the two-byte value that will be assigned to the Token 
    * @param v2 the second byte of the two-byte value 
    */ 
    public Token(String text, int v1, int v2) { 
    tokenText = text; 
    hexValue = new int[2]; 
    hexValue[0] = v1; hexValue[1] = v2; 
    isTwoByte = true; 
    } 

    /** 
    * Returns the text that is assigned to the particular Token 
    * @return the text that is assigned to the particular Token 
    */ 
    public String getText() { 
    return tokenText; 
    } 

    /** 
    * Returns the byte value of the Token 
    * @return the byte value of the Token 
    */ 
    public int[] getValue() { 
    return hexValue; 
    } 

    /** 
    * Returns <tt>true</tt> if the Token is a two-byte Token, and <tt>false</tt> otherwise 
    * @return <tt>true</tt> if the Token is a two-byte Token, and <tt>false</tt> otherwise 
    */ 
    public boolean isTwoByte() { 
    return isTwoByte; 
    } 

    /** 
    * Sets the tokenText text of the Token to the String passed it. 
    * @param text the new text to be assigned to the Token 
    */ 
    public void setText(String text) { 
    tokenText = text; 
    } 

    /** 
    * Sets the byte value of the Token to the integer passed it. This sets the isTwoByte variable to <tt>false</tt>. 
    * @param value the new byte value to be assigned to the Token 
    */ 
    public void setValue(int value) { 
    hexValue = new int[1]; 
    hexValue[0] = value; 
    isTwoByte = false; 
    } 

    /** 
    * Sets the byte value of the Token to the integers passed it. This sets the isTwoByte variable to <tt>true</tt>. 
    * @param v1 value of the first byte of the two-byte Token 
    * @param v2 value of the second byte 
    */ 
    public void setValue(int v1, int v2) { 
    hexValue = new int[2]; 
    hexValue[0] = v1; hexValue[1] = v2; 
    isTwoByte = true; 
    } 
} 

Я надеюсь, что кто-то сможет помочь мне с этим. Если вам нужна дополнительная информация, например, какой-либо другой код, это не будет проблемой, проект будет открытым исходным кодом. Заранее спасибо за любую помощь по этому поводу.

+1

Можете ли вы показать фрагмент того, как могут выглядеть входные данные, и каков будет результат для этого набора данных? Надеюсь, потребуется лишь несколько строк для каждого. –

+0

Входные данные хранятся в файле .txt в кодировке UTF-8 и выглядеть следующим образом: : TI-84 Prog "Hello World" -> Str1 Disp Str1: Стоп И окончательный вывод должен храниться в файл .8xp, который должен содержать следующие необработанные шестнадцатеричные данные (не включая заголовок): 3E 54 49 71 38 34 29 50 BBC2 BBBF BBB6 3F 2A 48 BBB4 BBBC BBBC BBBF 29 57 BBBF BBC2 BBBC BBB3 2A 04 AA00 3F DE AA00 3E D9 [:] = 3E [ "] = 2A [-] = 71 [] = 29 [->] = [DISP] = DE [Стоп] = D9 [Str1] = предопределенная переменная с токеновым значением AA00 прописные буквы совпадают с обычной кодировкой ASCII строчные буквы являются двухбайтовыми токенами, начинающимися с BBB0 – user1260475

+0

Прошу прощения за плохой формат информации выше, комментарии не позволят новые линии. Должна быть новая строка после «Prog» и после первой «Str1» – user1260475

ответ

0

Я не использовал его сам, но класс java.io.StreamTokenizer делает все, что вам нужно? Или просто StringTokenizer, если вы можете прочитать исходный файл целиком.

Поскольку вы вступаете в файл по порядку, вам не нужно беспокоиться о сохранении порядка.

+0

StreamTokenizer выглядит многообещающе. Я использую BufferedReader для получения данных String. Но я никогда не использовал StreamTokenizer, так как бы вы использовали его для поиска определенного токена из предварительно созданной базы данных? – user1260475

+0

Мне нужно анализировать исходный код линейно, если это помогает уточнить.В любом случае мне нужно отслеживать, где шестнадцатеричные значения для токена идут в программе. * Как я делаю это не очень важно. Спасибо за ваш вклад. – user1260475

+0

Этот вопрос (http://stackoverflow.com/q/672577/732379), как мы надеемся, будет иметь несколько мест для начала, когда вы пишете компилятор. Много ссылок в этом вопросе. – chooban

Смежные вопросы