带十进制数字的词法分析器

时间:2015-03-15 05:24:49

标签: java regex text-parsing lexical-analysis

我正在尝试编写一个非常基本的文本处理器。目标是通过char读取文件char并确定它是什么类型的令牌。基本上我所做的是将所有字符加载到一个队列中并使用peek()和read()检查顶部元素是否(对于此部分)是一个数字,如果它将它附加到一个字符串将用作不同符号的哈希映射中的键。

by issue是以下方法。当peek()看到一个数字时,char会与队列一起传递给此方法以进行进一步处理。我遇到的问题是,当我开始构建数字(作为一个字符串)时,我使用带有正则表达式的java matches()来匹配0-9中的数字,否则该方法应该停止构建字符串并返回lexeme对象。

但这就是我的问题所在。例如,在读取4然后是2之后,它会继续添加队列中的所有字符,直到它为空 - 并将其全部集中在数字下,而不是创建新的令牌。

任何指导都将不胜感激。我有点困在这里。

我的意见:     ABC:= 42;     EOF

代码:

 /**
 *
 * @param - cl ADT containing each character as read from a file
 * @param - c current head of the ADT
 * @return - lexeme 3 tuple that holds the keyword "number", the token read in, and the value 19
 */
public static Lexeme isNumber(CharQue<Character> cl, char c){
    Lexeme lexeme = new Lexeme();

    while (String.valueOf(c).matches("[0-9]") && (cl.hasNext())) {

        if (String.valueOf(c).matches("[0-9]")) {
            lexeme.buildKey(cl.read());

        } else if(c =='.'){
            lexeme.buildKey(c);
            c = cl.peek();
            break;
        }
    }

    while(String.valueOf(c).matches("[0-9]") && (cl.hasNext())){



        c = cl.read();
        if (String.valueOf(c).matches("[0-9]")) {
            lexeme.buildKey(c);
        }
    }

    lexeme.setTokken(lexeme.getKey());
    lexeme.setKey(NUMBER);

    return lexeme;
}

结果:在3元组中(关键字,读入的内容,分配给该关键字的值)。     (关键字,令牌读取,值)     ------------------------     (标识符,ABC,28)     (SPACE ,, 26)     (:= ,, 24)     (SPACE ,, 26)     (数字,42; EOF,29)

期望的输出:     (关键字,标记,价值)


(identifier, ABC, 28)
(SPACE, , 26)
(:=, , 24)
(SPACE, , 26)
(number, 42, 29)
( ;,  , 25)
(EOF, , 31)

1 个答案:

答案 0 :(得分:0)

在你耗尽所有输入之前,我不认为你正在退出第一个循环。 c永远不会更新(else if中除外,它永远不会被调用)。在您的计划结束时,c仍然等于'4'

作为解决方案的一般途径,您应该检查peek()的值是否为可接受的值。这样,如果是,则拨打cl.read(),如果不是,则表示您的号码已结束。