【问题标题】:Lexer: Handling unterminated strings whilst tokenizingLexer:在标记化时处理未终止的字符串
【发布时间】:2016-12-04 17:10:45
【问题描述】:

我已经开始编写自己的词法分析器,但最终遇到了标记字符串的问题,因为它们有一个开始 (") 和一个结束 (") 字符与之关联。

有谁知道词法分析器可以处理并继续对未终止字符串进行词法分析的常用技术? 我认为ANTLR可以做到这一点,这是由ANTLR中的ATN处理的吗?

假设字符串必须在一行上终止,我可以看到这里有两个问题:

  1. 字符串终止发生在单独的行上 - 因此警告用户字符串只能放在一行上。
  2. 没有发生字符串终止,那么您何时知道有效的继续点在哪里?在新行之后使用下一个有效令牌的启发式。

char *mystring = "my string which is unterminated....
int id = 20;

【问题讨论】:

    标签: string parsing antlr lexical-analysis lexical


    【解决方案1】:

    如果您的语言禁止字符串文字中的换行符,那么仅在行尾终止字符串可能是可以接受的。与字符串文字在同一行上出现声明或关键字语句的可能性是合理的(并且没有理由通过试图弥补它来鼓励不良风格。)

    你可以跳过一个有用的右括号:

     printf("%s\n, line);
    

    但您可能已经制定了可以应对这种情况的恢复规则。

    如果字符串字面量可以包含换行符——并且有充分的证据表明这个特性通常是需要的——那么恢复就相当困难了,你可能会发现最简单的解决方案就是抛出一个语法错误,这很明显说明有问题的字符串从哪里开始。

    【讨论】:

    • 我在另一个答案中读到,错误处理最好交给解析器而不是词法分析器。您对此有何看法以及您将如何传递它,因为这里没有令牌...
    • @har:集中错误处理当然是有争议的,但词法错误总是会在扫描仪中检测到。我一般只打电话yyerror报错;在错误令牌的情况下(同样适用于错误数字),通常不需要做任何其他事情。当然,您可以返回一个“错误的文字”标记,然后在解析器中生成错误消息,并使用一个单元生成将 BAD_LITERAL 转换为 value(或任何您的基本非终端)并发出信号错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2019-04-01
    • 2015-12-09
    • 2012-04-26
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多