【问题标题】:Lexical analyzer with decimal numbers带十进制数的词法分析器
【发布时间】:2015-03-15 05:24:48
【问题描述】:

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

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

但这就是我的问题所在。例如,在它读取 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) (空间, , 26) (:=, , 24) (空间, , 26) (数字,42;EOF,29)

期望的输出: (关键字、令牌、值)


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

【问题讨论】:

  • 你能添加你期望的输出吗?
  • 另外,关于cl 中的内容的更多信息会很好。整行应该在其中还是我们应该只分析一个标记?
  • 你不需要队列就可以看到下一个字符:这太过分了,而且它掩盖了你需要做的事情,这很简单:如果下一个字符是数字,则累积它,以及以下所有也是数字的字符。如果你停在一个点上,也要累积它,以及后面的所有数字。大约有六行代码。
  • 这就是整个混乱的开始。我正在使用 FileReader 对象一次读取一个字符,但我总是向多个读取一个字符。我想要一种方法来偷看()。

标签: java regex text-parsing lexical-analysis


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 2021-06-25
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多