Lexer:在标记化时处理未终止的字符串

时间:2016-12-04 17:10:46

标签: string parsing antlr lexical-analysis lexical

我已经开始编写自己的词法分析器并最终出现了令人信服的字符串问题,因为它们有一个与之关联的start(“)和end(”)字符。

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

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

  1. 字符串终止发生在单独的行上 - 因此警告用户字符串只能放在一行上。
  2. 字符串终止没有发生,那么你什么时候知道要继续的有效点是?在新行之后使用下一个有效令牌的启发式。
  3. alter table amizade constraint chk_amizade_idperfilA_idperfilB
        check (idperfilA < idperfilB);
    
    alter table amizade constraint unq_amizade_idperfilA_idperfilB
        unique (idperfilA, idperilB);
    

1 个答案:

答案 0 :(得分:1)

如果您的语言禁止字符串文字中的换行符,那么只需终止该行末尾的字符串即可。在与字符串文字相同的行上存在声明或关键字声明是不太可能的(并且没有理由通过尝试补偿它来鼓励不良风格。)

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

 printf("%s\n, line);

但您可能已制定了可以应对的恢复规则。

如果字符串文字可以包含换行符 - 并且有足够的证据表明通常需要此功能 - 那么恢复就相当困难了,您可能会发现最简单的解决方案就是抛出一个语法错误说明违规字符串的开始状态。

相关问题