【问题标题】:yacc error handling for missing left parenthesis缺少左括号的 yacc 错误处理
【发布时间】:2015-09-17 13:29:58
【问题描述】:

我已经编写了一个 yacc 文件。 当前错误函数如下所示:

  void yyerror(char *s) {
       fprintf(stderr, "line %d: %s\n", yylineno, s);
   }

现在在给它输入的同时, 如果缺少左括号,则会给出简单的“语法”错误。

  1. 您能否建议,我如何针对这些类型的错误制作自定义错误消息?

  2. 即使出现此错误,我该如何进一步处理?

非常感谢您的建议..

【问题讨论】:

  • 您确定这些行中显示了错误?
  • 'stderr' 和 'yylineno' 是全局变量吗?
  • @ameyCU : 这是我在“yacc 代码”中使用的错误函数。
  • @ameyCU :例如,如果我输入为: A = ((B),(C)) 这是正确的输入。但是当我给 A = (B),(C)) 这是错误的,我的代码说语法错误是正确的。但我想自定义该消息,让我们说 'Left parenthesis is missing' 。如何在'yacc'中做这些事情,请您赐教。非常感谢您的回复。
  • @pistachiobk : 'stderr' 是全局变量,'yylineno' 是当前行号,在输入 'yacc' 代码后会发生错误。

标签: c bison yacc flex-lexer lex


【解决方案1】:

你不能。至少不简单。当当前状态和下一个标记不产生解析的合法延续时,就会出现语法错误。它可能很简单,因为下一个标记必须是 '('',但在这种情况下,您的语言可能定义不明确,因为 '(' 可能是多余的。更常见的情况是 number 个令牌是合法的延续:并且,由于 LALR(1) 解析器生成器的状态压缩操作,一旦你到达要点,并不总是可能实际枚举这些令牌问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多