【问题标题】:Catching the error and continue back to the calling function捕获错误并继续返回调用函数
【发布时间】:2018-02-02 17:51:51
【问题描述】:

我正在 flex/lex 工具中使用 decaf 语言构建扫描仪/词法分析器。

为了检查标识符,我实现了正则表达式id [A-Za-z][A-Za-z0-9_]*

{id} { matchedID(); return T_Identifier; }

我也喜欢检查错误的标识符,所以我写了一个方法来处理它:

    * Checking ID validness */
static void matchedID()
{
  strncpy(yylval.identifier,yytext,MaxIdentLen);
  if (yyleng > MaxIdentLen)
  {
    ReportError::LongIdentifier(&yylloc,yytext);
    return;
  }
}

现在,当我在包含以下内容的 test_file 上运行扫描仪时:

vari.able, 3variable, variable/123, var-123, variable_whose_name_is_much_too_long

扫描器逃避检查所有变量并报告有关最后一个长变量的错误(decaf var max_size_is 31,因此它会相应地截断它)。 如果我取出具有长名称的变量,扫描仪会完美地扫描文件的其余部分! 谁能告诉我如何修复它,所以当扫描仪发现一个长变量并报告错误时,它还应该扫描文件中的其他语句?

【问题讨论】:

  • @ctwheels 感谢您的建议,但我的主要问题是程序在发现错误后没有读取整个文件!
  • 此代码中似乎没有中止扫描。答案似乎取决于您没有向我们展示的代码。
  • @Beta 虽然我的问题现在已经解决了,但是让我用缺少的部分更新问题:)
  • @rici 谢谢,不知道这一点。我将删除我的评论以防止进一步混淆

标签: c++ c regex flex-lexer lex


【解决方案1】:

所以我注意到不知何故扫描仪脚本没有与我的服务器同步,并且我所做的更改仅在客户端本地进行,一旦服务器开始与客户端文件同步,一切都开始恢复正常。

我想删除我的问题,但后来我想其他人将来可能会遇到同样的问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多