8

当使用 Alex lexer 生成器或 Happy 解析器生成器创建 aLexer.x或解析器时,将它们编译成 Haskell 文件,并将它们编译成目标文件,默认情况下这将生成以下“警告”:Parser.y

$ ghc Lexer
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[1 of 1] Compiling Lexer            ( Lexer.hs, Lexer.o )
$ happy Parser.y
$ ghc Parser
line-map.c: file "<command-line>" left but not entered
line-map.c: file "<command-line>" left but not entered
[2 of 2] Compiling Parser           ( Parser.hs, Parser.o )

这些行是由于生成的.hs文件中嵌入了以下行而出现的:

{-# LINE 1 "<command-line>" #-}

为什么包括这些行,如果命令行显然没有用于生成的词法分析器和解析器中的任何内容,是否有办法抑制这些消息?

4

1 回答 1

1

谷歌搜索“left but not enter”表明这样的消息表明配置错误gcc。这是生成消息的 Apple 版本中的代码:

void
linemap_check_files_exited (struct line_maps *set)
{
  struct line_map *map;
  /* Depending upon whether we are handling preprocessed input or
     not, this can be a user error or an ICE.  */
  for (map = &set->maps[set->used - 1]; ! MAIN_FILE_P (map);
       map = INCLUDED_FROM (set, map))
    fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n",
         map->to_file);
}

(来自http://www.opensource.apple.com/source/gcc/gcc-5484/libcpp/line-map.c

这里的“ICE”指的是“内部编译器错误”。

插入 #LINE 指令以便 ghc 可以根据 .x 或 .y 文件中的位置报告错误。它说以下行实际上是来自另一个文件的某一行。#LINE 伪文件名指令可以忽略<command-line><built-in>因为它们总是紧跟一个真实文件名的#LINE 指令,例如:

...
{-# LINE 1 "<built-in>" #-}
{-# LINE 1 "<command-line>" #-}
{-# LINE 1 "templates/wrappers.hs" #-}
...
{-# LINE 1 "<built-in>" #-}
{-# LINE 1 "<command-line>" #-}
{-# LINE 1 "templates/GenericTemplate.hs" #-}
...

作为测试,您可以简单地删除 #LINE 指令<command-line>并查看警告是否消失。我还会尝试重新安装/升级您的 gcc 和/或 Haskell 平台。

于 2014-07-12T16:02:13.827 回答