如何标记这个?

时间:2011-11-04 13:32:31

标签: lexical-analysis

我正在尝试手动编写一个标记器代码。我继续阅读可以成为令牌一部分的角色。例如,整数只能包含数字。因此,在下面的文字中,我一直在阅读字符,直到找到一个非数字字符。所以我得到123作为令牌。接下来我得到(作为标记,然后abc作为标识符。这很好,因为(是一个分隔符。

123(abc

但是,在下面的文本中,我得到123作为整数,然后abc作为标识符。但实际上这是无效的,因为它们之间没有分隔符。

123abc(

令牌器是否应检查分隔符并报告错误?如果是,应该返回什么标记,以及在找到无效标记后,标记生成器应该从哪里继续读取?

或者,tokenizer是否应该只返回123作为整数,abc作为标识符,让解析器检测错误?

4 个答案:

答案 0 :(得分:1)

通常,tokenizer(或lexer)不执行有效语法检查。

词法分析器的作用是将输入拆分为标记,然后可以通过parser将其转换为语法树。因此,执行此类检查通常是解析器的工作。

答案 1 :(得分:0)

您可以考虑生成令牌化程序或词法分析器。 FlexANTLR等工具应有所帮助。您也可以使用ANTLR或Bison

生成解析器

如果你坚持对你的词法分析器(以及你的解析器)进行手工编码,那么在实践中进行一些预测是非常有帮助的。例如,您可以逐行读取输入并在当前行内进行标记(可以检查接下来的几个字符)。

答案 2 :(得分:0)

这有点像灰色区域,但大多数手工编码的词法分析器只是进行标记化,让解析器决定标记流是否有意义。

答案 3 :(得分:0)

如果“123abc”是一个无效的令牌,那么你应该在发现它时立即处理它,因为它与定义令牌的方式直接相关,它们如何相互作用(这将是是勒克斯的工作)。这是一个拼写错误,而不是与语法相关的错误。

有多种方法可以解决这个问题:

  • 您可以中止解析并抛出一些异常,让调用者没有令牌或只是您在此之前成功解析的令牌。这将为您节省任何“恢复”逻辑,可能足以满足您的使用案例。虽然,如果您正在解析语法突出显示的内容,例如,这可能是不够的,因为您不希望所有剩余的代码看起来都未解析。

    示例:如果不需要处理格式错误的标记,只需吐出基本错误并退出,符合条件的XML解析器就可以将其用于致命错误。

  • 或者,您可以插入一个“错误”标记,其中包含有关错误性质的正确元数据,并跳到下一个有效标记。

    您可能需要在词法分析器中使用启发式方法来优雅地处理错误令牌,并找到在嵌套表达式中找到错误令牌时如何解释更多令牌(例如,您是否应该考虑表达式已结束?查找关闭令牌等等。)

    无论如何,这种方法将允许使用错误令牌来显示有关遇到的错误的位置和性质的精确信息(想想GUI中的内联错误报告)。